安卓的开机动画和FallbackHome机制

原生逻辑

安卓开机动画结束后,在启动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"

相关推荐
阿巴斯甜19 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker19 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952720 小时前
Andorid Google 登录接入文档
android
黄林晴21 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇2 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android