在 Android 的开发中我们常用的系统性能分析工具有 Systrace,Perfetto 与 Profiler 工具。我们依次来看看这些工具。
Systrace 是第一代系统级性能分析工具。在 Perfetto 出现之前,基本上是唯一的性能分析工具(DDMS 在 Android Studio 3.0 就被抛弃),它将 Android 系统和 App 的运行信息以图形化的方式展示出来,与 Log 相比,Systrace 的图像化方式更为直观;与 TraceView 相比,抓取 Systrace 时候的性能开销基本可以忽略,最大程度地减少观察者效应带来的影响。
在系统的一些关键操作(比如 Touch 操作、Power 按钮、滑动操作等)、系统机制(input 分发、View 绘制、进程间通信、进程管理机制等)、软硬件信息(CPU 频率信息、CPU 调度信息、磁盘信息、内存信息等)的关键流程上,插入类似 Log 的信息,我们称之为 TracePoint(本质是 Ftrace 信息),通过这些 TracePoint 来展示一个核心操作过程的执行时间、某些变量的值等信息。然后 Android 系统把这些散布在各个进程中的 TracePoint 收集起来,写入到一个文件中。导出这个文件后,Systrace 通过解析这些 TracePoint 的信息,得到一段时间内整个系统的运行信息。
Android 系统中,一些重要的模块都已经默认插入了一些 TracePoint,通过 TraceTag 来分类,其中信息来源如下
这样 Systrace 就可以把 Android 上下层的所有信息都收集起来并集中展示,对于 Android 开发者来说,Systrace 最大的作用就是把整个 Android 系统的运行状态,从黑盒变成了白盒。全局性和可视化使得 Systrace 成为 Android 开发者在分析复杂的性能问题的时候的首选。
一般抓到的 Systrace 文件如下
Systrace 已经很强大了,但 Google 并不满足,在此基础上提供了一个更加强大的工具 Pefetto。
Perfetto 相比 Systrace 最大的改进是可以支持长时间数据抓取,这是得益于它有一个可在后台运行的服务,通过它实现了对收集上来的数据进行 Protobuf 的编码并存盘。从数据来源来看,核心原理与 Systrace 是一致的,也都是基于 Linux 内核的 Ftrace 机制实现了用户空间与内核空间关键事件的记录(ATRACE、CPU 调度)。Systrace 提供的功能 Perfetto 都支持,由此才说 Systrace 最终会被 Perfetto 替代。
Perfetto 所支持的数据类型、获取方法,以及分析方式上看也是前所未有的全面,它几乎支持所有的类型与方法。数据类型上通过 ATRACE 实现了 Trace 类型支持,通过可定制的节点读取机制实现了 Metric 类型的支持,在 UserDebug 版本上通过获取 Logd 数据实现了 Log 类型的支持。
开发者可以通过 Perfetto.dev 网页、命令行工具手动触发抓取与结束,通过设置中的开发者选项触发长时间抓取,甚至你可以通过框架中提供的 Perfetto Trigger API 来动态开启数据抓取,基本上涵盖了我们在项目上能遇到的所有的情境。
本文主要讨论如何在 Android 使用 Peffetto 来分析性能。提到 Android 的性能分析工具就不得不提 Android Studio 中的 Profiler。
随着 Android Studio 的迭代、演进,到目前,Android Studio 有了自己的性能分析工具 Android Profiler,它是一个集合体,集成了多种性能分析工具于一体,让开发者可以在 Android Studio 做开发应用,也不用再下载其它工具就能让能做性能调优工作。
目前 Android Studio Profiler 已经集成了 4 类性能分析工具: CPU、Memory、Network、Battery,其中 CPU 相关性能分析工具为 CPU Profiler,也是本章的主角,它把 CPU 相关的性能分析工具都集成在了一起,开发者可以根据自己需求来选择使用哪一个。可能很多人都知道,谷歌已经开发了一些独立的 CPU 性能分析工具,如 Perfetto、Simpleperf、Java Method Trace 等,现在又出来一个 CPU Profiler,显然不可能去重复造轮子,CPU Profiler 目前做法就是:从这些已知的工具中获取数据,然后把数据解析成自己想要的样式,通过统一的界面展示出来。
CPU Profiler 集成了性能分析工具:Perfetto、Simpleperf、Java Method Trace,它自然而然具备了这些工具的全部或部分功能,如下:
ui.perfetto.dev/
上进行分析那么我们下面列举几个例子来看看如何使用 Perfetto 来抓取和分析性能问题
1.点击此应用的 Edit Configurations 按钮
2.修改配置
3.点击 Profile 按钮
4.App 运行之后会立即开始抓取,点击 stop 按钮停止 recording
5.以下是抓取后的信息
稍后我们来看看如何根据展示出的 System trace recording 分析性能问题
1.启动 profiler 后,在 CPU 区域,选择 System trace Recording,点击 Record 按钮
2.在 App 中点击或者滑动之后,点击 Stop 按钮,即可获取 system trace 信息
在 Android 9(Api 级别 28)或更高版本上有一个 System Tracing 的系统级应用。如
抓取之后的.perfetto-trace文件可以直接导入 Android Stuido 的 Profier 进行分析,也可在 ui.perfetto.dev/
上进行分析。
抓取之后的.ctrace文件可以在 ui.perfetto.dev/
上进行分析。
Android 10(API 级别 29)及更低版本会在 CPU 性能分析器捕捉的系统轨迹的 Display 中显示相关的操作系统图形流水线信息。
Display 部分显示以下图形流水线信息:Frames、SurfaceFlinger、VSYNC 和 BufferQueue。
RenderThread
轨迹事件。时长超过 16 毫秒的事件会以红色表示。0
、1
或 2
)。BufferQueue 可帮助您了解图像缓冲区在 Android 图形组件之间切换时的状态。例如,值 2
表示应用当前处于三重缓冲状态,这会导致额外的输入延迟。如何检测卡顿
如需在 Android 10 或更低版本上检测卡顿,请执行以下操作:
1.查看 Display 中的 Frames 轨迹。红色帧是要调查的候选对象。
2.发现可能存在卡顿的帧后,请按 W,或在按住 Control 键的同时滚动鼠标滚轮,以便进行放大。继续放大,直到您看到界面线程和 RenderThread 中的轨迹事件。
Choreographer#doFrame
显示了界面线程何时调用 Choreographer 来协调动画、视图布局、图像绘制和相关进程。DrawFrames
会在 RenderThread
形成并向 GPU 发出实际绘制命令时显示。
3.如果发现某个轨迹事件特别长,可以进一步放大,以便找出可能导致呈现速度缓慢的原因。下图显示了界面线程中的 inflate,这意味着应用正在花时间 inflate 布局。当放大其中一个 inflate 事件时,可以确切了解每个界面组件花费的时间
应用的性能问题主要分为两类:响应慢、不流畅。
CPU Profiler 在这些场景中要如何使用呢?基本的思路是:首先就要抓 System Trace,先用System Trace 分析、定位问题,如果不能定位到问题,再借助 Java Method Trace 或 C/C++ Function Trace 进一步分析定位。
Android Studio 中的 CPU Profiler 最大优势是集成了各种子工具,在一个地方就能操作一切,对应用开发者来说是还是非常方便的。
在技术领域内,没有任何一门课程可以让你学完后一劳永逸,再好的课程也只能是“师傅领进门,修行靠个人”。“学无止境”这句话,在任何技术领域,都不只是良好的习惯,更是程序员和工程师们不被时代淘汰、获得更好机会和发展的必要前提。