性能优化--启动优化

240 阅读2分钟

启动的类型:

冷启动和热启动:
  •   冷启动:启动时后台没有该进程存在,系统需要重新创建一个进程
    
  •   热启动:启动时该进程已经存在,比如按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中获取应用冷启动的结束时间。 - 开始和结束时间差即为应用冷启动时间

总结

优化手段众多,具体优化方案还是需要根据项目属性来处理,对一些简单的项目如果使用太多优化策略,可能会适得其反