2025年梳理uid、userid及UserHandle概念

梳理uid、userid及UserHandle概念在 Android 4 2 之前 Android 不支持多用户 在 4 2 以后 Android 系统增加了自己的多用户功能 Android 是基于 Linux 的 OS Linux 下有一套自己的账户管理体系 而 Android 在 Linux 的基础上有一些封装和改动 在加入了多用户之后 常在源码中看到 UserHandle userid

大家好,我是讯享网,很高兴认识大家。

在Android 4.2之前,Android不支持多用户,在4.2以后Android系统增加了自己的多用户功能。Android是基于Linux的OS,Linux下有一套自己的账户管理体系,而Android在Linux的基础上有一些封装和改动。

在加入了多用户之后,常在源码中看到UserHandle、userid、uid这些概念,一时间让我有些混乱,这里我就来梳理一下,算是做一次记录。

UID

Linux uid
Linux是多用户系统,每个用户都拥有一个uid,这个uid由系统和用户名做映射绑定。同时,为了便于用户管理(譬如管理文档权限),Linux引入了群组的概念,可以将多个用户归于一个群组。每一个群组拥有一个群组id(gid)。

Android uid
Android的应用的UID是从10000开始,到19999结束,可以在Process.java中查看到(FIRST_APPLICATION_UID和LAST_APPLICATION_UID),使用adb shell的ps命令查看到的pid,例如 u0_a后面的数字就是该应用的UID值减去FIRST_APPLICATION_UID所得的值。

android\os\Process.java


讯享网

 / * Defines the start of a range of UIDs (and GIDs), going from this * number to {@link #LAST_APPLICATION_UID} that are reserved for assigning * to applications. */ public static final int FIRST_APPLICATION_UID = 10000; / * Last of application-specific UIDs starting at * {@link #FIRST_APPLICATION_UID}. */ public static final int LAST_APPLICATION_UID = 19999; 

讯享网

应用安装后,系统重启和应用重启都不会改变uid。
uid记录在data/system/packages.xml中。可以dumpsys出来看看。

讯享网127|sagit:/ $ dumpsys package com.android.systemui | grep "uid" uid=0 gids=null type=0 prot=signature uid=1000 gids=null type=0 prot=signature uid=1000 gids=null type=0 prot=signature sharedUser=SharedUserSetting{61f83ce android.uid.system/1000} SharedUser [android.uid.system] (61f83ce): 

UserHandle

public final class UserHandle implements Parcelable { ... / * Returns the user id for a given uid. * @hide */ public static @UserIdInt int getUserId(int uid) { if (MU_ENABLED) { return uid / PER_USER_RANGE; } else { return UserHandle.USER_SYSTEM; } } / @hide */ public static @UserIdInt int getCallingUserId() { return getUserId(Binder.getCallingUid()); } / @hide */ public static @AppIdInt int getCallingAppId() { return getAppId(Binder.getCallingUid()); } ... } 

通过源码可以看到,UserHandle包含三种概念:userid、uid、appid
userid:就是有多少个实际的用户,即手机里的主机、访客等多用户。
uid:上文讲过他跟应用进程相关,除了shareduid的应用,每个用户的每个应用的uid不一样的。
appid:跟app相关,包名相同的appid都一样,即使是不同用户。



作者:汪和呆喵
链接:https://www.jianshu.com/p/0b60331efe07
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

小讯
上一篇 2025-01-11 14:32
下一篇 2025-04-05 15:50

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/48430.html