一、启动分类
Android的启动分冷启动、热启动、温启动。
1、冷启动:当启动应用时,后台没有这个应用的进程,需创建新的进程。
冷启动过程:
click (点击应用图标)——>ipc——>Process.start——>ActivityThread
——>bindApplication——>lifeCycle——>ViewRootImpl
2、热启动:就是后台存在当前应用的进程(如按下Home键,退出应用),
再次点击打开应用,这个过程不需要创建进程,也不需要初始化application,也不需要初始化activity。
3、温启动:应用进程还在,可能因为系统内存不足,activity被回收,需要初始化activity。
从上面流程可以看出,冷启动相对耗时,启动优化基本上是针对冷启动做的处理。能优化的地方是从创建Application到首屏activity布局展示的操作。
总结:
1、application中oncreate中不要做耗时的操作。
2、application中异步初始化各种必须要初始化的三方SDK等。
3、application中延迟初始化,在需要做到的地方再初始化要用的三方SDK等。
4、首屏activity不要在oncreate做耗时操作,尽量放在子线程中处理。
二、启动时间的测量
启动时间测量的方法有两种:
1、adb 命令
特点:方便操作
adb shell am start -W packagename/首屏activity
例如:adb shell am start -W com.pursue.demo/com.pursue.demo.ui.flash.FlashActivity
输出
2、手动打点:
启动开始埋点,启动结束埋点取二者差值。
在application的attachBaseContext方法中计算起始时间(因attachBaseContext方法先于oncreate方法执行),结束时间是首屏activty的Feed数据第一条显示。如:
起始时间:
结束时间:
两种测量方法对比:
adb: 线下使用比较方便,但是不能带到线上
手动打点:可以带到线上,将打点取到的数据上传到服务器。
总结:建议使用手动打点方式,因Android机型众多,需要关心应用在用户手机上的启动时间。