427 字
2 分钟
Android UID

UID#

Linux会为每个用户分配一个uid, 可以用id命令查看:

$ id
uid=501(sea) gid=20(staff) groups=20(staff)...

root用户uid=0

而在Android系统中, 默认情况下,Android会为新安装应用分配uid, 范围[10000, 19999], 称之为appid

通过在manifest文件中指定android:sharedUserId=""可以更改此行为, 使用相同sharedUserId的应用需要使用相同的签名, 使用相同sharedUserId的应用之间可以直接访问数据, 甚至在同一进程中运行.

支持多用户后, Android的uid由两部分组成:

uid = userid * 100_000 + appid

使用ps查看进程, 可以看到用户名形如u0_a66

$ ps -ef
u0_a66       11391   484 0 11:37:58 ?     00:00:00 com.android.camera
...

则该进程userid为0, appid为10066, uid为0 * 100_000 + 10066 = 10066

编程中使用android.os.Process.myUid()可以获取当前uid

UserHandle#

UserHandle为对userid的封装。

使用android.os.Process.myUserHandle()可以获取当前UserHandle

UserHandle中包含一些对uid进行转换的方法:

public static @UserIdInt int getUserId(int uid) // uid2userid

public static @AppIdInt int getAppId(int uid) // uid2appid

public static int getUid(@UserIdInt int userId, @AppIdInt int appId) // (userid+appid)2uid

UserHandle中包含一些预定义的userid:

public static final @UserIdInt int USER_ALL = -1;  // 全部用户

public static final @UserIdInt int USER_CURRENT = -2;  // 当前用户

public static final @UserIdInt int USER_CURRENT_OR_SELF = -3;  // 当前用户或当前应用用户

public static final @UserIdInt int USER_NULL = -10000;  // 未定义

public static final @UserIdInt int USER_OWNER = 0;  // 系统默认用户, 已弃用

public static final @UserIdInt int USER_SYSTEM = 0;  // 系统默认用户

UID System (uid=1000)#

使用ps查看进程时, 可以看到名为system的用户:

$ ps -ef
system       19724   484 0 17:53:31 ?     00:06:57 com.android.settings:remote
...

该用户uid为1000, 开发系统应用时, 指定android:sharedUserId="android.uid.system", 并使用系统签名, 可以直接访问系统应用数据.

Android UID
https://shsuco.com/posts/android-uid/
作者
shsuco
发布于
2022-07-19
许可协议
CC BY-NC-SA 4.0