Android应用启动分为三种情况:
- 冷启动
- 暖启动
- 热启动
以上三种方式从上到下依次启动耗时会减少。接下来一一讲解
冷启动
冷启动会出现在系统启动后或应用被系统kill掉后,首次启动应用,冷启动包括三个大步骤:
- 启动APP,创建APP进程
- 创建主线程,渲染第一帧画面
- 将启动时创建的空白window替换为绘制好的activity,开始接受用户交互
每一步中执行的具体操作如下:
1. 启动APP,创建APP进程
- 加载和启动APP
- 显示一个空白的window
- 创建APP进程
2. 创建主线程,渲染第一帧画面
- 创建APP对象
- 启动主线程
- 创建MainActivity
- inflate页面的view
- 布局首屏
- 执行首次绘制
3. 使用上一步绘制完成的首屏替换第1步显示的空白window,开始接收用户的交互事件
热启动
热启动是耗时最少的启动方式,这种方式发生在应用进程退后台后,重新被用户唤起。此时内存中依旧保存着应用进程,因此系统只需要将应用进程从后台调至前台,无需做各种初始化、inflate、layout和渲染等等操作。
暖启动
暖启动的耗时介于以上两者之间,这种启动方式发生在以下可能情况:
- 用户退出应用后,系统依旧缓存这应用进程,没有回收,此时用户重新启动应用,此时无需再次创建进程,但依旧要创建activity,重走生命周期方法。
- 系统因内存紧张,回收了退居后台的原因进程,然后用户返回到该应用,此时应用需要重新创建进程和activity,但可以使用保留的数据对activity进行初始化。
启动耗时查看
- 冷启动耗时可以通过日志查看,在应用启动时,系统会打印一行名为 Displayed 的耗时日志,如下
ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms
以上便是应用启动到第一帧画面绘制完毕的耗时。
注意这是系统日志,不是应用日志,因此如果是在AS中查看,需要选这No Filters。
有时候会带有total,如下
ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms (total +1m22s643ms)
出现此种情况是因为启动时不只加载了一个activity,比如还有splash页,如上前一个时间是最后一个activity加载耗时,total是从启动到当前页加载完成耗时
- 可以使用adb命令查看
adb [-d|-e|-s <serialNumber>] shell am start -S -W
com.example.app/.MainActivity
-c android.intent.category.LAUNCHER
-a android.intent.action.MAIN
如上 -c -a可选,启动后会在终端输出如下时间:
Starting: Intent
Activity: com.example.app/.MainActivity
ThisTime: 2044
TotalTime: 2044
WaitTime: 2054
Complete
其中ThisTime表示最后一个activity启动耗时,TotalTime表示所有activity启动耗时,WaitTime是AMS启动activity的总耗时。通常情况下,三者的关系如下
ThisTime <= TotalTime <= WaitTime
更细化的耗时分析则需要使用工具进行分析,官方有给出相应的工具进行分析,如AS的Profiler、TraceView或者Systrace等等。