【Android Studio】中的CPU Profiler系统性能分析工具的使用

前言

在 Android 的开发中我们常用的系统性能分析工具有 Systrace,Perfetto 与 Profiler 工具。我们依次来看看这些工具。

1 Systace

Systrace 是第一代系统级性能分析工具。在 Perfetto 出现之前,基本上是唯一的性能分析工具(DDMS 在 Android Studio 3.0 就被抛弃),它将 Android 系统和 App 的运行信息以图形化的方式展示出来,与 Log 相比,Systrace 的图像化方式更为直观;与 TraceView 相比,抓取 Systrace 时候的性能开销基本可以忽略,最大程度地减少观察者效应带来的影响。

1.1 Systrace 的设计思路

系统的一些关键操作(比如 Touch 操作、Power 按钮、滑动操作等)、系统机制(input 分发、View 绘制、进程间通信、进程管理机制等)、软硬件信息(CPU 频率信息、CPU 调度信息、磁盘信息、内存信息等)的关键流程上,插入类似 Log 的信息,我们称之为 TracePoint(本质是 Ftrace 信息),通过这些 TracePoint 来展示一个核心操作过程的执行时间、某些变量的值等信息。然后 Android 系统把这些散布在各个进程中的 TracePoint 收集起来,写入到一个文件中。导出这个文件后,Systrace 通过解析这些 TracePoint 的信息,得到一段时间内整个系统的运行信息。
Android 系统中,一些重要的模块都已经默认插入了一些 TracePoint,通过 TraceTag 来分类,其中信息来源如下

  1. Framework Java 层的 TracePoint 通过 android.os.Trace 类完成
  2. Framework Native 层的 TracePoint 通过 ATrace 宏完成
  3. App 开发者可以通过 android.os.Trace 类自定义 Trace

这样 Systrace 就可以把 Android 上下层的所有信息都收集起来并集中展示,对于 Android 开发者来说,Systrace 最大的作用就是把整个 Android 系统的运行状态,从黑盒变成了白盒。全局性和可视化使得 Systrace 成为 Android 开发者在分析复杂的性能问题的时候的首选。
一般抓到的 Systrace 文件如下

Systrace 已经很强大了,但 Google 并不满足,在此基础上提供了一个更加强大的工具 Pefetto。

2 新一代性能分析全栈工具 Perfetto

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。

3 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,它自然而然具备了这些工具的全部或部分功能,如下:

  1. System Trace Recording,它是用 Perfetto 抓取的信息,可用于分析进程函数耗时、调度、渲染等情况,除了在 Profiler 分析外,还可以将 Trace 导出文件后在 ui.perfetto.dev/上进行分析
  2. Java Method Trace Recording,它是从虚拟机获取函数调用栈信息,用于分析 Java 函数调用和耗时情况
  3. C/C++ Function Trace,它是用 Simpleperf 抓取的信息,Simpleperf 是从 CPU 的性能监控单元 PMU 硬件组件获取数据。 C/C++ Method Trace 只具备 Simpleperf 部分功能,用于分析 C/C++ 函数调用和耗时情况

    由此可知,使用 Profiler CPU 中的 System Trace Recording 就是在使用 Perfetto

4 Android 中 System trace 信息的抓取

那么我们下面列举几个例子来看看如何使用 Perfetto 来抓取和分析性能问题

4.1 Android Studio 如何抓取 App 启动的 trace 信息

1.点击此应用的 Edit Configurations 按钮

2.修改配置

  1. 选择 Profiling
  2. 勾选 Start this recording on startup
  3. CPU activity 选择 Trace System Calls
  4. 点击 Aplay
  5. 点击 Ok

3.点击 Profile 按钮

4.App 运行之后会立即开始抓取,点击 stop 按钮停止 recording

5.以下是抓取后的信息

稍后我们来看看如何根据展示出的 System trace recording 分析性能问题

4.2 Android Studio 如何抓取任何时候的 trace 信息

1.启动 profiler 后,在 CPU 区域,选择 System trace Recording,点击 Record 按钮

2.在 App 中点击或者滑动之后,点击 Stop 按钮,即可获取 system trace 信息

4.3 使用手机设备抓取 trace 信息

在 Android 9(Api 级别 28)或更高版本上有一个 System Tracing 的系统级应用。如

抓取之后的.perfetto-trace文件可以直接导入 Android Stuido 的 Profier 进行分析,也可在 ui.perfetto.dev/上进行分析。

抓取之后的.ctrace文件可以在 ui.perfetto.dev/上进行分析。

5 Android 中 System trace 信息的分析

5.1 CPU 性能剖析器窗口介绍

  1. 事件时间轴:显示应用中的 activity 在其生命周期内不断转换经历各种不同状态的过程,并指示用户与设备的交互,包括屏幕旋转事件。
  2. CPU 时间轴:显示应用的实时 CPU 使用率(以占总可用 CPU 时间的百分比表示)以及应用当前使用的线程总数。此时间轴还会显示其他进程(如系统进程或其他应用)的 CPU 使用率,以便您可以将其与您应用的 CPU 使用率进行对比。可以通过沿时间轴的横轴方向移动鼠标来检查历史 CPU 使用率数据。
  3. 线程活动时间轴:列出属于应用进程的每个线程,并使用下面列出的颜色在时间轴上指示它们的活动。记录轨迹后,可以从此时间轴上选择一个线程,以在轨迹窗格中检查其数据。
    • 绿色:表示线程处于活动状态或准备使用 CPU。也就是说,线程处于正在运行或可运行状态。
    • 黄色:表示线程处于活动状态,但它正在等待一项 I/O 操作(如磁盘或网络 I/O),然后才能完成它的工作。
    • 灰色:表示线程正在休眠且没有消耗任何 CPU 时间。 当线程需要访问尚不可用的资源时,就会出现这种情况。在这种情况下,要么线程主动进入休眠状态,要么内核将线程置于休眠状态,直到所需的资源可用。

