在Android Studio中使用Method trace,查看某进程的所有线程trace的方法

本文介绍如何使用Android Studio的Methodtracing功能来定位网络请求中的问题。通过跟踪应用在特定操作期间的方法调用及其耗时,可以帮助开发者找出程序中的瓶颈。

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

背景


近几天开发的过程中,遇到了一个很棘手的问题:在没网络情况下OKHttp的任何请求,全都没有任何回应。想要查看线程的调用栈查看是哪里stuck了。


于是使用了AndroidStudio的工具。Monitors中CPU的Method tracing功能。这就是今天写这篇文章的目的。

clipboard.png
(Android Studio的Method tracing功能)

Method tracing有什么作用?


Method tracing的作用就是监听一段时间内,某个进程的某个线程,执行的所有方法,以及各个方法所消耗的时间。然后开发者可以从中找到一些蛛丝马迹来推断出程序中的一些问题。

如何使用?


  1. 按下“start method tracing”按钮。如图:

    clipboard.png

  2. 对app进行想要监听过程的操作。我这里就是操作异常的网络请求。

  3. 按下“stop method tracing”按钮。如图:

    clipboard.png

  4. 查看生成的trace文件。

    clipboard.png
    (这就是分析出来的method trace文件)

trace文件怎么分析?


  1. 线程选择。
    clipboard.png
    (主线程)
    线程下拉框拉下来以后出来一堆线程。其中“main”就是主线程。

  2. x时间轴选择。

    clipboard.png
    (x时间轴)
    关于时间轴的解释,我查了下google:

    Wall Clock Time - Total CPU time elapsed between the method call and return.

    Thread Time - Total time during which the JRE scheduled the thread during call processing. It’s less than or equal to the Wall Clock Time: less if the JRE interrupted the thread, and equal if it didn’t. The thread might not run continuously; when it’s not executing, that time is excluded. If threads are interrupted often and it’s not by design, the interruptions affect app performance. However, an example of a by-design use is synchronous operations that take a long time, such as file transfers and reads from disk, where the method could be the asynchronous wrapper for the synchronous reader.

    大致理解一下:
    Wall Clock Time,计算整个CPU时间,一个方法从开始到return,都会计算在内。
    Thread Time,从整个CPU时间,减掉可能由JRE中断线程的时间。

    OK这里就选择Wall Clock Time。


  3. method图标,重头戏来了,整个trace中最重要的就是这个图标了

    clipboard.png
    (Arrays.copyOf方法的调用详情)


    首先,最显眼的东西就是这个黄色的长条条了,每个长方形都是一个方法,长度代表这个方法执行的时间(就是上面咱们选择的Wall Clock Time啦)。Inclusive Time是指copyOf以及它的子方法调用的时间,占整个线程执行时间的占比。Exclusive Time与Inclusive Time相对,它不统计子方法执行的时间。


    进一步分析,copyOf长方形的的上面的方法是ArrayList.grow方法,下面的长方形是...嗯也是一个copyOf。其实这个上下关系,就正是父子关系。即copyOf是ArrayList.grow的一个子方法。


    那...我们其实根本不想分析这些很细节的方法,我们只关心我们自己写的方法的调用顺序或者调用耗时。那该怎么做呢?


    例如说,我原本的目的其实是查看被stuck的网络请求。我可以从中得到什么信息?首先,我查看的是自己写的方法,并非底层的方法,那么我要查看的长方形就在上面。其次,我想查看的是stuck的方法,那么它最终一定没有执行完毕,那么我要查看的长方形一定在最后。


    那么,选中想要的线程,拉到最后:

    clipboard.png
    (最后的横截面)


    这个最后的横截面,就是没有执行完的方法的调用栈。再看最后一个长方形:

    clipboard.png
    (libcore.io.Posix.android_getaddrinfo)

    那么这个线程最终卡在了这一步。至此,我达到了我的目的。


  4. 最后,还有下面的一个表格:

    clipboard.png
    (方法统计表格)
    有四栏数据,分别是:方法名称,方法调用次数,包含子方法的调用时间,不包含子方法的调用时间。


总结一下


其实一开始写这篇文章之前,Method tracing的好多功能我都不知道是什么。想着要记录一下终于使用这个工具达到了我的目的,然后记录下来这个过程。写文章的过程中,反而发现很多东西都不懂,这就需要去查资料。结果就真的查出了好多恍然大悟的知识点。每次写完一篇文章都收获很大,要告诉自己记住这样的感觉,以后有所收获一定要不怕麻烦,把它换成文字,一来记录自己的所得,二来可以梳理这些知识点,甚至有时候可以得到写文章以前不知道的东西。

