Android多用户管理评估

时间:2024-04-14 11:35:39

转载请注明出处:https://blog.****.net/hsaekong/article/details/80306194

概述

最近接到老大安排的任务,评估一下android多用户管理在车载系统上的可行性,并提供评估报告,现把报告总结记录下,便于后期查询。

需求及产品应用

桌面系统早已提供多用户支持。很多家庭都是“多人共用一台电脑”,支持多用户的功能可谓不得不有。那么车载系统是否存在同样的问题?由于汽车的价格不菲,对于大部分车主及家庭而言,多人共开一辆汽车是再正常不过了。

Android 4.2中加入了多用户的支持,但是只在平板端适用,主要是因为在使用Android平板的时候,像邮件、即时聊天这些信息会被平板所接收,这没什么问题,切换了用户也就切换了这些网络工具的账号,推送是到达正确的方面。

技术分析

Android多用户相比windows等桌面系统还是有自己的一些特性,首先,第一个使用平板的用户默认为平板管理员,可以在平板设置选项的用户区添加或删除账号。网络设置和安装应用程序的权限在平板所有用户中通用和共享,但墙纸、主屏幕、锁屏布局、PIN码、屏幕明亮度、单个应用设置等则各不相同。跟Windows操作系统的不同之处在于,android系统的其他用户账户中正在运行的后台程序也会占用一定的RAM空间。而最明显的区别是用户之间的应用程序无法共享,这样一来想要用没付费的账户在同一台机器下载其他账户已经付费的内容时,需要在商店用已付费的账户密码重新登录,如果想要保护隐私的话就没办法跟其他用户共享付费软件。(多个账户重复下载同一应用时不会再存储空间里出现相同的两个应用,而是进行虚拟下载和安装,不用担心占用空间。)用户之间不能直接共享数据,即使将平板和电脑相连,也只能游览当前用户的文件,切换账号需要重新装载,虽说有些麻烦但是安全性得到了充分保证。

一、用户管理服务UserManagerService

1、在PackageManagerService服务的构造函数里初始化,其中mPackages参数为代表当前系统中已经安装的PKG。

Android多用户管理评估

2、UserManagerService构造函数解析

    a、创建默认用户"data/system/users/0"

    b、通过读取“data/system/users/userlist.xml”来获取所有用户,并通过从"/data/system/users/${id}.xml"文件中读取用户详细信息。

Android多用户管理评估

3、在ActivityManagerService的systemReady方法里会调用UserManagerService的systemReady方法。UserManagerService的systemReady的内容如下:

Android多用户管理评估

4、android系统开机后进入的都是用户id为0的默认管理员用户的,从ActivityManagerService构造函数就可以看出。

Android多用户管理评估

如果需要定制android系统开机后进入其他用户,则需要在此处进行代码定制,当然不只是修改此处,因为android开机时启动的很多进程都是依赖于用户的(比如应用声明为persistent属性的应用)对应的framework层也需要定制修改。

二、多用户的支持判断

系统判断当前设备是否支持多用户模式的依据是配置文件config.xml中的config_multiuserMaximumUsers配置项。其取值为整数,决定着当前设备支持的最大用户上限。默认值为1,即不支持多用户。代码的判断在UserManager.java

Android多用户管理评估

三、多用户的相关操作

对用户的操作目前未对普通应用开放,其相关API都有hide注解,并需要system权限。此外,用户的添加和移除还需添加android.Manifest.permission.Manage_USERS权限。

四、添加用户

UserManagerService中添加用户的方法是createUser()。

1、首先通过checkManagerUsersPermission方法来检查是否具有添加用户的权限。

Android多用户管理评估

2、判断是否达到用户上限及可用空间是否足够。

Android多用户管理评估

3、如果满足上述2条件,则会通过getNextAvailableIdLocked方法获取下个可用的用户ID,然后根据此ID来创建UserInfo对象,并新建“data/user/{ID}”目录来用于保存此用户的应用数据,并新建"data/system/users/{ID}"、“data/system/users/{ID}.xml”文件,其中{ID}.xml用于记录用户的详细信息,并把新建的用户添加到mUsers和userlist.xml中。

Android多用户管理评估

4、为当前新创建的用户创建应用数据目录及设置当前用户已安装可用的应用

Android多用户管理评估

接着会调用Settings类的createNewUserLILPW方法

Android多用户管理评估

5、PackageSetting类的setInstalled的方法时用于设置当前用户已经安装的应用。通过下述代码可知,目前是系统级应用才会在新创建的用户中设置为已安装的应用。目前我们的车联网等项目的导航等第三方应用都是以安装的形式放在data/app目录中,所有为了避免新建的用户中不能显示这些第三方应用,需要在此处进行代码定制修改。

Android多用户管理评估

遍历mPackages列表,把所有已安装的系统应用数据拷贝到新建用户对应目录下(data/user/{ID}/应用包名)

6、用户创建完成后会发送广播Intent.ACTION_USER_ADDED通知其他需要处理的应用

五、删除用户

首先会去检查是否具有相关的权限,然后通过Binder通讯调用ActivityManagerService的stopUser方法,待停止正在运行用户成功后会通过AIDL回调接口通知UserManagerService服务来删除用户相关应用信息。并发送Intent.ACTION_USER_REMOVED广播通知用户删除成功。

六、多用户管理

UserManagerService主要管理用户的账号信息,运行中的用户管理由ActivityManagerService来负责。用户的状态有5种,定义在UserState类中:

Android多用户管理评估

七、用户切换

通过调用ActivityManagerService的switchUser方法来切换用户。具体代码流程可参考https://blog.****.net/zhangyongfeiyong/article/details/77947206