本篇博客主要记录一下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相关推荐

  1. 【Android安全】Android中的应用沙箱和UID | Android多用户

    Android中的应用沙箱和UID 参考: <Android安全架构深究(美)NIKOLAY ELENKOV> Linux 用户和用户组管理: https://www.runoob.com ...

  2. Android中UID、GID和PID的讲解

    一.概述 在实际的开发中经常会碰到各种ID,这是由于在计算机的发展过程中,需要对程序执行的每一步做标记,通过这些标记的关联便于系统的统一管理.像PID.UID.GID.和EUID等,其实对于这些ID不 ...

  3. 学习转载:Android中常用shell命令详解

    https://blog.csdn.net/Z_HUALIN/article/details/77878609 设置adb环境变量 其实就是将adb.exe的路径放到Path中,目的是cmd直接可以使 ...

  4. 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 ...

  5. ANDROID 中UID与PID的作用与区别

    ANDROID 中UID与PID的作用与区别 PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统 ...

  6. Android中startActivity中的permission检测与UID机制

    我们经常在一个activity中去start另一个activity,或者与另一个acitivity的结果进行交互(startActivityForResult).但有没有想过可能会出现的permiss ...

  7. Android中的PID,UID,TID

    PID 指进程ID. PID是进程的身份标识,程序一旦运行,就会给应用分配一个独一无二的PID(ps:一个应用可能包含多个进程,每个进程有唯一的一个PID) 进程终止后PID会被系统收回,再次打开应用 ...

  8. Android中PID与UID的作用与区别

    PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统回收,可能会被继续分配给新运行的程序,但是在a ...

  9. Android中的PID,TID和UID

    pid 是process进程id , uid 是user 用户id: 如果你是root,那么你的uid就是0,0为最高权限: 可以通过pid找到这个进程的uid,没有试过通过Uid找到所有Pid,大家 ...

  10. java toast_详解Android中的Toast源码

    Toast源码实现 Toast入口    我们在应用中使用Toast提示的时候,一般都是一行简单的代码调用,如下所示: [java] view plaincopyprint?在CODE上查看代码片派生 ...

最新文章

  1. unicode编码过php的magic_quotes_gpc设置为on的mysql注入与文件写入(待测试)
  2. Python Module_openpyxl_处理Excel表格
  3. webpack打包js文件
  4. Dalvik虚拟机的运行过程分析
  5. 数值分析(第五版) 第一章知识点总结
  6. 深度学习2.0-11.tensorflow的高阶操作之高阶op
  7. 大一计算机基础重点知识,2015-大一计算机基础知识点归纳.doc
  8. C4认证Java基础Excel练习题
  9. java use g1_深入理解 Java G1 垃圾收集器
  10. 微信小程序-音乐播放器总结
  11. SysML-Sec A model Driven Approach for Designing Safe and Secure Systems
  12. itop使用TF卡烧写uboot
  13. 创业者的心得:心有菩提手有刀,欲成舍利却成妖(转)
  14. 下载上市公司财报并可视化某科目
  15. DSN1COPY错误-SP映射页面错误
  16. 【问题解决】win服务器磁盘初始化
  17. [C#] 内存占用释放
  18. 20210323 美团后台开发实习一面(快驴)
  19. 台式机:喇叭+麦克风二合一转接头DIY
  20. C++ char类型

热门文章

  1. CSFB(电路域回落)与VoLTE(4G语音承载)
  2. 09-03 NOIP模拟测试36
  3. 32位与64位CPU字长
  4. Win10如何删除输入法(删除默认输入法)
  5. 技嘉B460M小雕板win2012 R2安装网卡驱动
  6. android上的壁纸软件,那些简约、精美、极致的安卓软件(APP) 篇四:这7个APP,满足你对壁纸所有的向往...
  7. my opencv voyage
  8. 从零开始内网渗透学习
  9. C语言牛顿迭代法求开平方
  10. python共存_多版本Python共存的配置方法