Matrix研究

线上:

https://github.com/Tencent/matrix/wiki/Matrix-Android-TraceCanary

https://github.com/Tencent/matrix/wiki/Matrix-Android-IOCanary

线下:

https://github.com/Tencent/matrix/wiki/Matrix-Android-ResourceCanary

https://github.com/Tencent/matrix/wiki/Matrix-Android-SQLiteLint

https://github.com/Tencent/matrix/wiki/Matrix-Android-


https://developer.android.com/topic/performance/vitals/launch-time

极客时间-Android开发高手课

07 | 启动优化(上):从启动过程看启动速度优化

methodMapping.txt文件走向

transform中内存计算出methodMapping,

写入"${buildDir}/outputs/mapping/${currentVariantName}/methodMapping.txt",之后拷贝到getAssembleOutputBakFile里,用于tinker,构建new apk时的baseMethodMapping

debug时写入buildDirPath + “/intermediates/merged_assets/debug/methodMapping.txt”,用于开发模式下自动转换堆栈信息

启动优化

https://developer.android.google.cn/topic/performance/vitals/launch-time

matrix_startup

我以微信为例,用户从桌面点击图标开始,会经过 4 个关键阶段。

  • T1 预览窗口显示。系统在拉起微信进程之前,会先根据微信的 Theme 属性创建预览窗口。当然如果我们禁用预览窗口或者将预览窗口指定为透明,用户在这段时间依然看到的是桌面。

  • T2 闪屏显示。在微信进程和闪屏窗口页面创建完毕,并且完成一系列 inflate view、onmeasure、onlayout 等准备工作后,用户终于可以看到熟悉的“小地球”。

  • T3 主页显示。在完成主窗口创建和页面显示的准备工作后,用户可以看到微信的主界面。

  • T4 界面可操作。在启动完成后,微信会有比较多的工作需要继续执行,例如聊天和朋友圈界面的预加载、小程序框架和进程的准备等。在这些工作完成后,用户才可以真正开始愉快地聊天。

问题 1:点击图标很久都不响应

如果我们禁用了预览窗口或者指定了透明的皮肤,那用户点击了图标之后,需要 T2 时间才能真正看到应用闪屏。对于用户体验来说,点击了图标,过了几秒还是停留在桌面,看起来就像没有点击成功,这在中低端机中更加明显。

问题 2:首页显示太慢

现在应用启动流程越来越复杂,闪屏广告、热修复框架、插件化框架、大前端框架,所有准备工作都需要集中在启动阶段完成。上面说的 T3 首页显示时间对于中低端机来说简直就是噩梦,经常会达到十几秒的时间。

问题 3:首页显示后无法操作。

既然首页显示那么慢,那我能不能把尽量多的工作都通过异步化延后执行呢?很多应用的确就是这么做的,但这会造成两种后果:要么首页会出现白屏,要么首页出来后用户根本无法操作。

启动优化方法

  1. 闪屏优化
  2. 业务梳理
  3. 业务优化
  4. 线程优化 从具体的做法来看,线程的优化一方面是控制线程数量,线程数量太多会相互竞争 CPU 资源,因此要有统一的线程池,并且根据机器性能来控制数量。
  5. GC 优化
  6. 系统调用优化

启动进阶方法

  1. I/O 优化
  2. 数据重排 2.1类重排 通过 ReDex 的Interdex调整类在 Dex 中的排列顺序 2.2资源文件重排
  3. 类的加载

启动性能指标

那我们一般使用什么指标来衡量启动速度的快慢呢?

很多应用采用平均启动时间,不过这个指标其实并不太好,一些体验很差的用户很有可能是被平均了。我更建议使用类似下面的指标:

  • 快开慢开比。例如 2 秒快开比、5 秒慢开比,我们可以看到有多少比例的用户体验非常好,多少比例的用户比较槽糕。

  • 90% 用户的启动时间。如果 90% 的用户启动时间都小于 5 秒,那么我们 90% 区间启动耗时就是 5 秒。

区分启动的类型

Alpha

IO优化

matrix_io_canary_architecture

检测场景

3.1 检测主线程 I/O

耗时的 IO 操作不能占据主线程太久。检测条件:

  1. 操作线程为主线程
  2. 连续读写耗时超过一定阈值或单次 write\read 耗时超过一定阈值

3.2 读写Buffer过小,I/O次数增多

Buffer 过小,会导致 read/write 的次数增多,从而影响了性能。检测条件:

  1. buffer 小于一定阈值
  2. read/write 的次数超过一定的阈值

3.3 重复读

如果频繁地读某个文件,证明这个文件的内容很常被用到,可以通过缓存来提高效率。检测条件如下:

  1. 同一线程读某个文件的次数超过一定阈值

3.4 Closeable Leak 监控

Closeable Leak 指的是打开资源包括文件、Cursor 等,没有及時 close,引起泄露