App启动优化

715 阅读2分钟

优化方向

启动速度的优化方向是 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获取方法耗时

blog.csdn.net/gs344937933…

启动优化常规方案

主题切换

使用Activity的windowBackground主题属性预先设置一个启动图片(layer-list),在启动后,在Activity的onCreate()方法中的super.onCreate()前再setTheme(R.style.AppTheme)。

缺点:治标不治本,表面上产生一种快的感觉。

异步启动

Application里面的初始化异步加载。

github.com/alibaba/alp…

延时加载

MainActivity中 利用IdleHandler特性,在CPU空闲时执行,对延迟任务结合异步加载框架进行分批初始化。

第三方库懒加载

按需初始化,如图片库的初始化等等。

启动阶段不启动子进程

子进程会共享CPU资源,导致主进程CPU紧张。此外,在多进程情况下一定要可以在onCreate中去区分进程做一些初始化工作。

黑科技

  • 抑制GC。
  • CPU锁频。

参考: