车机使用MTK版本的Android 13 Automotive,发现启动侯默认启动两个用户,导致系统处理事件出现异常。原因是Automotive使用了无头系统用户。
Automotive 用户类型
值得注意的是,除了上面列出的用户类型之外,Automotive 版本还包含以下类型的用户:
- 无头系统用户:此类系统用户负责托管所有系统服务。 如需在 Automotive 中支持多用户,系统用户也必须是无头用户。 只有一个无头用户。无头系统用户应遵守以下要求:
- 必须始终在后台运行。
- 无法直接由用户移除或访问,除非是在“设备配置”的情况下。例如,用户无法切换到这种用户类型来执行下载应用或添加账号等任务。
- 只能通过恢复出厂设置清除。
- 常规用户:与上文所述的次要用户相同,不过次要用户具有以下特点:
- 不会在后台运行(在切换成其他用户之后)。
- 可通过界面直接创建。
- 具有独立的应用数据,但会共享一些系统范围内的设置。例如,WLAN 和蓝牙。
启用无头用户后:
- 如需将设备声明为 Automotive,请添加
android.hardware.type.automotive
功能。 - 将
ro.fw.headless_system_user
设为true
。 - 将
config_multiuserMaximumUsers
的值设为2
(或更高的值)。
开机后首先启动一个无头用户,然后Carservice启动一个司机用户。
解决办法,不启动无头用户,然后取消Carservice启动一个司机用户
frameworks/opt/car/services/+/3271/1/builtInServices/src/com/android/internal/car/CarServiceHelperService.java
@Override
public void onBootPhase(int phase) {
EventLogHelper.writeCarHelperBootPhase(phase);
if (DBG) Slogf.d(TAG, "onBootPhase: %d", phase);
TimingsTraceAndSlog t = newTimingsTraceAndSlog();
if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) {
t.traceBegin("onBootPhase.3pApps");
mCarLaunchParamsModifier.init();
// setupAndStartUsers(t);
t.traceEnd();
} else if (phase == SystemService.PHASE_BOOT_COMPLETED) {
t.traceBegin("onBootPhase.completed");
synchronized (mLock) {
mSystemBootCompleted = true;
}
try {
mCarWatchdogDaemonHelper.notifySystemStateChange(
StateType.BOOT_PHASE, phase, /* arg2= */ 0);
} catch (RemoteException | RuntimeException e) {
Slogf.w(TAG, "Failed to notify boot phase change: %s", e);
}
t.traceEnd();
}
}
注释掉方法setupAndStartUsers(t)
# Enable headless system user mode
PRODUCT_SYSTEM_DEFAULT_PROPERTIES += \
ro.fw.mu.headless_system_user?=false
ro.fw.mu.headless_system_user 置为false