您可以在 Android 中记录多种类型的性能配置文件。收集配置文件有助于您调试与应用运行速度、内存用量、耗电量等相关的问题。
本文档介绍了最实用的几种分析类型,以及何时使用每种类型来调试常见的性能问题。
系统跟踪记录

系统轨迹是一种强大的配置文件,其中包含有关进程、线程、时间信息、CPU 和任务执行以及系统或用户定义的事件的信息。
从应用的角度来看,轨迹中的信息可以涵盖广泛的领域,包括延迟时间、卡顿、内存、电池等。
系统轨迹包含以下代码驱动的事件,这些事件可以是系统定义的,也可以是用户定义的。代码驱动型事件是指用户可以通过函数调用触发的事件。
- 轨迹切片:表示代码中不同点之间的时间。可以使用
Trace.beginSection
和Trace.endSection
API 添加它们。 - 轨迹计数器:表示指标的数值,例如堆大小。可以使用
Trace.setCounter
API 添加这些数据源。
系统轨迹还包含可从 PerfettoSQL 查询创建的指标,可用于执行分析或比较轨迹。
我们建议使用系统轨迹执行以下任务:
诊断延迟时间问题。系统轨迹非常适合查找由延迟、等待或调度问题引起的延迟问题。其他分析器(例如基于抽样的分析器)无法提供系统轨迹所提供的计时信息。
查找重复的计算。通过跟踪,您可以了解某些计算是否在重复进行,这可能表明存在不必要的操作。
诊断锁争用问题。借助有关线程状态的信息以及显示资源何时被阻塞的切片,您可以确定锁(例如
synchronized
块)是否会导致用户历程出现延迟。了解应用中的多线程。轨迹可提供多个线程的视图,显示每个线程的状态以及系统或应用添加的任何轨迹切片。此多线程视图有助于您了解哪些线程处于活跃状态、休眠状态,或者正在运行什么以及它们如何交互。
执行复杂的效果分析。凭借强大的用户界面和显示各种类型信息的能力,系统轨迹可用于调试各种性能问题,包括延迟、内存和电池用量。
系统轨迹还支持使用 PerfettoSQL 进行查询。借助这项强大的功能,您可以:
- 提取特定数据。
- 将轨迹数据转换为自定义指标。
- 根据查询创建调试轨道,以便在 Perfetto 界面中更轻松地直观呈现您最关心的内容。
- 直接在 Perfetto 界面中执行复杂的分析。
堆栈样本分析报告

堆栈样本分析通过以下方式工作:在线程在 CPU 上运行任务时,以设定的速率记录代码执行样本并存储调用堆栈信息。这样可以深入了解代码在执行期间所做的事情。
我们建议您使用堆栈样本执行以下操作:
- 优化热点。堆栈样本有助于识别代码中 CPU 活动较多的部分,这意味着相应线程经常处于“运行”状态。
- 了解代码执行。堆栈样本可帮助您了解代码库的总体行为。
- 识别不应运行的代码。您可能会发现本不应运行的调用堆栈,这表明存在立即优化的机会。
堆转储

Java 堆转储会显示应用 Java 堆内存的快照。此快照包含所有对象以及它们在获取内存转储时的相互引用方式。
我们建议您收集堆转储,以执行以下操作:
- 发现重复的对象。堆转储会显示实时对象的数量,这有助于跟踪重复的对象。它们还提供对象引用,帮助您精确定位创建对象的代码位置。
- 查找内存泄漏。堆转储可以显示在进行转储时本应不再使用的内存,从而指示潜在的内存泄漏。
- 确定可优化的对象。堆转储会显示使用大量内存的对象及其数量,从而帮助识别低效的内存使用模式。
堆分析报告

堆配置文件有原生版本和 Java 版本,非常适合调试内存问题。它们与调用堆栈样本类似,但不是测量 CPU 周期,而是在分配内存时进行采样。
我们建议使用堆配置文件来实现以下目标:
- 减少内存抖动。堆性能剖析文件会提供包含内存分配代码位置的样本。这有助于您确定会创建许多临时对象的区域,这些区域可能会导致应用中频繁进行垃圾回收 (GC)。
- 发现内存泄漏。堆配置文件可与其他内存配置文件搭配使用,以诊断和修复内存泄漏问题。它们可帮助您精确定位分配的内存远超预期的位置。
合并商家资料
通常,您会使用单个配置文件来分析性能。不过,收集多个配置文件或单个组合配置文件通常可以提供更全面的信息,有助于诊断单个配置文件无法诊断的复杂问题。
请考虑以下适合合并配置文件的场景:
情形 1:调查未插桩的代码。系统轨迹可能会显示您已插桩的操作的延迟时间。不过,您可能需要详细了解在这些时间段内运行的未插桩代码部分。如需进行调查,请获取调用堆栈配置文件,以了解执行的代码。然后,这些信息可帮助您通过添加更多轨迹切片来改进轨迹。
场景 2:分析内存泄漏和垃圾回收。假设系统轨迹显示,由于分配,Java 堆内存不断增加,从而触发频繁的垃圾回收 (GC)。如需了解已分配的对象,请获取堆配置文件或堆转储。这种组合方法有助于您找到减少内存使用量的方法。例如,使用缓存减少浪费或可优化的分配可能会防止发生垃圾回收。