优化方向
启动速度的优化方向是 Application 和 Activity 生命周期阶段,这是我们开发者能控制的时间,其他阶段都是系统做的。
冷启动
1.创建进程 创建进程阶段主要做了下面三件事,这三件事都是系统做的。
- 启动 App
- 加载空白 Window
- 创建进程
2.启动应用 启动应用阶段主要做了下面三件事,从这些开始,随后的任务和我们自己写的代码有一定的关系。
- 创建 Application
- 启动主线程
- 创建 MainActivity
3.绘制界面 绘制界面阶段主要做了下面三件事。
- 加载布局
- 布置屏幕
- 首帧绘制
优化工具
-
Traceview
- 优点:Traceview 能以图形的形式展示代码的执行时间和调用栈信息,而且 Traceview 提供的信息非常全面,因为它包含了所有线程。
- 缺点:运行时开销严重,整体都会变慢,得出的结果并不真实。
- 作用:获取单次执行最耗时的方法。执行次数最多的方法。
- Wall Clock Time:程序执行时间。
- Thread Time:CPU执行的时间。(重点优化方向)
-
Systrace
- 作用:主要用于分析绘制性能方面的问题。 分析系统关键方法和应用方法耗时。
启动耗时检测
- adb
- 优点:可以查看第三方App。
- 缺点:结果不准确。
- 代码打点
- 优点:精确,可带到线上。
- 使用:attachBaseContext 记录开始时间, 第一条数据展示记录结束时间。
- onWindowFocusChanged只是首帧时间,App启动完成的结束点应该是真实数据展示出来的时候. 如列表第一条数据展示,记得使用getViewTreeObserver().addOnPreDrawListener(),它会把任务延迟到列表显示后再执行。
AOP获取方法耗时
启动优化常规方案
主题切换
使用Activity的windowBackground主题属性预先设置一个启动图片(layer-list),在启动后,在Activity的onCreate()方法中的super.onCreate()前再setTheme(R.style.AppTheme)。
缺点:治标不治本,表面上产生一种快的感觉。
异步启动
Application里面的初始化异步加载。
延时加载
MainActivity中 利用IdleHandler特性,在CPU空闲时执行,对延迟任务结合异步加载框架进行分批初始化。
第三方库懒加载
按需初始化,如图片库的初始化等等。
启动阶段不启动子进程
子进程会共享CPU资源,导致主进程CPU紧张。此外,在多进程情况下一定要可以在onCreate中去区分进程做一些初始化工作。
黑科技
- 抑制GC。
- CPU锁频。