Android systrace抓取工具atrace、perfetto的使用

systrace主要用来分析析能问题:应用响应速度慢、动画播放不流畅、卡顿或耗电量过高表示应用存在性能问题。

共有三种方法,一是android studio、二是命令行、三是prefetto。

抓取trace

命令行

atrace -h 可以看到命令的用法

atrace --list_categories 会列出要trace的项目

自动抓6秒

adb shell atrace view am wm freq idle sync sched aidl gfx -a com.test.anddemo -t 6 > anddemo.trace

持续抓取log

adb shell atrace --async_start view am wm freq idle sync sched aidl gfx dalvik binder_lock binder_driver -a com.test.anddemo

停止抓取Trace文件,并取取出trace

adb shell atrace --async_stop -o /sdcard/b.trace
adb pull /sdcard/b.trace

直接用python脚本(SDK 33版本以前有)抓取并用转成html

python /xxx/Android/sdk/platform-tools/systrace/systrace.py -t 10 -o trace.html

/systrace.py 在34版本的 SDK已经被删除了,不推荐了,但如果搞老系统还是得用      

android studio profiler

用android studio的profile,参考 记录轨迹  |  Android Studio  |  Android Developers

prefetto命令行和网页

(android 10,SDK29 以后才支持)

prefetto命令行也可以抓取,直接用​ https://ui.perfetto.dev/ 实际也是用了这个命令
1、关掉所有自动连接adb的软件 如android studio
2、刷新https://ui.perfetto.dev/record 就是首页上点了 record new trace后的页面
3、点add ADB device
4、修改抓取配置,如点CPU tab页面下的所有开关。
5、点Start Recording

这个工具比较复杂,不过Android后续主支持这个工具和android studio了 ,参考
​【快速入门】Perfetto - Android性能追踪、系统分析工具上手文档 - 知乎

设备系统上操作抓取


设备上手操作开关来抓取。参考 捕获设备上的系统跟踪记录  |  App quality  |  Android Developers
系统设置->开发人员选项->系统跟踪->录制 (最下面有个启用通知栏开关) 测试程序复现性能bug 停止录制,然后再

adb pull /data/local/traces/ .

检测自己怀疑的代码块

代码中加入抓指定trace点,注意抓时命令行要带-a 这个app的包名

Trace.beginSection("test_secton")

...//要分析的代码块

Trace.endSection();

抓取的trace中会单独有这个slice,用来分析代码块的性能。

打开trace文件

1、Android studio profiler 

 用android studio的profile,参考 记录轨迹  |  Android Studio  |  Android Developers

把b.trace文件导出到电脑,然后使用sdk(33版本以前有)下的systrace.py程序将分析结果生成html文件,命令如下:

python systrace.py --from-file ~/b.trace -o ~/b.html

然后用chrome浏览器里,chrome://tracing/,load .trace转成的.html即可

prefetto

  https://ui.perfetto.dev/  open trace file,打开.trace文件。

分析systrace

主要看每个16.7ms内的main线程的任务是不是没有完成。是什么原因导致没有完成。

看是否有丢帧、帧延迟,找出影响的代码块,对其进行优化。

参考 Android Systrace 基础知识 -- Systrace 简介 · Android Performance

<think>好的,我需要回答用户关于如何在Android使用ATRACE_BEGIN函数进行性能追踪的问题。首先,我需要回忆一下ATrace的相关知识,并参考用户提供的引用内容。 用户提到了引用[1],里面提到ATrace宏定义在base/trace_event/trace_log.h中,并且通过JNI调用相关方法。这说明ATRACE_BEGIN应该是一个宏,用于标记代码段的开始,以便在性能分析工具中显示。 接下来,我需要确认ATRACE_BEGIN的具体用法。通常在Android中,使用ATrace需要在代码中包含相应的头文件,并调用宏来标记跟踪的起点和终点。例如,ATRACE_BEGIN("SectionName")和ATRACE_END()配对使用。 用户可能想知道如何在自己的C++或Java代码中插入这些宏。根据引用[1],在native层使用ATrace宏,可能需要在C++代码中包含trace_log.h头文件,并正确链接相关库。而在Java层,可能需要通过JNI调用,或者使用Android提供的Trace类,比如Trace.beginSection()和Trace.endSection()。 不过用户特别问到ATRACE_BEGIN,这通常是native层的宏。需要说明在C++代码中的使用方法,包括头文件包含、宏的调用位置,以及如何启用跟踪(比如系统属性设置或使用atrace工具)。 还需要注意编译依赖,可能需要在Android.mk或CMakeLists.txt中添加libcutils或相关库的链接。此外,性能分析时需要使用工具Perfetto(引用[2])或systrace来捕获和分析跟踪数据。 可能的问题点:是否需要在设备上启用特定的设置,比如设置prop属性或者使用adb命令开启跟踪。引用[3]提到atrace使用ftrace的function_graph功能,可能需要内核支持,但用户可能只需要基本的ATRACE_BEGIN使用,不需要深入内核配置。 最后,应该给出一个简单的代码示例,展示如何在C++函数中使用ATRACE_BEGIN和ATRACE_END,并说明如何通过工具查看结果。同时,提醒用户注意宏的作用域,确保每个BEGIN都有对应的END,避免嵌套错误。</think>### ATRACE_BEGIN 使用方法详解 ATRACE_BEGIN 是 Android 系统中用于标记代码段性能追踪起点的宏,需与 `ATRACE_END` 配对使用。以下是具体步骤: #### 1. **头文件与依赖** 在 C/C++ 代码中需包含头文件: ```cpp #include <cutils/trace.h> ``` 同时需在构建配置(如 `Android.bp`)中添加依赖: ``` shared_libs: ["libcutils"] ``` #### 2. **代码标记** 在需要追踪的函数或代码块前后添加宏: ```cpp void critical_function() { ATRACE_BEGIN("critical_function"); // 待追踪的代码 ATRACE_END(); } ``` 注意: - 宏参数为字符串标签,建议使用函数名或功能描述 - 支持嵌套调用,但需保证 BEGIN-END 严格匹配 #### 3. **启用追踪** 通过 adb 设置系统属性并抓取 trace: ```bash adb shell setprop debug.atrace.tags.enableflags 0x1 # 启用应用层追踪 adb shell atrace -t 5 sched gfx view > trace.out # 抓取5秒数据 ``` #### 4. **结果解析** 使用 [Perfetto](https://ui.perfetto.dev/) 或 `systrace.py` 可视化分析: ```bash python systrace.py --from-file=trace.out ``` 在可视化界面中搜索 `critical_function` 标签,可查看执行耗时和上下文信息[^2][^3]。 ### 关键注意事项 1. **NDK 适配**:若使用 Android NDK,需确认 `APP_CFLAGS` 包含 `-DATRACE_ENABLED=1` 2. **Java 层对应**:Java 代码应使用 `Trace.beginSection("TAG")`/`endSection()` 3. **性能损耗**:高频调用(>1kHz)可能影响测量准确性 ### 完整示例场景 ```cpp // 渲染线程关键路径 void render_frame() { ATRACE_BEGIN("GLES_draw"); prepare_mesh(); // 模型准备 ATRACE_END(); ATRACE_BEGIN("Shader_bind"); bind_shaders(); // 着色器绑定 ATRACE_END(); } ``` 通过此标记可清晰区分 GPU 流水线各阶段耗时[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值