使用traceview测试方法时间及System.currentTimeMillis()方式错误的错误使用

本文探讨了使用Android Debug Tracing工具进行方法跟踪时,如何正确理解其对应用性能的影响,通过对比使用traceview与System.currentTimeMillis()测量时间的方法差异,揭示了traceview在停止跟踪时需要额外时间将缓存内容输出到外部存储文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写了一个demo,用traceview对里边的print()方法进行测试,最后的时间显示只是180ms。在print()方法前后使用System.currentTimeMillis()方式,时间值相差太远,原因是traceview在stopMethodTracing结束时候需要占用时间将缓存中的信息输出到*.trace文件中。

 android.os.Debug.startMethodTracing("MainActivity-print");
        long start = System.currentTimeMillis();
        print();
        android.os.Debug.stopMethodTracing();
        long end = System.currentTimeMillis();
        Log.i(LOG_TAG, "execute long : " + (end - start));

使用traceview测试时间为180ms



使用System.currentTimeMillis()方式进行为1105ms.

原因就在于

 android.os.Debug.stopMethodTracing();调用时,会消耗时间去将缓存中的内容输出到外部存储文件中。


<think>我们正在讨论的是Android中的Trace类,具体是traceBegin和traceEnd方法的使用。用户想知道在调用trace.traceBegin后如何查看跟踪信息。 根据引用内容,我们可以知道: 1. 使用systrace工具可以捕获系统跟踪信息,包括在代码中添加的trace标记(如Trace.traceBegin)。 2. 在代码中成对使用traceBegin和traceEnd,并且在一个线程中。 3. 捕获的trace文件可以通过Perfetto UI(或以前使用的systrace工具)进行分析。 步骤: 1. 在代码中添加Trace标记: Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "myTraceTag"); ... // 要跟踪的代码 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); 2. 使用系统工具捕获trace文件。根据引用[1],可以使用adb shell命令配合perfetto工具来捕获跟踪信息。例如: adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 10s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory 其中,-t指定跟踪时长(10秒),-o指定输出文件,后面跟着要跟踪的类别(包括我们在代码中使用的TRACE_TAG,比如'am'对应TRACE_TAG_ACTIVITY_MANAGER)。 3. 将捕获的trace文件从设备拉取到电脑: adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace 4. 使用Perfetto UI(https://ui.perfetto.dev)打开trace文件进行分析。在Perfetto UI中,可以搜索我们设置的tag(如"myTraceTag")来查看跟踪的时间段。 注意:在引用[2]中提到,必须保证traceBegin和traceEnd成对出现并在一个线程中。另外,如果使用systrace工具(旧的方式),命令可能类似: python systrace.py -a com.example.myapp -o mytrace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory 但是,现在Google推荐使用Perfetto,因为它是systrace的升级版。 引用[5]展示了在ActivityThread中如何使用traceBegin和traceEnd,并说明了在Perfetto或systrace中可以看到名为"ActivityThreadMain"的跟踪段。 因此,用户需要: 1. 确保在代码中正确添加了traceBegin和traceEnd。 2. 使用Perfetto工具(通过adb命令)捕获跟踪信息。 3. 使用Perfetto UI打开捕获的trace文件,并查找对应的tag。 注意:在Android 10(API 29)及以上,Perfetto是默认的跟踪工具。对于旧版本,可能需要使用systrace。 如果用户无法看到自己添加的tag,请检查: - 是否在同一个线程内成对调用。 - 在捕获trace时是否包含了对应的tag类别(例如,如果使用TRACE_TAG_ACTIVITY_MANAGER,则需要在perfetto命令中包含'am'类别)。 此外,引用[3]提到,也可以通过在方法前后加时间戳并输出log的方式来分析,但这不是用户所问的关于trace.traceBegin的查看方式。 因此,回答用户:在调用trace.traceBegin后,需要通过系统工具(如Perfetto)捕获系统跟踪信息,然后在Perfetto UI中查看。</think>在 Android 中使用 `Trace.traceBegin()` 后查看系统跟踪日志,需通过以下步骤实现: --- ### 📌 步骤详解 #### 1. **添加 Trace 标记** 在代码中成对使用 `traceBegin()` 和 `traceEnd()`,确保在同一线程内: ```java import android.os.Trace; // 在需要跟踪的代码段前后添加标记 Trace.traceBegin(Trace.TRACE_TAG_APP, "my_custom_trace"); // 需要监控的耗时操作(如数据库查询、复杂计算等) performTask(); Trace.traceEnd(Trace.TRACE_TAG_APP); ``` #### 2. **捕获系统跟踪文件** 通过 **ADB 命令**生成 trace 文件: ```bash # 捕获 10 秒的跟踪数据,包含应用级标签(TRACE_TAG_APP) adb shell perfetto -o /data/misc/perfetto-traces/trace.perfetto-trace -t 10s \ sched freq idle am wm gfx view binder_driver hal dalvik webview input res memory ``` #### 3. **导出并分析 Trace 文件** - 将 trace 文件导出到电脑: ```bash adb pull /data/misc/perfetto-traces/trace.perfetto-trace ``` - 使用 **[Perfetto UI](https://ui.perfetto.dev)** 打开文件: - 搜索标记名 `my_custom_trace` - 查看该代码段的**执行时长**、**线程状态**和**调用栈** --- ### ⚠️ 关键注意事项 1. **标签可见性** - 确保 `traceBegin()` 的标签类别(如 `TRACE_TAG_APP`)包含在 perfetto 命令参数中(示例中 `am` 对应 `TRACE_TAG_ACTIVITY_MANAGER`,`view` 对应 `TRACE_TAG_VIEW`)[^5]。 - 若未显示自定义标签,检查命令是否遗漏对应类别(如应用标签需包含 `am` 或 `app`)。 2. **成对调用** `traceBegin()` 和 `traceEnd()` 必须在**同一线程**调用,否则 trace 数据可能丢失[^2]。 3. **替代方案** - 若 systrace 无法定位问题,先用 **Traceview** 或 **Android Profiler** 分析函数耗时[^2]。 - 简单场景可直接在代码中添加时间戳日志: ```java long startTime = System.currentTimeMillis(); performTask(); Log.d("TIMING", "耗时: " + (System.currentTimeMillis() - startTime) + "ms"); ``` --- ### 🔍 分析工具对比 | 工具 | 适用场景 | 优势 | |---------------|---------------------------------|--------------------------| | **Perfetto** | 系统级性能分析(Android 10+) | 支持多标签、GPU/CPU 跟踪 | | **Systrace** | 旧版本 Android(需 Python 环境) | 轻量级,快速捕获 | | **Android Profiler** | AS 内置工具 | 实时监控,无需命令 | > 💡 更多 systrace 与源码关联分析可参考:[Android Systrace 深度解析](https://www.androidperformance.com/2019/05/28/Android-Systrace-About/)[^4]。 --- ### 📚 相关问题 1. 如何解决 `Trace.traceBegin()` 标记在 Perfetto 中不显示的问题? 2. 除了 systrace,还有哪些工具可以分析 Android 应用性能瓶颈? 3. 如何在 Android Studio 中直接捕获和分析 trace 日志? [^1]: 使用 adb shell 命令捕获 systemtrace 文件的方法 [^2]: systrace 使用注意事项和替代方案 [^3]: 添加 systrace 标记与内核 ftrace 的关联 [^4]: systrace 与系统源码的关联分析 [^5]: ActivityThread 中 systrace 标记的实现示例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚妄皆空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值