在Android 4.2之前,Android不支持多用户,在4.2以后Android系统增加了自己的多用户功能。Android是基于Linux的OS,Linux下有一套自己的账户管理体系,而Android在Linux的基础上有一些封装和改动。

在加入了多用户之后,常在源码中看到UserHandle、userid、uid这些概念,一时间让我有些混乱,这里我就来梳理一下,算是做一次记录。

UID

Linux uid
Linux是多用户系统,每个用户都拥有一个uid,这个uid由系统和用户名做映射绑定。同时,为了便于用户管理(譬如管理文档权限),Linux引入了群组的概念,可以将多个用户归于一个群组。每一个群组拥有一个群组id(gid)。

Android uid
Android的应用的UID是从10000开始,到19999结束,可以在Process.java中查看到(FIRST_APPLICATION_UID和LAST_APPLICATION_UID),使用adb shell的ps命令查看到的pid,例如 u0_a后面的数字就是该应用的UID值减去FIRST_APPLICATION_UID所得的值。

android\os\Process.java

    /**     * Defines the start of a range of UIDs (and GIDs), going from this     * number to {@link #LAST_APPLICATION_UID} that are reserved for assigning     * to applications.     */    public static final int FIRST_APPLICATION_UID = 10000;    /**     * Last of application-specific UIDs starting at     * {@link #FIRST_APPLICATION_UID}.     */    public static final int LAST_APPLICATION_UID = 19999;

应用安装后,系统重启和应用重启都不会改变uid。
uid记录在data/system/packages.xml中。可以dumpsys出来看看。

127|sagit:/ $ dumpsys package com.android.systemui | grep "uid"    uid=0 gids=null type=0 prot=signature    uid=1000 gids=null type=0 prot=signature    uid=1000 gids=null type=0 prot=signature    sharedUser=SharedUserSetting{61f83ce android.uid.system/1000}  SharedUser [android.uid.system] (61f83ce):

UserHandle

public final class UserHandle implements Parcelable {...    /**     * Returns the user id for a given uid.     * @hide     */    public static @UserIdInt int getUserId(int uid) {        if (MU_ENABLED) {            return uid / PER_USER_RANGE;        } else {            return UserHandle.USER_SYSTEM;        }    }    /** @hide */    public static @UserIdInt int getCallingUserId() {        return getUserId(Binder.getCallingUid());    }    /** @hide */    public static @AppIdInt int getCallingAppId() {        return getAppId(Binder.getCallingUid());    }...}

通过源码可以看到,UserHandle包含三种概念:userid、uid、appid
userid:就是有多少个实际的用户,即手机里的主机、访客等多用户。
uid:上文讲过他跟应用进程相关,除了shareduid的应用,每个用户的每个应用的uid不一样的。
appid:跟app相关,包名相同的appid都一样,即使是不同用户。

更多相关文章

  1. Android(安卓)Translucent System Bar 的最佳实践
  2. 关于android中的内部存储与外部存储
  3. Android系统的上下文对象Context
  4. 对Task和Activity在ANDROID中的解释
  5. 对Android系统权限的认识
  6. Android编译系统中的Kconfig,Makefile,.config编译系统浅析
  7. Qt on Android: Qt 5.3.0 发布,针对 Android(安卓)改进说明
  8. Android(安卓)系统字体规范与应用探索
  9. Android4.4系统源代码百度网盘下载

随机推荐

  1. android中APK开机自动运行
  2. Android重写SimpleCursorAdapter例子
  3. android中Notification的使用
  4. Android Studio出现Failed to open zip f
  5. Android四大组件——广播(BroadcastRecei
  6. Android 2.3 编译
  7. 修改Android 模拟器IMEI
  8. android组件
  9. Android 屏幕截图 代码
  10. Android触控屏幕Gesture(GestureDetector