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

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

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

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w