第 3 章 Android 下的效能进阶
App 产品很重要的一点就是效能,若其在效能上更加自动化、智能化,那么这也将会成为这个产品很重要的竞争力。本章将从自动化 App 性能监测、 App 真机检测以及 APK 信息一站式修改等方面来说明 Android 下的效能进阶。
3.1 App 性能监测实现
App 性能监测犹如 App 的一个技术体检,核心功能涵盖启动速度、内存监测、页面卡顿等,一个好的 App,其性能必然也是比较优秀的。
3.1.1 App 性能监测背景
App UI 流畅程度如何量化和监控的问题,一直以来都是 App 性能监测的痛点。业内比较流行的流畅度监测产品要属 BlockCanary 开源项目,其原理是利用 Looper 队列在处理主线程消息之前和之后提供的日志打印接口,通过截取日志的方式进行分析。该方案的优点是可以很好地定位对流畅度影响粒度大的卡顿点,并输出调用堆栈信息;缺点是该方案粒度不够细,不能
很好地反映帧绘制丢帧的情况。该方案一般只能监测到非常卡顿的情况,而对于因帧丢失引起的流畅度变差不能进行很好的量化。
3.1.2 App 性能监测总体设计
App 性能监测核心功能包括基础性能、布局性能、页面启动速度、卡顿监测和内存泄漏监测等,其总体设计如图 3-1 所示。
3.1.3 启动速度框架
启动速度作为 App 性能监测最核心的部分,也是接触用户的门面,下面就以 Activity 启动速度监测和 Fragment 启动速度监测为例来进行说明。
1. Activity 启动速度监测
原 理 : 在 Application 中 通 过 registerActivityLifecycleCallbacks 方 法 注 册 ActivityLifecycleCallbacks 对 Activity 生命周期进行监控,当 Activity onActivityCreated 时记录,然后在onActivityResumed 时减去之前记录的时间,这样就可以计算 Activity 的启动速度。
2. Fragment 启动速度监测
原理:通过 Google 新推出的 Lifecycle 架构对 Fragment 的生命周期进行监控。
3.1.4 内存监测系统
内存监测系统的原理:在 Activity 和 Fragment onDestroy 的时候,将对象用 WeakReference引用起来,监听对象是否发生内存泄漏,通过 WeakReference 和 ReferenceQueue<Object>配合使用,如果弱引用引用的对象被 GC(垃圾回收),则 Java 虚拟机就会把这个弱引用加入与之关联的引用队列,然后主动执行 GC,触发 WeakReference 被 GC,同时检测 GC 前后ReferenceQueue 是否包含被监听对象,如果不包含,则说明该对象没有被 GC,一定存在到GC Roots 的强引用链,也就是发生了内存泄漏。
主要流程如图 3-2 所示。
3.1.5 页面卡顿解决方案
页面卡