<think>首先,用户的问题是:“我想理解Android系统中的Trace概念及其用途 请问Android系统中Trace的作用及使用场景”。这需要我从提供的引用中提取相关信息,并结合我的知识来回答。 关键点: - 回答必须使用中文。 - 结构清晰,逐步解决问题。 - 确保真实可靠。 - 引用站内引用时,在末尾添加引用标识。 - 数学表达式使用$...$或$$...$$格式(但这个问题可能不涉及数学,所以可能不需要)。 - 最后生成相关问题。 回顾提供的引用: - [^1]: Trace工具对于Android性能开发的同仁来说是绝对重要的,没有之一,因为它能够帮助我们分析各个CPU的运行状态和运行的任务,可以通过这些信息来判定系统中各个进程之间的关系,能够从毫秒级跟踪系统的各个进程的状态。 - [^2]: 使用TraceView主要有两种方式:最简单的方式是直接打开DDMS,选择进程开始跟踪;第二种是使用android.os.Debug.startMethodTracing()和stopMethodTracing()方法生成trace文件。 - [^3]: Android Studio中System Trace新增功能,将所有线程活动整合到同一个视图中,显示线程状态和调用图。 - [^4]: Android系统抓trace方法使用python脚本记录trace文件。 - [^5]: 一个onClick方法的引用,可能无关紧要。 从引用中提取核心信息: - TraceAndroid中用于性能分析,帮助开发者跟踪CPU、进程线程的状态。 - 使用场景包括:分析系统性能、调试卡顿问题、优化应用程序。 - 工具如TraceView、System TraceAndroid Studio中可用。 - 抓取trace方法有多种,包括DDMS、代码调用和脚本。 我的回答结构: 1. **介绍Trace的概念**:解释什么是TraceAndroid系统中的含义。 2. **Trace的作用**:详细说明其用途。 3. **使用场景**:列出常见场景。 4. **如何使用**:简要介绍方法,参考引用。 5. **结尾**:自然地结束。 6. **生成相关问题**:在末尾添加“§§相关问题§§”部分。 确保语言自然、中文。 最终输出格式: - 回答部分。 - 然后是相关问题。 现在,构建回答: - **开头**:直接回应问题,定义Trace。 - **主体**:逐步解释作用和使用场景。 - **引用**:在相关部分添加引用标识。 - **结尾**:总结或过渡到相关问题。 相关问题示例: 1. 如何在不同Android版本中抓取trace? 2. Trace工具在性能优化中的具体应用? 3. 如何解读trace文件中的数据?</think>### Android系统中的Trace概念及其用途 在Android开发中,Trace(跟踪)是一个核心的性能分析工具,它允许开发者记录和查看系统或应用程序在运行时的详细行为。Trace本质上是一种数据采集机制,通过捕获CPU、线程进程和系统事件(如调度、内存分配等)的时间戳信息,生成一个详细的日志文件(通常为`.trace`或`.perfetto-trace`格式)。这有助于开发者从毫秒级精度分析系统状态,诊断性能瓶颈,并优化代码。以下我将逐步解释Trace的作用和使用场景,确保内容基于可靠的技术文档和实践经验。 #### 1. **Trace的作用** TraceAndroid系统中扮演着关键角色,主要用于性能监控和调试: - **性能分析**:Trace能记录各个CPU核心的运行状态、线程任务调度和进程活动,帮助开发者识别卡顿、高负载或资源争用问题。例如,通过分析trace文件,可以精确找出哪些方法或系统调用导致了延迟,从而优化代码效率[^1]。 - **系统诊断**:Trace提供系统级事件的跟踪,如进程间通信(通过Binder驱动)、图形渲染(GPU活动)和内存管理。这使开发者能判定进程间的关系,检测死锁或异常行为,提升系统稳定性[^1][^3]。 - **调试辅助**:在开发过程中,Trace用于复现和定位难以捕捉的bug,如UI卡顿或ANR(Application Not Responding)错误。通过可视化工具(如Android Studio的System Trace),开发者能直观查看线程状态和调用图,加速问题解决[^2][^3]。 #### 2. **Trace使用场景** TraceAndroid开发中应用广泛,常见于以下场景: - **性能优化**:当应用程序出现卡顿或响应慢时,开发使用Trace记录运行时的CPU和线程活动。例如,在游戏或高负载应用中,通过分析trace文件,优化算法或减少不必要的资源消耗[^1][^4]。 - **系统级调试**:在系统开发中(如定制ROM或车机系统),Trace用于监控底层行为,如调度器(sched)、内存管理(memory)和硬件抽象层(hal)。这有助于确保系统高效运行,尤其在资源受限的设备上[^4]。 - **应用开发与测试**:开发者集成Trace到代码中,例如使用`android.os.Debug.startMethodTracing()`方法在关键路径插入跟踪点。这在测试登录界面、动画渲染或网络请求时非常有用,能快速定位性能热点[^2][^5]。 - **多线程分析**:现代Android Studio的System Trace功能将所有线程活动整合到一个视图中,便于分析线程繁忙程度和调用关系。这对于调试并发问题(如线程阻塞)至关重要[^3]。 #### 3. **如何使用Trace** Trace使用方法多样,主要分为工具型和代码型: - **工具型方法**:通过Android Studio或DDMS(Dalvik Debug Monitor Server)直接操作。例如: - 打开DDMS,选择目标进程,点击“Start Method Profiling”按钮开始记录,操作后停止生成trace文件进行分析[^2]。 - 在Android Studio中,使用System Trace功能自动排序线程,并可视化事件时间线[^3]。 - **代码型方法**:在应用程序中嵌入Trace调用: ```java // 开始记录trace android.os.Debug.startMethodTracing("my_trace"); // 执行关键代码 // ... // 停止记录 android.os.Debug.stopMethodTracing(); ``` 生成的trace文件默认存储在/sdcard目录,可通过adb导出到电脑分析[^2][^4]。 - **脚本与命令行**:对于系统级跟踪,使用脚本如`record_android_trace.py`,指定参数(如跟踪时长和缓冲区大小)抓取事件: ``` python3 record_android_trace -o trace.perfetto-trace -t 10s -b 32mb sched freq idle ``` 这适用于批量测试或自动化场景[^4]。 总之,TraceAndroid性能开发的基石,它通过毫秒级跟踪提供深入洞察,帮助开发者提升应用和系统效率。实际使用时,建议结合Android Studio工具和代码集成,以覆盖不同调试需求[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值