应用的启动速度对一个APP来说至关重要,会直接影响到用户体验,如果启动速度过慢会导致用户的流失,本文就启动速度优化分析,为优化启动速度提供一些思路。
1、应用启动分类
应用有三种启动状态,每种状态都会影响应用向用户显示所需的时间:冷启动、温启动和热启动。在冷启动中,应用从头开始启动。在另外两种状态中,系统需要将后台运行的应用带入前台。
1.1、冷启动
app冷启动可以分为两个阶段
第一阶段
1、加载并启动app
2、启动后立即显示一个空白的启动窗口
3、创建app进程
第二阶段
1、创建app对象
2、启动主线程
3、创建主Activity
4、加载布局
5、布置屏幕
6、首帧绘制
一旦应用进程完成首帧绘制,系统进程就会换掉当前显示的后台窗口,替换为主Activity。此时,用户可以开始使用应用
冷启动中,作为开发者,能干预的部分主要是Application的OnCreate阶段和Activity的onCreate阶段,如下图:
1.2、热启动
热启动时,系统将activity放到前台。如果应用程序的所有activity存在内存中,则应用程序可以避免重复对象初始化、渲染、绘制操作
1.3、温启动
温启动时,由于app的进程仍然存在,执行的是冷启动的第二阶段
1、创建app对象
2、启动主线程
3、创建主Activity
4、加载布局
5、布置屏幕
6、首帧绘制
温启动常见场景:
1、用户退出应用后又重启应用。进程可能继续运行。但应用从调用Activity的onCreate方法开始重新执行
2、内存不足,系统将应用杀死,然后用户重新启动。进程和Activity需要重启,但传递到onCreate的已保存的实例bundle对于完成启动有一定帮助
接下来来看下如何获得启动时间~
2、获取启动时间
2.1、使用adb命令获取
adb shell am start -W [packageName]/[packageName.xxActivity]
adb shell am start -W com.tg.test.gp/com.test.demo.MainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tg.test.gp/com.test.demo.MainActivity }
Status: ok
LaunchState: COLD
Activity: com.tg.test.gp/com.test.demo.MainActivity
ThisTime: 1344
TotalTime: 1344
WaitTime: 1346
Complete
ThisTime: 最后一个Activity启动耗时
TotalTime: 启动时经历的所有Activity总耗时
WaitTime: AMS启动所有Activity的总时间(包括启动目标应用前的)
2.2、使用代码打点
public class LaunchTimer {
private static long sTime;
public static void startRecord() {
sTime = System.currentTimeMillis();
}
public static void endRecord() {
endRecord("");
}
public static void endRecord(String msg) {
long cost = System.currentTimeMillis() - sTime;
LogUtils.i(msg + "cost " + cost);
}
}
该方式一般为Applicati