通过代码插桩生成跟踪日志

要生成应用执行的 方法跟踪,您可以使用 Debug 类为应用添加代码插桩。通过这种方式为应用添加代码插桩,您可以更好地控制设备何时开始和停止记录跟踪信息。设备还会使用您指定的名称保存跟踪日志,以便您可以轻松识别以后的每个日志。然后,您可以使用 Android Studio 的 CPU 性能分析器 查看每个跟踪日志。

您还可以在 CPU 性能分析器中启动和停止跟踪,而无需为应用的代码添加代码插桩。

在开始生成跟踪日志之前,请确保您的应用已添加将跟踪日志保存到其 应用专用目录 的逻辑。

为您的应用添加代码插桩

要创建跟踪日志,请在您希望系统开始记录跟踪数据的位置调用startMethodTracing()

在调用中,您可以指定.trace文件的名称,系统会将其保存到目标设备上用于持久性应用程序数据的特定于包的目录中——这与getExternalFilesDir()返回的目录相同,并且在大多数设备上位于~/sdcard/目录中。此文件包含二进制方法跟踪数据和包含线程和方法名称的映射表。要停止跟踪,请调用stopMethodTracing()

以下示例启动并停止使用名称sample.trace记录跟踪日志

Kotlin

// Starts recording a trace log with the name you provide. For example, the
// following code tells the system to start recording a .trace file to the
// device with the name "sample.trace".
Debug.startMethodTracing("sample")

// The system begins buffering the generated trace data, until your
// application calls <code><a href="/reference/android/os/Debug.html#stopMethodTracing()">stopMethodTracing()</a></code>, at which time it writes
// the buffered data to the output file.
Debug.stopMethodTracing()

Java

// Starts recording a trace log with the name you provide. For example, the
// following code tells the system to start recording a .trace file to the
// device with the name "sample.trace".
Debug.startMethodTracing("sample");
...
// The system begins buffering the generated trace data, until your
// application calls <code><a href="/reference/android/os/Debug.html#stopMethodTracing()">stopMethodTracing()</a></code>, at which time it writes
// the buffered data to the output file.
Debug.stopMethodTracing();

请注意,如果您的应用在不更改跟踪日志名称的情况下再次调用startMethodTracing(),它会覆盖保存到设备的现有日志。要了解如何动态更改每个跟踪日志的名称,请转到关于保存多个日志的部分。

如果系统在您调用stopMethodTracing()之前达到最大缓冲区大小,系统将停止跟踪并向控制台发送通知。启动和停止跟踪的方法可在整个应用程序进程中使用。也就是说,您可以在活动的onCreate(Bundle)方法中调用startMethodTracing(),并在该活动的onDestroy()方法中调用stopMethodTracing()

请注意,启用性能分析时,您的应用运行速度会变慢。也就是说,您不应使用性能分析数据来确定绝对时间(例如,“方法foo()运行需要2.5秒”)。跟踪日志中的时间信息仅在与之前的跟踪日志进行比较时才有用,因此您可以查看最近的更改是否使您的应用运行速度更快或更慢。

在部署到运行 Android 5.0(API 级别 21)及更高版本的设备时,您可以使用基于采样的性能分析以较低的运行时性能影响进行性能分析。要启用样本性能分析,请调用startMethodTracingSampling()(而不是调用startMethodTracing()),并指定采样间隔。系统会定期收集样本,直到您的应用调用stopMethodTracing()

保存多个日志

如果您的应用多次启动和停止方法跟踪而没有为跟踪日志指定新名称,则设备会将旧的跟踪日志覆盖为新的跟踪日志——也就是说,它只保留最新的跟踪日志。要将多个跟踪日志保存到您的设备,请在您的应用每次调用startMethodTracing()时动态重命名跟踪日志。下面的示例使用SimpleDateFormat类在命名每个跟踪日志时包含当前日期和时间

Kotlin

// Uses the <code><a href="/reference/java/text/SimpleDateFormat.html">SimpleDateFormat</a></code> class to create a String with
// the current date and time.
val dateFormat: DateFormat = SimpleDateFormat("dd_MM_yyyy_hh_mm_ss", Locale.getDefault())
val logDate: String = dateFormat.format(Date())
// Applies the date and time to the name of the trace log.
Debug.startMethodTracing("sample-$logDate")

Java

// Uses the <code><a href="/reference/java/text/SimpleDateFormat.html">SimpleDateFormat</a></code> class to create a String with
// the current date and time.
SimpleDateFormat dateFormat =
        new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss", Locale.getDefault());
String logDate = dateFormat.format(new Date());
// Applies the date and time to the name of the trace log.
Debug.startMethodTracing(
        "sample-" + logDate);

访问设备上的跟踪日志

系统在您的设备上创建跟踪日志后,您可以通过以下方式之一访问该文件

  • 使用设备资源管理器。要打开设备资源管理器,请单击**查看 > 工具窗口 > 设备资源管理器**(或单击工具窗口栏中的设备资源管理器 按钮)。如图1所示,您可以通过导航到您的应用的特定于包的目录来找到.trace文件。

    图 1. 使用设备资源管理器查找跟踪日志。

  • 使用adb pull命令将文件复制到本地计算机。下面的命令将名为sample.trace的跟踪日志从设备复制到本地计算机的~/Documents/trace-logs/目录。

    adb pull path-on-device/sample.trace ~/Documents/trace-logs/

然后,您可以使用 CPU 分析器导入跟踪文件