比较几种ID:UserHandle、AppID、UserID、UID、PID

QuibblerQuibbler 2024-12-06 约 6 分钟 3247 次阅读

比较几种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开发中,可以使用这些概念来获取当前应用程序的相关信息。

相关推荐