测量方式
adb
adb shell am start -W com.apache.fastandroid/com.apache.fastandroid.MainActivity
特点
1、线下使用方便,不能带到线上 2、非严谨、精确的事件
手动打点
1、启动时埋点,启动结束时埋点,二者差值
2、精确、可带到线上,推荐使用
3、避开误区,采用 Feed 第一条展示
4、addOnDrawListener 要求 Api 16 才支持
优化工具
TraceView
图形的形式展示执行时间、调用栈等 信息全面,包含所有线程
- 运行时开销严重,整体都会变慢(因为会抓取所有的线程信息)
- 可能会带偏方向
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 切换
感觉上的快,不是真的快
异步优化
优化总方针
-
异步、延迟、懒加载
-
技术、业务相结合
注意事项
- 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 类实例可以额外加载类成员变量的引用类