0%

Android性能优化之工具篇

概述

本文参考官网文档,记录一些可以用来做性能优化的工具,主要给出了一些工具的介绍,具体的使用还是需要参考官方文档,以及在实践项目中实际地加以应用,这样才能对工具的使用和性能优化有融会贯通的理解。本文会持续更新,参考官网文档的日期: 2020-11-26。

System Trace

  • Systrace: 平台提供的旧版命令行工具,可记录短时间内的设备活动,并保存在 html 文件中。该工具会生成一份报告,其中汇总了 Android 内核中的数据,例如 CPU 调度程序、磁盘活动和应用线程等。
  • Perfetto: Android 10 中引入的全新平台级跟踪工具。它是一个适用于 Android、Linux 和 Chrome 的更加通用和复杂的开源跟踪项目。与 Systrace 不同,它提供数据源超集,可让您以 protobuf 编码的二进制流形式记录任意长度的跟踪记录。

可以使用 android-sdk/platform-tools/systrace/systrace.py 命令行来生成 Systrace 报告(需要安装 Python 环境,目前只支持 Python2 版本):

1
$ python systrace.py -o mynewtrace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res

该命令会生成一个 html 文件,可以使用 Chrome 打开。更多选项可以参考 python systrace.py -hsystrace 命令行跟踪记录

在 Android 9 及以上的设备内置了一个名为 System Tracing 的系统级应用,可以通过它来生成系统报告而无需借助 systrace 命令行也无需使用 ADB 连接电脑,位于 开发者选项调试 部分,具体使用参考 录制 System Trace 记录。生成的报告位于 /data/local/traces/ 路径下,后缀为 .perfetto-trace(Android 10 及以上).ctrace(Android 10 以下)。生成的文件可以在 Perfetto 网站中打开分析。

关于 Systrace 报告的浏览与分析方式参考 浏览 Systrace 报告

Systrace 仅在系统级别显示进程的相关信息,因此有时很难知道应用的哪些方法是在给定时间针对系统事件执行的,因此可以使用 Android 平台提供的 Trace API 为特定的代码段添加标签。需要在 systrace.py 命令行中添加 -a pkg_name 参数,具体使用参考 Trace API,使用示例:

1
2
3
4
5
6
try {
Trace.beginSection("function")
f()
} finally {
Trace.endSection()
}

Trace 与 Debug 类不同,后者可通过生成 .trace 文件来检查应用 CPU 的详细使用情况,.trace 文件可以使用 CPU Profiler 查看。

CPU Profiler

详细使用参考 CPU Profiler

可以使用 CPU Profiler 在与应用交互时实时检查应用的 CPU 使用率和线程活动,也可以检查记录的方法跟踪数据、函数跟踪数据和系统跟踪数据的详细信息。

  • 系统跟踪数据:捕获精细的详细信息,以便检查应用与系统资源的交互情况。
  • 方法和函数跟踪数据:对于应用进程中的每个线程,可以了解一段时间内执行了哪些方法 (Java) 或函数 (C/C++),以及每个方法或函数在其执行期间消耗的 CPU 资源。还可以使用方法和函数跟踪数据来识别调用方和被调用方,可以使用此信息来确定哪些方法或函数调用会消耗大量资源,并优化相关的代码。

可以使用 Debug 类来检测应用,通过这种方式,可更精确地控制设备何时开始和停止记录跟踪信息:

1
2
3
4
5
6
7
// 在 getExternalFilesDir() 目录下生成 sample.trace 文件
try {
Debug.startMethodTracing("sample")
f()
} finally {
Debug.stopMethodTracing()
}

Memory Profiler

详细使用参考 Memory Profiler

Memory Profiler 可以帮助开发者识别出可能会导致应用卡顿、甚至崩溃的内存泄露和内存抖动。它显示一个应用内存使用量的实时图表,让我们可以捕获内存使用、强制执行垃圾回收以及跟踪内存分配。

还可以使用 Memory Profiler 检测内存泄漏,具体使用方法参考官方文档。

Network Profiler

详细使用参考 Network Profiler

Network Profiler 会在时间轴上显示实时网络活动,包括发送和接收的数据以及当前的连接数,便于开发者检查应用传输数据的方式和时间,并适当优化底层代码。

目前,Network Profiler 仅支持 HttpURLConnection 和 OkHttp 网络连接库。

Energy Profiler

详细使用参考 Energy Profiler

Energy Profiler 可帮助开发者了解应用在哪里耗用了不必要的电量,它会监控 CPU、网络无线装置和 GPS 传感器的使用情况,并直观地显示其中每个组件消耗的电量,Energy Profiler 还会显示可能会影响耗电量的系统事件(唤醒锁定、闹钟、作业和位置信息请求)的发生次数。

Energy Profiler 并不会直接测量耗电量,而是使用一种模型来估算设备上每项资源的耗电量。

Layout Inspector

详细使用参考 Layout Inspector

Layout Inspector 可以用来检查应用的视图层次结构,它可以替代 Hierarchy Viewer(已废弃) 的功能。

Leakcanary

Leakcanary 是 Square 公司为检测 Android 内存泄漏而开发的一个框架。Github 地址: Leakcanary

最新版的 LeakCanary 不需要做任何初始化操作,只需要在项目的 gradle 脚本中添加依赖即可:

1
2
3
4
dependencies {
// debugImplementation because LeakCanary should only run in debug builds.
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5'
}

Leakcanary 工作原理:借助 ReferenceQueue。

  1. 监听 Activity 的生命周期。
  2. 在 onDestory 的时候,创建对应的 Actitity 的 Refrence 和相应的 ReferenceQueue,启动后台进程去检测。
  3. 一段时间后,从 ReferenceQueue 中读取,如果有这个 Actitity 的 Refrence,那么说明这个 Activity 的 Refrence 已经被回收,但是如果 ReferenceQueue 没有这个 Actitity 的 Refrence 那就说明出现了内存泄漏。
  4. dump 出 hprof 文件,找到泄漏路径。