随着项目版本的迭代,App 的性能问题会逐渐暴露出来,而好的用户体验与性能表现紧密相关。 最近项目核心功能收尾,准备开启优化之路,打造一个高用户体验的 APP
技术不断更新,我将在边学习边实践的过程中进行分享,并将实践结果与大家分享,希望大家看到文章中有不足的地方及时给我留言,我将与大家积极讨论。
注意:如果出现图片不显示问题请移步 图片不显示问题
性能优化
微信 Matrix 源码解读
首先了解 Matrix 的配置源码 腾讯 Apm 框架 Matrix 源码阅读 - gradle插件 其中使用到了 gradle 中 Transform 和 Task 相关文章 Gradle自定义插件实现自定义Task 、Android中Gradle插件和Transform ,Matrix 在 gradle 的 afterEvaluate 时期 hook 系统 生成 dex 的 Task 为自定义的 Task,并在执行完相关流程后,再执行回原有 Task ,将控制权交还给系统。Matrix 使用 Transform 配合 ASM 完成侵入编译流程进行字节码插入操作。
然后了解 Matrix 代码架构 腾讯 Apm 框架 Matrix 源码阅读 - 架构解析 ,Matrix是整个框架的入口也是所有插件的管理者,所有的插件都需要继承Plugin,Plugin本身已经具备了问题上报和感知 APP 前后台状态的能力。
不论是 gradle 的使用还是架构设计都有很多地方值得去学习。
Matrix-Android-TraceCanary
先看看它的 TracePlugin 架构 ,其中重点是 UIThreadMonitor 和 UIThreadMonitor 。
UIThreadMonitor配合LooperMonitor获得每个刷新帧的各个阶段的耗时时间。其中涉及到Choreographer(主要是配合Vsync,给上层App的渲染提供一个稳定的Message处理的时机,即Vsync到来的时候 ,系统通过对Vsync信号周期的调整,来控制每一帧绘制操作的时机),相关文章 Choreographer工作流程分析 。AppMethodBeat记录了Application的启动时间和结束,hook ActivityThread中mH的Handler.Callback对象为自定义的HackCallback对象来记录最近一个Activity被打开的时间,每个方法的耗时时间。
TracePlugin 包含 FrameTracer、StartupTracer、AnrTracer
- FrameTracer: 通过
UIThreadMonitor提供的感知每帧耗时的能力。进行简单的整合再通知给各个IDoFrameListener。Matrx中提供了两个IDoFrameListener一个就是FPSCollector用于上报FPS,另一个是FrameDecorator用于直接显示FPS。当然也可以自己先IDoFrameListener自己实现分析逻辑。 - StartupTracer: 当
onActivityFocused被回调时,进行各个时间点的计算,监控并上报App冷/暖启动时间,Activity启动时间,配合AppMethodBeat中记录的方法执行时间,筛选出导致启动时间长的方法并上报 - AnrTracer: 很好理解的一个
Tracer,通过UIThreadMonitor感知Looper loop工作的开始,刷新帧,结束的时间,并在结束时分析是否超过阈值,如果超过就从AppMethodBeat中获取相关数据进行分析并上报。将上报Task延迟发送,如果dispatchEnd在规定时间内没有回调,就发送上报Task。Android源码中的ANR也是这么玩的 理解Android ANR的触发原理







