开机黑屏问题调查
前言
在讲述开机黑屏问题前,我们先了解一个概念
1. "直接启动"模式
是什么?
当设备已开机但用户尚未解锁设备时,Android 7.0 将在安全的“直接启动”模式下运行。为支持此模式,系统为数据提供了两个存储位置:
- 凭据加密存储,这是默认存储位置,仅在用户解锁设备后可用。
- 设备加密存储,该存储位置在“直接启动”模式下和用户解锁设备后均可使用。
默认情况下,应用不会在“直接启动”模式下运行。如果您的应用需要在“直接启动”模式下执行操作,您可以注册应在此模式下运行的应用组件。需要在“直接启动”模式下运行的一些常见应用用例包括: - 已安排通知的应用,如闹钟应用。
- 提供重要用户通知的应用,如短信应用。
- 提供无障碍服务的应用,如 Talkback。
如果应用在“直接启动”模式下运行时需要访问数据,请使用设备加密存储。设备加密存储包含使用密钥加密的数据,该密钥只有在设备成功执行启动时验证后才可用。
对于应使用与用户凭据(如 PIN 码或密码)关联的密钥加密的数据,请使用凭据加密存储。凭据加密存储仅在用户成功解锁设备后可用,直到用户再次重启设备。如果用户在解锁设备后启用锁定屏幕,则不会锁定凭据加密存储。
问题描述
开机动画结束时,在进入Launcher之前有一段黑屏的时间,很影响用户体验.
问题分析
// 系统进入用户空间,标志着kernel启动完成
01-04 03:25:17.959 root 455 455 I boot_progress_start: 5670
// Zygote启动
01-04 03:25:18.744 root 455 455 I boot_progress_preload_start: 6456
// Zygote结束
01-04 03:25:20.256 root 455 455 I boot_progress_preload_end: 7968
// SystemServer ready,开始启动Android系统服务,如PMS,APMS等
01-04 03:25:20.491 1000 720 720 I boot_progress_system_run: 8203
// PMS开始扫描安装的应用
05-31 10:24:20.476 1000 720 720 I boot_progress_pms_start: 9981
// PMS先行扫描/system目录下的安装包
05-31 10:24:20.834 1000 720 720 I boot_progress_pms_system_scan_start: 10339
// PMS扫描/data目录下的安装包
05-31 10:24:21.722 1000 720 720 I boot_progress_pms_data_scan_start: 11227
// PMS扫描结束
05-31 10:24:21.729 1000 720 720 I boot_progress_pms_scan_end: 11234
// PMS就绪
05-31 10:24:22.091 1000 720 720 I boot_progress_pms_ready: 11596
// AMS就绪
05-31 10:24:23.948 1000 720 720 I boot_progress_ams_ready: 13452
--------------------------------------------------------------------------
// AMS启动完成后开始激活屏幕,从此以后屏幕才能响应用户的触摸
05-31 10:24:25.022 1000 720 1049 I boot_progress_enable_screen: 14526
----------------------------------需要优化下开机动画的衔接------------------------------------------
// 设置service.bootanim.exit属性值为1,标志系统要结束开机动画了,可以用来跟踪开机动画结尾部分消耗的时间
05-31 10:24:31.830 1000 642 1122 I sf_stop_bootanim: 19535
// 开机动画结束,这一步用户能直观感受到开机结束
05-31 10:24:31.832 1000 720 1104 I wm_boot_animation_done: 19537
-------------------------------------------------------------------------
// fallbackhome 拉起
05-31 10:24:24.904 1000 1910 1910 I am_on_resume_called: [0,com.android.settings.FallbackHome,LAUNCH_ACTIVITY]
黑10s................
-------------------------这个activity 启动耗时太长了,需要Launcher去解决-------------------------------------
// Launcher activity 创建
05-31 10:24:32.912 1000 720 746 I am_create_activity: [0,149459167,49,com.qinggan.app.launcher/.activity.HomeActivity,android.intent.action.MAIN,NULL,NULL,268435712]
// Launcher onCreate---> onResume
05-31 10:24:34.579 1000 2892 2892 I am_on_resume_called: [0,com.qinggan.app.launcher.activity.HomeActivity,LAUNCH_ACTIVITY]
// 这个速度确实有点慢
05-31 10:24:38.366 1000 720 1104 I am_activity_launch_time: [0,149459167,com.qinggan.app.launcher/.activity.HomeActivity,5431,5431]
解决方案
- 按照正常的逻辑推理,我们理论上可以让Launcher提前显示出来,盖住之前的黑屏,但试验结果是不可行的,Launcher依赖的很多模块并没有ready,强行拉起会引起其他问题.
目前采用方案 - 延迟开机动画盖住黑的时间,Launcher启用windowDisablePreview