APP启动优化
更快的应用启动,往往带来更好的用户体验。相反,如果应用启动过慢,会给人一种非常糟糕的使用体验。甚至会让用户直接进行卸载。应用启动耗时,除了跟平台资源(如内存、cpu性能等)有较大关系之外,还跟我们应用自身的实现有很大关系。1、应用启动状态与耗时指标应用启动根据启动过程不同,分为冷启动、热启动和温启动三种状态。冷启动:应用从最开始启动,需要创建应用进程,通常是设备重启应用首次启动,或者应用被杀后首次启动;热启动: 已经启动的应用,从后台再次进入前台被用户可见。这个过程应用始终驻留在内存中,启动过程不必执行对象初始化、加载布局等。温启动:它的开销介于冷启动和热启动之间。退出后进程没有被销毁,但是回到前台又需要做冷启动过程的部分操作。如,用户在瑞出应用后再重新启动,虽然进程没有被销毁,但是仍然要执行onCreate重新创建Activity。应用启动时间从用户角度看,是从点击开始,到第一帧画面显示出来的时间。通常情况下热启动耗时超过1.5s、问启动超过2s、冷启动超过5s,被认为启动耗时过长。启动时间测量:应用启动时间除了用户用肉眼感知。比较常用的测量方法是使用高速摄影机录制整个开机过程,通过后期逐帧播放,数出启动过程一共经过多少帧,然后根据帧率计算出启动时间。多次测量取平均值。站在开发者的角度可以使用系统统计日志和adb命令的方式进行统计。系统日志:在Android4.4(API19)及更高版本中,应用启动完成,logcat会输出一行包括应用包名和“Displayed”关键字日志,如,“ActivityManager: Displayed com.android.myDemo/.MyActivity: +3s500ms”后面的时间代表启动进程到在屏幕上完成Activity第一帧画面绘制所用的时间。adb命令统计方式:使用”adb shell am start -S -W xxx”启动窗口。-W, 表示在启动应用时要等待activity启动完成。-S,表示在启动应用前要对它进行强行停止,然后再进行启动。如“adb shell am start -S -W com.android.myDemo/.MainActivity”窗口启动后,命令行返回ThisTime、TotalTime、WaitTime几个统计数据。其中,ThisTime表示一连串Actitity启动,最后一个Activity启动的耗时;TotalTime表示新应用窗口启动时间,包括创建进程和活动窗口的启动,如果启动单个窗口ThisTime应该等于TotalTime;WaitTime表示前一个窗口puase和当前新应用启动的时间;通常常情况下WaitTime TotalTime = ThisTime。2、应用启动过程与优化原理我们先了解下应用启动主要流程,以及各个阶段所主要做的工作。Android版本虽然不断升级迭代,但是应用启动流程的主要步骤变化却是比较小的。这里及下面说的启动,指的是应用冷启动。上面图就是应用启动的主要步