启动类型
根据官方文档 App startup time https://developer.android.com/topic/performance/vitals/launch-time 描述启动速度分为下面三种类型。
冷启动
经历创建进程、创建 Application,然后启动 MainActivity过程。在完成首帧绘制前, 屏幕会显示一个基于主题的空白背景,首帧绘制完成后,系统会将当前展示的空白背景替换为“MainActivity”的布局。然后用户就可以看到App布局界面了。有以下两点比较重要:
- 点击Launcher上的应用图标后,首先出现的是系统绘制的window的默认背景,所以启动屏的默认背景是一个需要优化的点.
- 首帧的绘制时机大概是onWindowFocusChanged方法回调的时候,Activity的onCreate()、onResume() 等生命周期回掉时,view的布局和绘制都还没有开始,此时耗时操作做异步处理很可能造成负优化(线程切换增加耗时,实际上没有延时的效果),最好是在首帧绘制完成的前后异步处理耗时的逻辑。
热启动
后台已有该应用的进程,不需要重新创建Application,这时会从已有的进程来启动Activity。如同冷启动,在这个过程中, 屏幕会显示一个基于主题空白的窗口, 直至Activity渲染完毕。
温启动
温启动的常见场景如下
- 用户back退出了App,然后又启动, App进程可能还在运行, 但是activity需要重建.
- 用户退出App后,系统可能由于内存原因将App杀死,进程和activity都需要重启, 但是可以在onCreate中将被动杀死锁保存的状态(saved instance state)恢复.
启动时间统计
本地查看
通过 adb 命令查看
从点击应用的启动图标开始创建出一个新的进程直到我们看到了界面的第一帧,这段时间就是应用的启动时间。测量这段时间可以通过adb shell命令的方式进行测量,这种方法测量的最为精确,命令为:adb shell am start -W [packageName]/[packageName.MainActivity]
adb shell am start -W com.moji.mjweather/com.moji.mjweather.MainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.moji.mjweather/.MainActivity }
Status: ok
Activity: com.moji.mjweather