的值,其关联关系如下:
config_enableMultiUserUI = config_multiuserMaximumUsers>1
?true : false
那我们如何通过命令切换当前的用户以及查看系统的用户情况,
可以参考如下命令(
默认我们用的安卓版本都在8.0
以上)
:
指令 | 具体含义 |
adb shell am instrument --user | 针对特定用户构建测试,主要是在写测试case的过程中用到 |
adb install --user | 在特定用户下安装APK |
adb uninstall --user | 卸载指定用户下的APK |
adb shell am get-current-user | 获得当前用户ID |
adb shell pm list users | 罗列已经创建的所有用户 |
adb shell pm create-user | 创建新用户,并返回用户ID |
Android-Automotive的多用户基于安卓的常规多用户特性,不过具有自己的特性。Automotive支持以下三种用户类型:
Headless system user,直译为无头用户,意思是该系统用户持有所有系统服务,但不会跟使用者直接打交道,具有以下特性:
一个车载系统只有一个Headless system user;
Headlesssystem user必须运行于后台;
除了在开机向导的特殊情况,Headlesssystem user不会被使用者直接使用或者删除;
只可以被工厂擦除模式清楚。
不支持安卓多用户里面Profile的概念。
Regular users
,常规用户,
比如一个家庭一台车,有三个人使用,
每个人是一个常规用户
,可以在系统中进行创建。这个基本功能跟安卓的次要用户相同,具有以下特性:
不会再后台运行;
可通过界面创建,开机默认会创建一个;
默认具有通话和短信的权限,和独立的应用数据,但会共享热点,蓝牙等系统设置。
Guest User,访客用户,跟安卓一般访客用户基本相同, 临时创建,基本用于朋友借车等场景。
要想打开Android-Automotive的多用户功能,需要进行如下配置:
添加android.hardware.type.automotive的系统配置;
设置ro.fw.multiuser.headless_system_user为true;
设置config_multiuserMaximumUsers大于1。
以上就是车载多用户在系统层面的配置,下面我们具体从代码逻辑看。在安卓开机过程中,当启动到PHASE_THIRD_PARTY_APPS_CAN_START(600)时,CarServiceHelperService的onBootPhase函数会被SystemServer通过startBootPhase函数回调。而车载多用户的逻辑主要就集中在setupAndStartUsers函数里面。
在setupAndStartUsers首先会判断DevicePolicyManager 服务是否启动,这个代表automotive 期望的多用户的建立过程只会在开机过程中跑一次,如果在其他逻辑中初始化过多用户,那么就会直接返回。
如果是烧写镜像后第一次开机,默认是会进入到图片中所选的判断条件,这时我们会通过createNewAdminUser创建Automotive的第一个管理用户,这个是次要用户的类型,但具有管理权限。如果创建成功,就会获得用户id,而此时只有用户的基本信息,但没有在系统中运行起来。
在真正运行创建的次要用户前,
系统会先去解锁系统用户。unlockSystemUser
里面对系统用户的逻辑很多,
但主要的作用是调用的startUserInBackground
来启用的UserHandle.USER_SYSTEM
,这个操作就表示我们的无头系统用户在这里创建完成。
而我们前面创建的次要用户,会通过startUserInForegroundWithListener启动运行, 这表示该用户是运行于前台的。至此Android-Automotive的多用户系统的系统用户和次要用户都创建和启动完成, 至于最终系统的桌面系统是在哪个用户里面启动,大家可以顺着这个逻辑继续追踪下去,其实从前面的描述大家也可以猜的到系统用户只会运行系统级别的服务,次要用户才是真正跟使用者打交道的HMI,相关APK当然会是由次要用户启动。同时大家需要注意这是系统创建的第一个常规用户, 后面其他常规用户和访客用户都可以由它创建。而其他常规用户不一定具有管理权限,视管理者是否授权。
Android-Automotive
的多用户探索旅程到此告一段落,
希望大家通过该文章对车载多用户有一个架构方面的认知,
如有具体细节问题,
也欢迎反馈给号主。