Android的uid与UserHandle1.Linux uid/gidLinux下的用户id(uid)和群组id(gid)。Linux是多用户系统,每个用户都拥有一个uid,这个uid由系统和用户名做映射绑定。同时,为了便于用户管理(譬如管理文档权限),Linux引入了群组的概念,可以将多个用户归于一个群组。每一个群组拥有一个群组id(gid)。 root用户:Linux下的唯一的超级用户,拥有所有的系统权限。root用户所在的组即root组。2.Android uid(4.2(API Level 17)) Android4.2开始支持多用户。Linux的uid/gid多用户体系已经被用在App管理上。android重新开发了一套多用户体系,在UserManagerService中管理,PackageManagerService和ActivityManagerService中也有相关逻辑。Android的多用户可以做到不同用户的应用的物理文件级(数据)的区分,以实现不同用户有不同的壁纸、密码,以及不同的应用等。例如:在一个有两个用户(用户id分别为0和10)的安卓设备上,在用户10下安装一个应用,此时,在0下是看不到这个应用的。 从data/system/packages.xml查看此应用的uid:userId=”10078” Process.myUid()得到uid为”1010078” Process.myUserHandle()得到”userHandle{10}” 在另一个用户0下安装此应用。 查看packages.xml,看到uid没有变化10078 Process.myUid()得到uid为”10078” Process.myUserHandle()得到”userHandle{0}”adb shell进入命令行,分别查看data/user/0和data/user/10下面此应用的数据区: 用户0: 这里写图片描述 用户10: 这里写图片描述 可以看到,实际上应用在内部虽然有多用户,但只有一个uid,在不同的用户下,通过uid和用户id合成一个新的uid,以保证在每个用户下能够区分(見chapter3)。 (可以看到文件拥有者是u0_a78,所在群组为u0_a78。从data/system/packages.xml根据包名查看此应用信息,可以看到:userId=”10078”。)3.android.os.UserHandle这个类对外提供有关多用户的接口。 从里面的一些api代码可以看到uid在多用户下的处理逻辑: 多用户支持开关: 注意一个api getUid()。这就清楚了,将用户id 10作为第一个参数,packages.xml中记录的该应用的uid 10078作为第二个参数传入,得到了这个应用在10用户下的uid——1010078! 这里写图片描述 这里写图片描述 通过应用的uid得到当前用户的userId,以上过程的逆过程: 这里写图片描述 从另一个核心的api myUserId()更能清楚地看到应用uid和用户id的关系: 这里写图片描述 当一个应用使用UserHandle.myUserId()来获取当前的用户id的时候,其实就是从他自己的进程得到应用的uid,然后通过上述逻辑计算出当前的用户id。 从Process.myUserHandle()也能清楚地看到这个逻辑: 这里写图片描述从概念和API命名上,确实有些混乱,但Android也情非得已,Process的API Level是1,UserHandle的API Level是17,可见在最初的android上面,已经将Linux uid/gid给了应用id了,当时应该也没有考虑android有一天需要支持多用户。直到4.2(API Level 17),引入了多用户时,已经是若干年过去了,Process已经被无数的开发者使用,无法改变。只能接受这个概念上混淆了。 可以用如下的几点来简单地澄清这些id概念: (1)Process中的xxid相关的概念和API是关于应用id的。 (2)UserHandle中的xxid相关的概念和API是关于Android用户id的。 (3)Process有接口得到UserHandle实例。

 

更多相关文章

  1. android应用程序签名
  2. Android(安卓)PK ios,是谁胜谁负
  3. Android应用程序的权限机制
  4. 快乐周末:典型的 Android(安卓)用户是穿T恤和牛仔裤的书呆子?
  5. Android(安卓)ANR
  6. android中实现内容搜索
  7. 自编Win8风格Android音乐播放器应用源码(单机版)
  8. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Fedora镜像
  9. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像

随机推荐

  1. Android(安卓)强制设置应用横屏或竖屏
  2. Android(安卓)剪切板操作
  3. Android之去掉ListView的点击背景
  4. TextView
  5. 申请google Map api key for android
  6. android ndk-stack调试
  7. android监听网络变化
  8. Android(安卓)ERR_CLEARTEXT_NOT_PERMITT
  9. 一个读取android根目录下的文件夹或文件
  10. 1.5 Android(安卓)入门实例 后台循环发短