原生逻辑

安卓开机动画结束后,在启动Launcher之前会先启动FallbackHome,之后才会启动Launcher。
其中FallbackHome是属于Settings中的一个activity,Settings的android:directBootAware=true,并且FallbackHome在category中配置了Home属性,而Launcher的android:directBootAware为false,所以只有FallbackHome可以在direct boot模式下启动。
日志中有打印其调用链,始于systemReady,最终调用到startHomeOnTaskDisplayArea()
12-18 03:51:14.359 3710 3710 D PrintStack: at com.android.server.wm.RootWindowContainer.startHomeOnTaskDisplayArea(RootWindowContainer.java:1466)
12-18 03:51:14.359 3710 3710 D PrintStack: at com.android.server.wm.RootWindowContainer.resumeHomeActivity(RootWindowContainer.java:1647)
12-18 03:51:14.359 3710 3710 D PrintStack: at com.android.server.wm.Task.resumeNextFocusableActivityWhenRootTaskIsEmpty(Task.java:5484)
12-18 03:51:14.359 3710 3710 D PrintStack: at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:5434)
12-18 03:51:14.359 3710 3710 D PrintStack: at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5358)
12-18 03:51:14.359 3710 3710 D PrintStack: at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2766)
12-18 03:51:14.359 3710 3710 D PrintStack: at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2705)
12-18 03:51:14.359 3710 3710 D PrintStack: at com.android.server.wm.ActivityTaskManagerService$LocalService.resumeTopActivities(ActivityTaskManagerService.java:6854)
12-18 03:51:14.359 3710 3710 D PrintStack: at com.android.server.am.ActivityManagerService.systemReady(ActivityManagerService.java:9324)
12-18 03:51:14.359 3710 3710 D PrintStack: at com.android.server.SystemServer.startOtherServices(SystemServer.java:3399)
12-18 03:51:14.359 3710 3710 D PrintStack: at com.android.server.SystemServer.run(SystemServer.java:999)
12-18 03:51:14.359 3710 3710 D PrintStack: at com.android.server.SystemServer.main(SystemServer.java:700)


上面两张图是原生CarSetting的Manifest配置。
这里的startHomeOnTaskDisplayArea()会通过intent启动对应的应用,如果已经开机并解掉用户锁,此时会优先启动launcher,这是因为FallbackHome的priority是-900。
行 124845: 12-18 03:51:16.319 3710 5175 D ActivityManagerTiming: FinishBooting
行 125933: 12-18 03:51:16.434 3710 5567 I ActivityManager: User 10 state changed from BOOTING to RUNNING_LOCKED
行 128750: 12-18 03:51:16.809 3710 5175 D ActivityManager: Started unlocking user 0
行 131151: 12-18 03:51:17.019 3710 5175 D ActivityManager: Started unlocking user 10
行 131647: 12-18 03:51:17.116 3710 5148 I ActivityManager: User 0 state changed from RUNNING_LOCKED to RUNNING_UNLOCKING
行 134771: 12-18 03:51:17.314 3710 5567 I ActivityManager: Posting BOOT_COMPLETED user #0
行 142110: 12-18 03:51:18.311 3710 5148 I ActivityManager: User 10 state changed from RUNNING_LOCKED to RUNNING_UNLOCKING
行 166953: 12-18 03:51:21.749 3710 8966 I ActivityStarter: START u10 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.flyme.auto.launcher/.main.LauncherActivity (has extras)} with LAUNCH_SINGLE_TASK from uid 0 from pkg null (BAL_ALLOW_ALLOWLISTED_UID (Important callingUid)) result code=0
综上,出现FallbackHome界面的原因是,尝试启动Launcher时,客户的系统没有解锁。
直接启动(direct boot)
借助文件级加密,Android 7.0 中引入了一项称为直接启动的新功能。该功能处于启用状态时,已加密设备在启动后将直接进入锁定屏幕。之前,在使用全盘加密 (FDE) 的已加密设备上,用户在访问任何数据之前都需要先提供凭据,以致于手机只能执行最基本的操作。例如,手机甚至无法接听电话,只能执行基本的紧急拨号操作,而且闹钟无法运行,无障碍服务也不可用。
引入文件级加密 (FBE) 以及可以使应用实现加密感知的新 API 后,这些应用将能够在受限环境中运行。这意味着,应用可以在用户提供凭据之前运行,同时系统仍能保护私密用户信息。
在启用了 FBE 的设备上,每位用户均有两个可供应用使用的存储位置:
- 凭据加密 (CE) 存储空间,这是默认存储位置,只能在用户解锁设备后使用。
- 设备加密 (DE) 存储空间,该存储位置在直接启动模式下和用户解锁设备后均可使用。
可选的应对方案
1.等系统解锁之后,才退出开机动画。
2.优化开机时间,使退出开机动画时,系统已解锁完毕。
3.设置directAwareBoot(参考上面截图中的CarSetting的Manifest),提前启动Launcher。但此时Launcher以及Launcher相关模块均需要设置directAwareBoot(例如widget等功能)。如果有用到SharedPreference,还需设置android:defaultToDeviceProtectedStorage="true"