Android UID 机制
2024-10-12 12:06:01
UID一般理解为User Identifier,在linux中就是用户的ID,表明是哪个用户运行了这个程序。它们主要用于权限的管理。
而在Android 中又有所不同,因为Android为单用户系统,这时UID 便被赋予了新的使命,android为每个应用几乎都分配了不同的UID,不像传统的linux,每个用户相同就为之分配相同的UID。这也表明Android只能是单用户系统,在设计之初就被他们的工程师删除了多用户功能,而使之成了数据共享的工具。
首先需要明确的一点是,App的UID是安装的时候确认的。而与安装相关的源码目录是:
frameworks\base\services\java\com\android\server\pm
PackageManagerService.java的scanPackageLI方法
private PackageParser.Package scanPackageLI(PackageParser.Package pkg,int parseFlags, int scanMode, long currentTime) { ............ //获取一系列属性 pkgSetting = mSettings.getPackageLPw(pkg, origPackage, realName, suid, destCodeFile, destResourceFile, pkg.applicationInfo.nativeLibraryDir, pkg.applicationInfo.flags, true, false); ............ //UID赋值 pkg.applicationInfo.uid = pkgSetting.appId; ............
可以看到在getPackageLPw方法中,获取了UID,那我们打开这个函数看看:
Settings.java的getPackageLPw方法
private PackageSetting getPackageLPw(String name, PackageSetting origPackage, String realName, SharedUserSetting sharedUser, File codePath, File resourcePath, String nativeLibraryPathString, int vc, int pkgFlags, boolean create, boolean add) { ......... s.userId = newUserIdLPw(s); ......... }
可以看到UID是newUserIdLPw()指定的,那再打开这个看看:
依然是Settings文件
private int newUserIdLPw(Object obj) { // Let's be stupidly inefficient for now... final int N = mUserIds.size(); for (int i = 0; i < N; i++) { if (mUserIds.get(i) == null) { mUserIds.set(i, obj); return Process.FIRST_APPLICATION_UID + i; } } // None left? if (N > (Process.LAST_APPLICATION_UID-Process.FIRST_APPLICATION_UID)) { return -1; } mUserIds.add(obj); return Process.FIRST_APPLICATION_UID + N; }
至此,UID就算是分配下来了。 可以看到for循环和if (mUserIds.get(i) == null)语句限定了一个APP只有一个UID,而这个Process.FIRST_APPLICATION_UID是在frameworks/base/core/java/android/os/Process.java中定义的,其值为10000,这就是为什么Android的UID都是从10000开始的。
最新文章
- BI项目记笔记索引
- C#反射在ADO中的巧用
- tomcat连接器
- CallerInformation
- 简易qq对话框
- Streaming replication slots in PostgreSQL 9.4
- js 对象toString()方法
- BUG: GetDC() ReleaseDC()引起的内存泄漏
- session 重写进入redis测试
- android中正确保存view的状态
- 异步编程设计模式Demo - AsyncComponentSample
- C# Struct结构体
- HDU 4430 &;amp; ZOJ 3665 Yukari&;#39;s Birthday(二分法+枚举)
- 6、Spring+Struts2+MyBatis(mybatis有代理)整合增删改查
- 请求转发 和 URL 重定向
- main函数
- 一个比较全面 的web项目实战学习
- 链接选项-rpath的一个问题记录
- Spring boot2.0 与 2.0以前版本 跨域配置的区别
- Python2.7-marshal