android追踪工具Trace概述

systrace

​ systrace 是分析 Android 设备性能的主要工具。不过,它实际上是其他工具的封装容器:它是 atrace 的主机端封装容器,是用于控制用户空间跟踪和设置 ftrace 的设备端可执行文件,也是 Linux 内核中的主要跟踪机制。systrace 使用 atrace 来启用跟踪,然后读取 ftrace 缓冲区并将其全部封装到一个独立的 HTML 查看器中(虽然较新的内核支持 Linux 增强型柏克莱封包过滤器 (eBPF),但以下文档内容仅适用于 3.18 内核(无 eFPF),因为 Pixel/Pixel XL 上使用的是 3.18 内核)。

​ 它的思想很朴素,在系统的一些关键链路(比如System Service,虚拟机,Binder驱动)插入一些信息(我这里称之为Label),通过Label的开始和结束来确定某个核心过程的执行时间,然后把这些Label信息收集起来得到系统关键路径的运行时间信息,进而得到整个系统的运行性能信息。Android Framework里面一些重要的模块都插入了Label信息(Java层的通过android.os.Trace类完成,native层通过ATrace宏完成

​ 能生成chrome tracing 格式的数据,支持所有进程的监控

​ 目前已有在java里面很容易埋点

​ native层,ATrace宏在base/trace_event/trace_log.h 中定义了 startATrace 写法,好像是通过jni调用相关方法,实现 ATrace

​ base/android/java/src/org/chromium/base/TraceEvent.java 有定义

​ 好像和chrome tracing 实现有区别

使用 atrace查看 exo 起播

Simpleperf

​ Simpleperf 是一款适用于 Android 平台上的应用和本机进程的原生分析工具

Android Studio -CPU profiler

https://developer.android.google.cn/studio/profile/cpu-profiler

  • 对 Java 方法采样

    :在应用的 Java 代码执行期间,频繁捕获应用的调用堆栈。分析器会比较捕获的数据集,以推导与应用的 Java 代码执行有关的时间和资源使用信息。

    基于采样的跟踪存在一个固有的问题,那就是如果应用在捕获调用堆栈后进入一个方法并在下次捕获前退出该方法,分析器将不会记录该方法调用。如果您想要跟踪生命周期如此短的方法,应使用检测跟踪。

  • 跟踪 Java 方法

    :在运行时检测应用,以在每个方法调用开始和结束时记录一个时间戳。系统会收集并比较这些时间戳,以生成方法跟踪数据,包括时间信息和 CPU 使用率。

    请注意,与检测每个方法相关的开销会影响运行时性能,并且可能会影响分析数据;对于生命周期相对较短的方法,这一点更为明显。此外,如果应用在短时间内执行大量方法,则分析器可能很快就会超出其文件大小限制,因而不能再记录更多跟踪数据。

  • 对 C/C++ 函数采样:捕获应用的原生线程的采样跟踪数据。要使用此配置,您必须将应用部署到搭载 Android 8.0(API 级别 26)或更高版本的设备上。

原生跟踪

这个好像新建本地的C++文件,调用android系统的 trace.h ,好像和谷歌浏览器代码不耦合

NDK trance.h

原生跟踪

本指南介绍如何使用原生跟踪 API (trace.h),将跟踪事件写入系统缓冲区。 然后,您可通过使用 Systrace 工具,分析此跟踪输出。 Android API 级别 23 及更高版本支持原生跟踪 API。

概览

如所述,在原生代码中创建自定义跟踪与 Java 编程语言的技巧相似跟踪应用代码。 一般来说,您不必将原生跟踪代码输入 try/catch 块,除非跟踪的分区引发原生异常,或使用早期返回。

除非可能造成跟踪文件损坏,否则请针对每个 ATrace_beginSection() 调用,执行相应的 ATrace_endSection()调用。

若要在未启用跟踪时避免构建复杂字符串或参数,您可通过调用 ATrace_isEnabled() 添加锁定

跟踪功能

原生跟踪 API 的一个用例是观察特定代码块使用的时间。 一般来说,此类跟踪发生在管道处理阶段(例如,解码图像、绘制帧或等待网络请求时)。

若要跟踪代码块使用的时间,请遵循以下步骤:

  1. 添加

trace.h


标头文件。

#include <android/trace.h>


2. 指定一个变量作为以下项目的分区名称:

ATrace_beginSection()

。 在要跟踪的代码块末尾,针对以下项目执行相应的调用:

ATrace_endSection()

。 当跟踪的分区引发原生异常或使用早期返回时,这一点尤其重要。

void myExpensiveFunction() {
ATrace_beginSection(“myExpensiveFunction”);
… // trace-worthy work here
ATrace_endSection();
}


3. (可选)

创建便捷的对象/宏结构来跟踪代码块。 以下示例显示您如何实现此类名为

 

ATRACE_CALL()


 

的对象/宏。

```C++
#define ATRACE_NAME(name) ScopedTrace ___tracer(name)

// ATRACE_CALL is an ATRACE_NAME that uses the current function name.
#define ATRACE_CALL() ATRACE_NAME(__FUNCTION__)

class ScopedTrace {
  public:
    inline ScopedTrace(const char *name) {
      ATrace_beginSection(name);
    }

    inline ~ScopedTrace() {
      ATrace_endSection();
    }
};

您可使用

ATRACE_CALL()

对象/宏,按照如下方式简化上一步中的代码。 通过这种方式使用对象/宏,当跟踪的分区引发异常或使用早期返回时,您无需担心添加 try/catch 块。

void myExpensiveFunction() { ATRACE_CALL(); ... // trace-worthy work here}

敲重点

media里面的tarce比较少

v8里面就比较多

perfetto

属于AOSP项目,“Android Open-Source Project"的缩写。中文意为"Android 开放源代码项目”。

一个 比chromium更高效与简单的工具,通知能够过滤隐私问题()。支持的更加漂亮的UI和更大的日志,可以达到GB。是谷歌官方的工具,目的是取代现有TRACE_EVENT 工具,TRACE_EVENT 工具过于复杂和繁琐。

Telemetry - tracing

Telemetry is the performance testing framework used by Chrome. It allows you to perform arbitrary actions on a set of web pages (or any android application!) and report metrics about it. The framework abstracts:

  • Launching a browser with arbitrary flags on any platform.
  • Opening a tab and navigating to the page under test.
  • Launching an Android application with intents through ADB.
  • Fetching data via the Inspector timeline and traces.
  • Using Web Page Replay to cache real-world websites so they don’t change when used in benchmarks.

Catapult

一个性能监测工具结合,包括数据收集、展示与分析。通过用于google开发工程师分析、测试和检测chrome,也用于分析和监测web页面,甚至Android apps

ATRACE

  • Java/Kotlin apps (SDK): android.os.Trace. See https://developer.android.com/reference/android/os/Trace.
  • Native processes (NDK): ATrace_beginSection() / ATrace_setCounter() defined in <trace.h>. See https://developer.android.com/ndk/reference/group/tracing.
  • Android internal processes: ATRACE_BEGIN()/ATRACE_INT() defined in [libcutils/trace.h](https://cs.android.com/android/platform/superproject/+/master:system/core/libcutils/include/cutils/trace.h?q=f:trace libcutils).

猜你喜欢

转载自blog.csdn.net/u013741019/article/details/108502461