启动速度优化

Catalogue   

启动流程

应用的启动流程如下:

  • SystemServer 负责应用的启动流程调度、进程的创建和管理、 窗口的创建和管理(StartingWindow 和 AppWindow) 等
  • 应用进程被 SystemServer 创建后,进行一系列的进程初始化、 组件初始化(Activity、Service、ContentProvider、Broadcast)、 主界面的构建、内容填充等

概念

冷启动

当启动应用时,后台没有该应用的进程,这时系统会重 新创建一个新的进程分配给该应用,然后再根据启动的参数,启 动对应的进程组件,这个启动方式就是冷启动

热启动

当启动应用时,后台已有该应用的进程(例:按 back 键、home 键,应用虽然会退出,但是该应用的进程是依然会保 留在后台,可进入任务列表查看),所以在已有进程
的情况下, 这种启动会从已有的进程中来启动对应的进程组件,这个方式叫 热启动

温启动

温启动包含了在冷启动期间发生的部分操作;同时,它的开销要比热启动高。

优化方案

线程优化

线程优化主要是减少 CPU 调度带来的波动,让启动时间更稳定。如果 启动过程中有太多的线程一起启动,会给 CPU 带来非常大的压力,尤 其是比较低端的机器。
过多的线程同时跑会让主线程的 Sleep 和 Runnable 状态变多, 增加了应用的启动速度,优化的过程中要注意:

  • 控制线程数量(使用线程池)
  • 检查线程间的锁 ,防止依赖等待
  • 使用合理的启动架构

系统调度优化

  • 启动过程中减少系统调用:避免与 AMS、WMS 竞争锁。启动 过程中本身 AMS 和 WMS 的工作就很多,且 AMS 和 WMS 很多操作都是带锁的,如果此时 App 再有过多的
    Binder 调用 与 AMS、WMS 通信,SystemServer 就会出现大量的锁等待
  • 启动过程中不要启动子进程,如果好几个进程同时启动,系统负 担则会加倍,SystemServer 也会更繁忙
  • 启动过程中除了 Activity 之外的组件启动要谨慎, 因为四大组 件的启动都是在主线程的,如果组件启动慢,占用了 Message 通 道,也会影响应用的启动速度
  • Application 和主 Activity 的 onCreate 中异步初始化某些代码

GC的优化

尽量减少GC的次数,比如:

  • 避免进行大量的字符串操作,特别是序列化和反序列化
  • 频繁创建的对象需要考虑复用
  • 转移到 Native 实现

IO的优化

启动过程中负载比较高,有许多系统 IO 都在此时发生,这时候 IO 的 性能下降会比较快,此时 App 中的 IO 操作会比平时更慢一些,尤其 是在性能比较差的机器上。
IO 分网络 IO 和磁盘 IO ,启动过程中不建议进行网络 IO。

布局页面优化

  • 通过减少冗余或者嵌套布局来降低视图层次结构
  • 用 ViewStub 替代在启动过程中不需要显示的 UI 控件
  • 使用自定义 View 替代复杂的 View 叠加

windowBackground

开启预览窗口,设置主题背景,则可以让用户看起来舒服些。

参考