一、App启动分类
1、冷启动
App在后台被清除或者第一次启动时,此启动方式,从点击应用图标到显示界面会经历以下过程:
2、暖启动
3、热启动
这两种启动一般不会出现较长的白屏时间,这里不做考虑,也可以参考冷启动优化方式。
二、白屏时间主要影响因素
1、设备性能
2、App的进程个数
3、白屏的Total Time : Application的onCreate()执行时间 + Activity的onCreate()执行时间
对于一个大型的App来说,通常会把相关的第三方SDK的初始化置于Application的onCreate()方法中。
三、解决办法
1、由于白屏总时间等于Application的onCreate()执行时间 + Activity的onCreate()执行时间,所以不要在这两处方法中进行耗时操作,可以将其推后执行或放在子线程中执行。
2、对于多进程的应用来说,每新建一个进程就会初始化Application一次,即会执行Application的onCreate()方法多次,所以将只需要在主进程中初始化的方法推后至Activity的onCreate()中执行。对于只在特定进程中需要初始化的部分方法,可以在Application的onCreate()方法中依据进程名去判断是否需要执行初始化。
3、如果在初始化过程中需要读取自定义Prop配置文件或者SharedPref缓存,若配置较多则将启动应用所必需的部分单独初始化。
四、调试
1、在Studio的日志窗,输入Tag关键字:Display
则可以看到应用自点击图标至渲染出画面所耗时间。下图即为个人调试应用优化前后的Display时间:
优化前:
优化后:
2、精确调试某段代码执行时间
在需要测算执行时间的那段代码前后加上:
Debug.startMethodTracing("name");
/** start 需要测算执行时间的代码段*/
......
/** end 需要测算执行时间的代码段*/
Debug.stopMethodTracing();
然后运行App后会在设备的SD卡根目录下生成name.trace文件,用Android Studio可以将此文件打开,从而得到这段代码的执行时间详细参数,例如下:
图中上半部分为各方法执行时间统计图,下方为各个方法详细的执行时间参数(包含其子方法),其中各列参数含义:
Name | Invocation Count | Inclusive Time (us) | Exclusive Time (us) |
---|---|---|---|
方法名 | 方法调用次数 | 该方法及其调用的子方法的耗时 | 该方法(不包含调用的子方法)的耗时 |
.
.
.
以上,欢迎补充。