5.2 CPU Trace Recording 窗口介绍

  1. 选定范围:确定需在跟踪数据窗格中检查所记录时间的哪一部分。可以用鼠标拖选需要观察的范围。
  2. “Interaction”部分:沿着时间轴显示用户互动和应用生命周期事件。
  3. “Threads”部分:沿时间轴针对每一个线程显示线程状态活动(例如运行、休眠等)和调用图表(在 System Trace 中则为跟踪事件图表)。
    • 使用鼠标和键盘快捷键(WASD)在时间轴上选择范围。
    • 双击线程名称,或在选中线程时按 Enter 键展开或折叠线程。
    • 选择某个线程即可在“Analysis”窗格中查看更多信息。 按住 Shift 可选择多个线程。
  4. “Analysis”窗格:显示所选择的时间范围和线程/方法调用的 trace 数据。在此窗格中,可以选择如何查看每个堆栈轨迹(使用“Analysis”标签页),以及如何测量执行时间(使用“Time reference”下拉菜单)。
  5. “Analysis”窗格标签页:选择如何显示跟踪数据详细信息。
  6. "Time reference"菜单:选择以下选项之一,以确定如何测量每次调用的时间信息(仅在Sample/Trace Java 方法中受支持):
    • Wall clock time:该时间信息表示实际经过的时间。
    • Thread time:该时间信息表示实际经过的时间减去线程没有占用 CPU 资源的那部分时间。对于任何给定的调用,其线程时间始终小于或等于其挂钟时间。使用线程时间可以更好地了解线程的实际 CPU 使用率中有多少是给定方法或函数占用的。
  7. Filter:按函数、方法、类或软件包名称过滤跟踪数据。

5.3 在 Android 10 及更低版本上检测卡顿

Android 10(API 级别 29)及更低版本会在 CPU 性能分析器捕捉的系统轨迹的 Display 中显示相关的操作系统图形流水线信息。
在这里插入图片描述
Display 部分显示以下图形流水线信息:FramesSurfaceFlingerVSYNCBufferQueue

  • Frames:此部分显示应用中的界面线程和 RenderThread 轨迹事件。时长超过 16 毫秒的事件会以红色表示。
  • SurfaceFlinger:此部分显示 SurfaceFlinger 处理帧缓冲区的时间。SurfaceFlinger 是负责将缓冲区内容发送到显示屏的系统进程。
  • VSYNC:此部分显示 VSYNC,这是一个表示与 Display 流水线保持同步的信号。
  • BufferQueue:此部分显示有多少帧缓冲区在排队等待 SurfaceFlinger 使用。对于部署到搭载 Android 9(API 级别 28)或更高版本的设备的应用,此轨迹显示应用 surface BufferQueue 的缓冲区计数(012)。BufferQueue 可帮助您了解图像缓冲区在 Android 图形组件之间切换时的状态。例如,值 2 表示应用当前处于三重缓冲状态,这会导致额外的输入延迟。

如何检测卡顿
如需在 Android 10 或更低版本上检测卡顿,请执行以下操作:

1.查看 Display 中的 Frames 轨迹。红色帧是要调查的候选对象。
在这里插入图片描述
2.发现可能存在卡顿的帧后,请按 W,或在按住 Control 键的同时滚动鼠标滚轮,以便进行放大。继续放大,直到您看到界面线程和 RenderThread 中的轨迹事件。

Choreographer#doFrame 显示了界面线程何时调用 Choreographer 来协调动画、视图布局、图像绘制和相关进程。DrawFrames 会在 RenderThread 形成并向 GPU 发出实际绘制命令时显示。
3.如果发现某个轨迹事件特别长,可以进一步放大,以便找出可能导致呈现速度缓慢的原因。下图显示了界面线程中的 inflate,这意味着应用正在花时间 inflate 布局。当放大其中一个 inflate 事件时,可以确切了解每个界面组件花费的时间

6 总结

应用的性能问题主要分为两类:响应慢、不流畅。

  • 响应慢问题常有:应用启动慢、页面跳转慢、列表加载慢、按钮响应慢等
  • 不流畅问题常有:列表滑动不流畅、页面滑动不跟手、动画卡顿等

CPU Profiler 在这些场景中要如何使用呢?基本的思路是:首先就要抓 System Trace,先用System Trace 分析、定位问题,如果不能定位到问题,再借助 Java Method Trace 或 C/C++ Function Trace 进一步分析定位。
Android Studio 中的 CPU Profiler 最大优势是集成了各种子工具,在一个地方就能操作一切,对应用开发者来说是还是非常方便的。

写在最后

在技术领域内,没有任何一门课程可以让你学完后一劳永逸,再好的课程也只能是“师傅领进门,修行靠个人”。“学无止境”这句话,在任何技术领域,都不只是良好的习惯,更是程序员和工程师们不被时代淘汰、获得更好机会和发展的必要前提。

如果你觉得自己学习效率低,缺乏正确的指导,可以扫码,加入我们资源丰富,学习氛围浓厚的技术圈一起学习交流吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值