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

Quibbler 1月前 170

比较几种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可以反射获取到UserIdUID


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等。

        有了appIDUserID之后,就可以通过组合它们来生成新的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、AppIDUserIDUIDPID这五个概念,提供示例代码。这些概念虽然听起来相似,但实际上是不同的,用于区分不同用户或进程。在Android开发中,可以使用这些概念来获取当前应用程序的相关信息。

        

不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com