Android下uid与多用户释疑(二)

Android下uid与多用户释疑(二),第1张

概述原文链接:https://blog.csdn.net/zhanglianyu00/article/details/502384473.Android多用户Android4.2开始支持多用户。Linux的uid/gid多用户体系已经被用在App管理上了,所以android重新开发了一套多用户体系,在UserManagerService中管理,Packag 原文链接:https://blog.csdn.net/zhanglianyu00/article/details/50238447

3.AndroID多用户
AndroID4.2开始支持多用户。linux的uID/gID多用户体系已经被用在App管理上了,所以androID重新开发了一套多用户体系,在UserManagerService中管理,PackageManagerService和ActivityManagerService中也有相关逻辑。AndroID的多用户可以做到不同用户的应用的物理文件级(数据)的区分,以实现不同用户有不同的壁纸、密码,以及不同的应用等。本文不展开多用户的机制,只集中于uID。
先看一下在多用户下,应用的uID怎么变化。
在一个有两个用户(用户ID分别为0和10)的安卓设备上,在用户10下安装一个应用,此时,在0下是看不到这个应用的。
从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,以保证在每个用户下能够区分。
androID.os.UserHandle这个类对外提供有关多用户的接口。
从里面的一些API代码可以看到uID在多用户下的处理逻辑:
多用户支持开关:

@H_301_38@


注意一个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实例。
注:以上源代码AndroID版本为4.4.4。

总结

以上是内存溢出为你收集整理的Android下uid与多用户释疑(二)全部内容,希望文章能够帮你解决Android下uid与多用户释疑(二)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1103225.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存