启动的类型:
冷启动和热启动:
-
冷启动:启动时后台没有该进程存在,系统需要重新创建一个进程 -
一般我们说的启动优化是针对冷启动。热启动:启动时该进程已经存在,比如按home键临时退出该应用
App启动哪些任务要处理?
- 1.文件系统完整性
- 2.数据库系统
- 3.网络正常与否
- 4.签名校验
- 5.安全
- 6.隐私条款的同意
- 7.权限
- 8.引导页
- 9.广告
- 10.更新提示
如何优化?
主要从两个方向进行优化:1.架构层面 2.用户体验(效果和速度)
架构层面
1.启动器模式:
对各个启动任务按任务属性分类排序,组成一个有向无环图,按图的先后及依赖关系,使用线程池的方式进行处理
2.使用Rxjava 责任链模式 appStart androidStart 任务的调度和管理自定义处理
用户体验
主要是应用启动速度效果和速度方面的优化,需要了解一定android系统和应用的启动过程知识
1. 减少xml层级关系 :
使用ConstraintLayout,这个类的使用后面会有介绍,谷歌推荐使用的一个强大类。
2.避免在onCreate中做太多耗时操作,如文件读取或者网络读取等io操作
3.延时初始化
我们可以使用线程池来实现异步初始化,即暂时不适用的工具类等延后到使用的时候再去初始化。
比如从 xml 里面读取颜色,可以考虑在使用的时候再去读取和解析。
延迟启动器利用了 IdleHandler 实现主线程空闲时才执行任务
4.在Activity的onWindowFocusChanged回调中进行初始化
5.懒加载:ViewStub
6.有些动作可以放到ContentProvider初始化的时候处理:如leckcanry等第三方组件的初始化工作
7.代码优化:尽量让代码规范化
8.使用AndroidProfier工具对启动过程耗时进行监听操作或者使用Debug工具进行统计,针对性的做出优化。
Debug工具使用:
Debug.startMethodTracing("输出文件")
init();
...
Debug.endMethodTracing();
应用启动够速度检测
-
1.命令测量 adb shell am start -S -W xxx/xxxActivity 获取的TotalTime即为应用启动时间:
-
2.埋点测量 - 第一步:在Application的attachBaseContext方法中设置冷启动开始时间 - 第二步:在Activity的onWindowFocusChanged中获取应用冷启动的结束时间。 - 开始和结束时间差即为应用冷启动时间
总结
优化手段众多,具体优化方案还是需要根据项目属性来处理,对一些简单的项目如果使用太多优化策略,可能会适得其反