前言
事件发生在发包上线的前两天,在某某云进行移动测试时,提示冷启动速度低于平均值的问题,之前自己也曾尝试过优化,但是发现效果并不是很明显,作为一个有追求的开发者,趁着有点空闲时间,要好好研究一下冷启动优化问题。
App的启动流程
我们可以了解一下官方文档《App startup time》对App启动的描述。应用启动分为冷启动、热启动、温启动。而冷启动是应用程序从零开始,里面涉及到更复杂的知识。我们这次主要是对应用的冷启动进行分析和优化。应用在冷启动的时候,需要执行下面三个任务:
- 加载和启动应用程序;
- App启动之后立即展示出一个空白的启动窗口;
- 创建App程序的进程;
在这三个任务执行后,系统创建了应用进程,那么应用进程会执行下一步:
- 创建App对象;
- 启动Main Thread;
- 创建启动页的Activity;
- 加载View;
- 布置屏幕;
- 进行初始绘制;
当应用进程完成初始绘制之后,系统进程用启动页的Activity来替换当前显示的背景窗口,这个时刻用户就可以使用App了。下图显示为系统和应用程序的工作流程。
从上图和上述的步骤我们可以知道,应用进程的创建,那么它肯定会执行我们的Application的生命周期,当创建完成App的应用进程之后,主线程会初始化我们第一个页面MainActivity与执行MainActivity的生命周期。我特意加粗了重点,这就是我们可以下手优化的部分。在分析如何优化前,我们可以先了解一下,我们的应用是不是需要对冷启动进行优化。
PS:其实这些都是我们表面看到的东西,如果我们需要完整地去深究,我们要去具体分析Zygote Fork进程、ActivityManagerService源码等,我们就不在该篇中详述,给大家推荐相关书籍,有罗升阳的《Android系统源代码情景分析》,刘望舒的《Android进阶解密》。
启动时间检测
那么启动时间多少才是合适呢?在官方文档中描述到当冷启动在5秒或者更长的时,Android vitals就会认为你的应用需要进行冷启动相关的优化。不过Android vitals是针对Google Play的一款应用质量检测工具,那大家都明白,不过你可以像我一样使用阿里云的移动测试,阿里云提供的数据中,冷启动的行业指标中位数是4875.67ms,大家可以酌情对比一下。好了,下面我们就聊一下如果检测出我们应用的冷启动时间。
Displayed Time
如上图一显示的Displayed Time,在Android 4.4(API级别19)及更高版本中,logcat包含一个名为Displayed的log信息,此值表示启动过程和完成在屏幕上绘制相应活动之间所经过的时间量。
ADB命令
adb shell am start -W [pa