冷启动优化
1. 什么是冷启动
1. 冷启动的定义
冷启动就是在启动应用前,系统中没有该应用的任何进程信息。这时候启动应用就叫冷启动。
2. 冷启动/热启动的区别
热启动:用户使用返回键(Home键)退出应用,然后马上又重新启动应用(进程在后台)。
启动特点:
1. 冷启动会创建Application和MainActivity,进行测量,绘制显示
2. 热启动则不会再次初始化Application,因为一个进程只需要初始化一次Application
3. 冷启动时间的计算
这个时间值从应用启动(创建进程)开始计算,到完成视图的第一次绘制(即Activity内容对用户可见)为止。
adb计算应用启动时间的命令(冷启动和热启动都是用这个命令):
adb shell am start -W -n application包名/启动Activity的完整名字
例如:
D:\Architect_workspace\GridViewDemo>adb shell am start -W -n com.gridviewdemo/com.gridviewdemo.MainActivity
WARNING: linker: libhoudini.so has text relocations. This is wasting memory and prevents security hardening. Please fix.
Starting: Intent { cmp=com.gridviewdemo/.MainActivity }
Status: ok
Activity: com.gridviewdemo/.MainActivity
ThisTime: 2407
TotalTime: 2407
WaitTime: 2418
Complete
如果只关心某个应用自身启动耗时,参考TotalTime;如果关心系统启动应用耗时,参考WaitTime;如果关心应用有界面Activity启动耗时,参考ThisTime
2. 冷启动的流程
- 首先,从Zygote进程中fork创建出一个新的进程
- 创建和初始化Application类,创建MainActivity类
- inflate布局
- 当onCreate/onStart/onResume方法都走完后,会measure/layout/draw contentView,然后显示到界面上
冷启动的生命周期简要流程:
Application构造方法 –> attachBaseContext()–>onCreate –>Activity构造方法 –> onCreate() –> 配置主体中的背景等操作 –>onStart() –> onResume() –> 测量、布局、绘制显示
3. 如何对冷启动的时间进行优化
1. 减少onCreate()方法的工作量
懒加载的方式初始化一些三方SDK等。(很难区分,需要去权衡)
2. 不要让Application参与业务的操作
3. 不要在Application进行耗时操作
避免耗时操作等
4. 不要以静态变量的方式在Application保存数据
5. 减少布局的复杂度和层级
viewStub按需加载
6. 减少主线程耗时
懒加载或者使用子线程进行操作