Android中的UID和AppId
本篇博客主要记录一下Android中UID的含义,并简单分析应用appId的分配流程。
1、UID
Android是支持多用户的操作系统,其中进程对应的UID由用户ID和应用ID共同决定。
我们来看看UserHandle.java的代码:
public static int getUid(@UserIdInt int userId, @AppIdInt int appId) {//支持多用户时if (MU_ENABLED) {//userId * 100000 + (appId % 100000)return userId * PER_USER_RANGE + (appId % PER_USER_RANGE);} else {return appId;}}
在android手机上,我们利用adb shell执行ps命令后,可以看到如下信息:
从图中可以看出,其中第一项将显示进程对应的UID。
这里截取的两个进程为root组的,没有分配具体的编号。
对于用户组的进程来说,如上图所示,会显示类似于u0_a86这样的UID。
这个UID的前一部分表示userId,后一部分表示appId(减去Process.FIRST_APPLICATION_UID的结果)。
一个进程的appId是固定的,在初始化或安装的时候就决定了。
因此,同一个进程在不同用户下,只有userId不一样。
例如,上图中的进程在另一个用户下,对应的UID就类似于:
u10_a86
u10_a54
2、appId
现在我们来看看进程的appId是何时分配的。
以Android 8.0的代码为例,我们看看PKMS中的函数:
//初始化扫描已安装应用,或安装新应用时,都会调用到该函数private PackageParser.Package scanPackageDirtyLI(PackageParser.Package pkg,final int policyFlags, final int scanFlags, long currentTime, @Nullable UserHandle user)throws PackageManagerException {.............synchronized (mPackages) {//如果pkg有sharedUserId,那么getSharedUserLPw中会分配appIdif (pkg.mSharedUserId != null) {suid = mSettings.getSharedUserLPw(pkg.mSharedUserId, 0 /*pkgFlags*/, 0 /*pkgPrivateFlags*/, true /*create*/);}......//刚初始化时或安装时,pkgSetting应该为nullpkgSetting = mSettings.getPackageLPr(pkg.packageName);......if (pkgSetting == null) {............//利用解析的信息,创建出pkgSettingpkgSetting = Settings.createNewSetting(......);............//这里也会分配appIdmSettings.addUserToSettingLPw(pkgSetting);} else {............}}.............}
我们以Settings.java中的addUserToSettingLPw为例,跟进一下分配appId的流程:
void addUserToSettingLPw(PackageSetting p) throws PackageManagerException {if (p.appId == 0) {// Assign new user ID// 注意此处赋值给p.appIdp.appId = newUserIdLPw(p);} else {// Add new setting to list of user IDsaddUserIdLPw(p.appId, p, p.name);}............}
容易看出分配appId的函数为newUserIdLPw:
private int newUserIdLPw(Object obj) {// Let's be stupidly inefficient for now...final int N = mUserIds.size();//从0开始,找到第一个未使用的id//此处对应之前有应用被移除等情况,复用之前的idfor (int i = mFirstAvailableUid; i < N; i++) {if (mUserIds.get(i) == null) {mUserIds.set(i, obj);//FIRST_APPLICATION_UID的值为10000return Process.FIRST_APPLICATION_UID + i;}}// None left?//N > 9999//安装应用过多时,就返回-1if (N > (Process.LAST_APPLICATION_UID-Process.FIRST_APPLICATION_UID)) {return -1;}//此处对应新分配一个递增的id的情况mUserIds.add(obj);return Process.FIRST_APPLICATION_UID + N;}
Android中的UID和AppId相关推荐
- 【Android安全】Android中的应用沙箱和UID | Android多用户
Android中的应用沙箱和UID 参考: <Android安全架构深究(美)NIKOLAY ELENKOV> Linux 用户和用户组管理: https://www.runoob.com ...
- Android中UID、GID和PID的讲解
一.概述 在实际的开发中经常会碰到各种ID,这是由于在计算机的发展过程中,需要对程序执行的每一步做标记,通过这些标记的关联便于系统的统一管理.像PID.UID.GID.和EUID等,其实对于这些ID不 ...
- 学习转载:Android中常用shell命令详解
https://blog.csdn.net/Z_HUALIN/article/details/77878609 设置adb环境变量 其实就是将adb.exe的路径放到Path中,目的是cmd直接可以使 ...
- Android Uid,UserId,AppId,Pid
Android Uid,UserId,AppId,Pid 1.Uid 1.1.Uid来源(android 9.0) 1.2.查看Uid 2.UserId 3.AppId 4.Pid 1.Uid and ...
- ANDROID 中UID与PID的作用与区别
ANDROID 中UID与PID的作用与区别 PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统 ...
- Android中startActivity中的permission检测与UID机制
我们经常在一个activity中去start另一个activity,或者与另一个acitivity的结果进行交互(startActivityForResult).但有没有想过可能会出现的permiss ...
- Android中的PID,UID,TID
PID 指进程ID. PID是进程的身份标识,程序一旦运行,就会给应用分配一个独一无二的PID(ps:一个应用可能包含多个进程,每个进程有唯一的一个PID) 进程终止后PID会被系统收回,再次打开应用 ...
- Android中PID与UID的作用与区别
PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统回收,可能会被继续分配给新运行的程序,但是在a ...
- Android中的PID,TID和UID
pid 是process进程id , uid 是user 用户id: 如果你是root,那么你的uid就是0,0为最高权限: 可以通过pid找到这个进程的uid,没有试过通过Uid找到所有Pid,大家 ...
- java toast_详解Android中的Toast源码
Toast源码实现 Toast入口 我们在应用中使用Toast提示的时候,一般都是一行简单的代码调用,如下所示: [java] view plaincopyprint?在CODE上查看代码片派生 ...
最新文章
- unicode编码过php的magic_quotes_gpc设置为on的mysql注入与文件写入(待测试)
- Python Module_openpyxl_处理Excel表格
- webpack打包js文件
- Dalvik虚拟机的运行过程分析
- 数值分析(第五版) 第一章知识点总结
- 深度学习2.0-11.tensorflow的高阶操作之高阶op
- 大一计算机基础重点知识,2015-大一计算机基础知识点归纳.doc
- C4认证Java基础Excel练习题
- java use g1_深入理解 Java G1 垃圾收集器
- 微信小程序-音乐播放器总结
- SysML-Sec A model Driven Approach for Designing Safe and Secure Systems
- itop使用TF卡烧写uboot
- 创业者的心得:心有菩提手有刀,欲成舍利却成妖(转)
- 下载上市公司财报并可视化某科目
- DSN1COPY错误-SP映射页面错误
- 【问题解决】win服务器磁盘初始化
- [C#] 内存占用释放
- 20210323 美团后台开发实习一面(快驴)
- 台式机:喇叭+麦克风二合一转接头DIY
- C++ char类型