Android 启动时间优化

71 阅读2分钟

测量方式

adb

adb shell am start -W com.apache.fastandroid/com.apache.fastandroid.MainActivity

image.png

特点

1、线下使用方便,不能带到线上 2、非严谨、精确的事件

手动打点

1、启动时埋点,启动结束时埋点,二者差值

2、精确、可带到线上,推荐使用

3、避开误区,采用 Feed 第一条展示

4、addOnDrawListener 要求 Api 16 才支持

优化工具

TraceView

图形的形式展示执行时间、调用栈等 信息全面,包含所有线程

image.png

  • 运行时开销严重,整体都会变慢(因为会抓取所有的线程信息)
  • 可能会带偏方向

Systrace

  • 结合 Android 内核的数据,生成 html 报告
  • API 18 以上使用,推荐使用 TraceCompat
  • 轻量级,开销小(只会抓取埋点的线程)
  • 直观反映 cpu 的利用率 (cpu time 和 wall time)
  • cpu time 与 wall time 的区别:

wall time 代码执行的时间, cpu time:代码消耗 cpu 的时间 (重点指标)

为什么 wall time 和 cpu time 值不一样,例如 锁等待,本身不耗 cpu,但是这个锁被其他线程持有,导致迟迟拿不到锁,进而导致 wall time 时间比较长

优雅获取方法耗时

背景:需要知道启动阶段所有方法的耗时 实现:手动埋点

优化小技巧

Theme 切换

感觉上的快,不是真的快

image.png

异步优化

image.png

优化总方针

  • 异步、延迟、懒加载

  • 技术、业务相结合

注意事项

  • wall time 与 cpu time

1、cpu time 才是优化方向 2、按照 systrace 及 cpu time 跑满 cpu

其他方案

提前加载 SharedPreferences

Multidex 之前加载,利用此阶段 的 cpu

启动阶段不启动子进程

  • 子进程会共享 cpu 资源,导致主进程 cpu 资源紧张

  • 注意启动顺序 App onCreate 之前是 ContentProvider

类加载优化:提前异步类加载

1、Class.forName("") 只加载类本身及其静态变量的引用类 2、new 类实例可以额外加载类成员变量的引用类

启动阶段抑制 GC