比较几种ID:UserHandle、AppID、UserID、UID、PID
在Android开发中,经常会遇到一些与ID相关的概念,如UID、UserID、AppID、PID和UserHandle。这些概念虽然听起来相似,但实际上是不同的。
本文将详细介绍这些概念的定义、作用以及示例代码,以理解它们之间的区别。
1、UserHandle
UserHandle是每个用户在系统中唯一的标识符,用于区分不同用户。每个用户都有一个独特的UserHandle值。在Android开发中,可以使用以下代码获取当前应用程序的UserHandle:
val userHandle: UserHandle = android.os.Process.myUserHandle()
通过UserHandle可以反射获取到UserId和UID。
2、AppID
AppID是每个应用程序在系统中唯一的标识符,用于区分不同应用程序。每个应用程序都有一个独特的AppID值。
/**
* Returns the app id (or base uid) for a given uid, stripping out the user id from it.
* @hide
*/
@SystemApi
public static @AppIdInt int getAppId(int uid) {
return uid % PER_USER_RANGE;
}
3、UserID
系统中会有多个用户 (User,即手机里的主机、访客等多用户), 每个用户也有一个唯一的ID值, 称为UserId。
/**
* Returns the user id for a given uid.
* @hide
*/
@UnsupportedAppUsage
@TestApi
public static @UserIdInt int getUserId(int uid) {
if (MU_ENABLED) {
return uid / PER_USER_RANGE;
} else {
return UserHandle.USER_SYSTEM;
}
}
4、UID(User ID)
UID是每个用户在系统中唯一的标识符,用于区分不同用户。每个用户都有一个独特的UID值。例如,在Linux系统中,UID通常由数字表示,如1000、2000等。
有了appID和UserID之后,就可以通过组合它们来生成新的UID。
/**
* Returns the uid that is composed from the userId and the appId.
* @hide
*/
@UnsupportedAppUsage
@TestApi
public static int getUid(@UserIdInt int userId, @AppIdInt int appId) {
if (MU_ENABLED && appId >= 0) {
return userId * PER_USER_RANGE + (appId % PER_USER_RANGE);
} else {
return appId;
}
}
但是有两种情况:
①如果默认不创建多个用户时:
UserID = 0
uid = appID
②创建多用户时:
UserID = 10
uid = UserID * 100000 + appID
还可以使用以下代码获取当前应用程序的UID:
val uid = android.os.Process.myUid()
5、PID(Process ID)
PID是每个进程在系统中唯一的标识符,用于区分不同进程。每个进程都有一个独特的PID值。进程中止后PID被系统回收,可能会被继续分配给新运行的程序。但是在Android系统中一般不会把已经kill掉的进程ID重新分配给新的进程,新产生进程的进程号,一般比产生之前所有的进程号都要大。可以使用以下代码获取当前应用程序的PID:
val pid = android.os.Process.myPid()
上面介绍了UserHandle、AppID、UserID、UID、PID这五个概念,提供示例代码。这些概念虽然听起来相似,但实际上是不同的,用于区分不同用户或进程。在Android开发中,可以使用这些概念来获取当前应用程序的相关信息。