Android 内存分析工具集【7】Android Systrace

article/2025/9/20 6:56:05

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

一、Systrace 简介

Systrace 允许你收集和检查设备上运行的所有进程的计时信息。 它包括Androidkernel的一些数据(例如CPU调度程序,IO和APP Thread),并且会生成HTML报告,方便用户查看分析trace内容。

二、Systrace 使用方法

1. Systrace 的作用

如果想分析Android系统或者某个app的卡顿性能或者渲染问题,这时候Systrace 就非常有用。
首先我们需要抓取Systrace文件,然后分析并找出引起系统卡顿,或者app反应慢的原因,最好在源码上解决引起卡顿、响应慢的问题。

2. 抓取Systrace 的方法

抓取Systrace的方法如下:

    1. 链接手机,打开DDMS

首先链接手机,打开Android Device Monitor,选择要分析的进程(比如com.google.process.gapps),点击Capture system wide trace using Android systrace(下图右上角箭头所指的地方)

抓取Systrace的方法

    1. 配置需要抓取Systrace的内容

此时根据不同的卡顿问题需求,我们配置抓取不同的trace。 抓取的Systrace时间请勿过长,否则会导致抓取内容部分丢失,然后点击OK,操作要分析系统卡顿或app运行缓慢的部分,系统会自动收集运行时的信息,然后用Chrome 浏览器打开生成的trace 文件 。

根据不同的需求,配置抓取不同的trace 时间,内容等

    1. 抓取过多次trace,请及时清理缓存

假如抓取过多次trace,为避免数据丢失,请及时清除缓存中的内容,清理地方在 Android Device Monitor的右下角,如下图所示

及时清除缓存中的信息,防止抓取trace内容无效

    1. 使用Chrome 分析trace

Chrome 浏览器打开生成的trace 文件,如下图所示,里面会包含每个CPU,以及图形渲染,输入事件等等内容。

用Chrome 浏览器打开生成的trace 文件

抓取的Trace报告提供了Android系统进程在特定时间段内的整体情况。 例如在显示Activity或动画时卡顿,Systrace会提供关于如何解决这些问题的建议。
但是,systrace不会在应用程序进程中收集有关代码执行的信息。 有关您的应用程序执行哪些方法以及使用多少CPU资源的更多详细信息,请使用Android Studio的内置CPUProfiler,或生成跟踪日志并使用Traceview查看它们。

五、使用Systrace 检测卡顿丢帧问题

如下Systrace报告列出了每个进程呈现UI frame,并显示沿着时间线的每个渲染帧。 在绿色框架圆圈中,是指在16.6ms内呈现每秒稳定60帧。 花费16.6ms以上渲染的帧用黄色红色圆圈表示。

UI渲染帧率查看

在运行Android 5.0(API级别21)或更高版本的设备上, UI 渲染的工作主要由UI ThreadRenderThread两个线程完成。 在之前的版本中,创建渲染框架的所有工作都是在UI Thread上完成的。

点击一个F圆圈,它可以提供系统为渲染该frame 完成所包含的工作信息,包括警报,丢帧,建议等。
同时它还向您展示了在渲染该frame时系统正在执行的方法,因此您可以调查这些方法是否导致UI jank

点击黄色或红色帧按钮,会分析提示此帧卡顿的信息

选择黄色的frame后,您可能会在报告的底部窗格中看到如上提示信息。
上图中显示的Alert , 主要问题是在ListView回收和重新bind中花费了太多的时间。 trace中有相关事件的链接,点击可以获取更多关于系统在这段时间内正在做什么的事情。

要查看Systrace中发现的每个Alert以及设备触发Alert的次数,请单击窗口最右侧的Alerts选项卡,如下图所示。
Alerts面板可帮助您查看发生了哪些问题,以及发生的频率。 将Alert面板看作是要修复的错误列表, 通常情况下,一个区域的微小变化或改进就可以消除应用程序中的全部Alert。

Alert 分析面板

Frame Input File Metrics Alerts 等面板

如果你的代码在UI Thread上做太多的工作,你需要找出哪些方法消耗了太多的CPU时间
一种方法是添加systrace(请参阅检测应用代码)到您认为会导致这些卡顿或者导致慢的方法地方,然后查看这些函数调用是否显示在systrace中。 如果您不确定哪些方法可能会在UI线程上造成卡顿,请使用Android Studio的内置CPU Profiler,或者生成跟踪日志并使用Traceview查看它们。

七、代码中添加trace 标记方法

补充1 

7.1 Debug启动速度分析使用的是 Android SDK 提供的一个 Debug 类,调用 Debug 的 startMethodTracing() 可以跟踪接下来的一段时间内 CPU 的使用情况,在调用 stopMethodTracing() 方法后,会生成一个文件,我们可以通过 CPU Profiler 查看该文件中记录的在启动过程中都有哪些线程执行了哪些方法,包括各个方法的耗时Debug 的缺点是开销非常大,有可能影响启动测试结果

7.2   Trace 也是 Android SDK 中的一个类,与 Debug 相比,Trace 除了能看到启动过程中各个方法的耗时,还能看到各个 CPU 的时间片使用情况Trace 的优点是开销小,只会在埋点区间记录,而且可以直观地看到 CPU 利用率,我们可以根据报告分析一下要不要开更多线程提升程序执行性能,提升 CPU 利用率。

3. Debug 与 Trace 的两个区别

  • 查看工具

    Debug 分析结果要使用 Profiler 查看。

    Trace 分析结果是在浏览器查看 HTML 文件。

  • 埋点工具类

    Debug 使用的是 Debug.startMethodTracing()。

    Trace 用的是 Trace.beginSection() 和 TraceCompat.beginSection()。


由于systrace是在系统级显示有关进程的信息,因此很难在HTML报告中查看某个特定时间内,您的应用程序正在执行什么方法。 在Android 4.3(API级别18)及更高版本中,您可以使用代码中的Trace类在HTML报告中标记执行事件。 您不需要用代码来记录systrace的跟踪记录,这样做可以帮助您查看app代码的哪些部分可能导致线程hung或UI丢帧。 但是这种方法与使用Debug类不同,Trace类简单地将标志添加到systrace报告中,而Debug类可帮助您生成.trace文件,并且检查app CPU使用情况。

要生成包含已检测的跟踪事件的systrace HTML报告,需要使用-a--app命令行选项运行systrace,并指定应用程序的包名称。

通常我们在怀疑引起jank代码地方,添加如下内容:
Trace.beginSection("MyAdapter.onCreateViewHolder");
Trace.endSection(); 可以查看自定义的从开始到结束期间的Systrace信息。这两个是成对出现的,需要注意一下。

代码举例

多次调用beginSection(String)时,调用endSection()只会结束最近调用的beginSection(String)方法。 因此,对于嵌套的调用,例如上面示例中的调用,您需要确保通过调用endSection()将每个调用正确匹配到beginSection()

此外,您不能在一个线程上调用beginSection()并从另一个线程结束 - 您必须从同一线程调用endSection()

八、使用TraceView 分析trace Log

Traceview是提供Systrace的图形显示工具。 您可以通过使用Debug类来设置代码来生成log。 这种跟踪方法非常精确,因为您可以准确指定要启动的代码中的哪个位置,并停止记录Systrace数据。 使用Traceview检查这些log可帮助您调试您的应用程序并剖析其性能。

另外,可以使用命令行中的dmtracedump来生成跟踪日志文件的图形调用堆栈图。

如果您不需要查看通过使用Debug类检测应用程序来记录的Systrace日志,则可以使用Android Studio 3.0及更高版本中包含的CPU Profiler来查看应用程序的线程和记录方法跟踪。

1.trace Log 的打开方法

使用Android Device Monitor可以查看trace Log内容,步骤如下,打开Android Device Monitor,选择File,然后打开*.trace log分析。
当然,你也可以使用Android Device Monitor 的图形按键进行trace的抓取与查看。

使用Android Device Monitor 查看trace Log

2.Trace log 的分析

打开Trace log后,Traceview使用以下两个窗格显示log数据:

    1. 时间轴窗格:
      描述每个线程何时进入和退出方法的时间轴窗格
    1. 配置文件窗格:
      总结每个线程在跟踪日志的执行期间的配置文件窗格
      以下各节提供有关traceview输出窗格的附加信息。

3.Trace log 时间轴窗格

每个线程的执行都显示在自己的进程中,并且时间向右增加。 每种方法都以不同的颜色显示。 第一行下方的细线显示所选方法的子项(从入口到出口),如下图所示。

时间轴窗格

4.Trace log配置文件窗格

如下图所示,配置文件窗格提供了系统在Systrace期间每种方法的执行的列表以及耗时。

另外,调用另一个方法的方法称为父级方法,父级调用的方法称为其子级。 当您通过单击方法选择一种方法时,它会在两个单独的节点下显示其父项和子项。

对于配置文件窗格中的每个顶级节点,表中的Calls + RecCalls / Total列(图2中未显示)将显示该方法调用次数和递归调用次数。或者,对于父级和子级方法,此列显示方法在顶级节点中是方法的子级或父级的调用次数。

Trace log配置文件窗格

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!



作者:程序员Android1
链接:https://www.jianshu.com/p/75aa88d1b575
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


http://chatgpt.dhexx.cn/article/mJTROOCg.shtml

相关文章

小米8刷入LineageOS17.1

从来如此,便对吗? —鲁迅 XDA论坛原帖 1.首先解BL锁 详见解BL锁 2.下载资源 下载LineageOS 17.1直接下载最新版就行了 下载MIUI Q based firmware(推荐) 谷歌云盘(不推荐) 下载OPEN GAPPS(推…

如何优雅的使用GMS,为此我做了个食用Google服务的magisk microG懒人模块。

如何优雅的使用GMS,为此我做了个食用Google服务的magisk懒人包。 开端 其实吧,我对google服务的需求并不大,我主要就是在play store下下软件,同步同步通讯录和用Google相机,所以我就在magisk仓库找到了microG体验了一…

Android开发百科全书①

友情提示根据目录 快速查找问题 %1$s %1$d Android string 1、整型&#xff0c;比如“我今年23岁了”&#xff0c;这个23是整型的。在string.xml中可以这样写&#xff0c;<string name"old">我今年%1$d岁了</string> 在程序中&#xff0c;使用 [java] …

【exthmui】【红米9】红米9类原生系统 exthmui 使用体验

ExTHmui 前言特性简洁 清爽流畅亮点 不足后台Gapps时不时系统界面无响应屏幕闪烁亮度终端 后记 前言 设备&#xff1a;红米9 464 exthmui版本&#xff1a;见下图 底包&#xff1a;V12.0.1.0.RJCMIXM ⚠本文所述的一切内容均基于本人实际使用体验&#xff0c;不吹不黑&#xff…

安卓玩机搞机-----没有第三方包 刷写第三方各种GSI系统 体验非官方系统

很多安卓友友热衷与刷这些各种第三方包体验。但有个别机型第三方资源较少。而且有的机型要体验非官方系统却没有对应系统的第三方包。那可以体验下刷gsi系统来畅玩。今天的帖子就聊聊GSI系统的各种刷写操作和对应的故障解析、 &#x1f494;&#x1f494;&#x1f494;&#x…

Windows 10 安装安卓子系统 WSA(Magisk/KernelSU)使用 WSA 工具箱安装 APK

from https://blog.zhjh.top/archives/XokySA7Rc1pkVvnxAEP5E 前提是系统为 Windows 10 22H2 10.0.19045.2311 或更高版本&#xff0c;尽量新。 步骤 使用 WSAPatch 和 MagiskOnWSALocal 安装 WSA 在 Microsoft Store 中安装 Ubuntu LTS&#xff08;或你喜欢的发行版&#xf…

AndroidThings之基础二 设计理念

转载自&#xff1a;https://blog.csdn.net/tangxiaoyin/article/details/75273491 (PS:目前AndroidThings已经走向消费级别&#xff0c;发布正式版本1.0版&#xff0c;开发板推荐树莓派3B) 【CSDN 编者按】Android Things 是 Google 在 2016 年底推出的基于物联网的操作系统…

Android 9.0 TV版导入GMS组件以及Google Play

一、Android P之后的差异 参照phone版本整理出一版适合电视或者电视盒子相关GMS框架导入方法 可查看GMS P Initial Release Notes 了解&#xff1a; 1、P上增加了一些core app &#xff1a;AndroidPlatformServices、GoogleRestore、Device Health Services (Turbo) 2、Goo…

Android 玩机指南详细汇总(刷机、root、Xposed等)

点击上方“程序员大咖”&#xff0c;选择“置顶公众号” 关键时刻&#xff0c;第一时间送达&#xff01; 目录 Android 系统简介Android 系统版本Android API 等级基于原生安卓的定制系统第三方 ROMOEM 定制 ROM无处不在的 Android 系统任何人都可以免费为安卓系统开发应用安卓…

【LineageOS】编译安装及windows下推送更新记录

【LineageOS】编译安装及windows下推送更新记录 背景说明编译安装GApps 安装windows下推送更新 背景说明 AOSP装谷歌服务&#xff0c;遇到很多问题&#xff0c;于是选择其它的rom&#xff0c;之前装了piexlExperience没有成功&#xff0c;后来又换了LineageOS&#xff0c;终于…

iOS 和 Android 的后台推送原理各是什么?有什么区别?

2019独角兽企业重金招聘Python工程师标准>>> 郑紫阳&#xff0c;ziyangzhihu.com 炉门、尘规、陈汤姆 等人赞同 • 收录于 知乎周刊 iOS 系统的推送&#xff08;APNS&#xff0c;即 Apple Push Notification Service&#xff09;依托一个或几个系统常驻进程运作&…

android 版本选择,谷歌服务框架版本如何选择 我该下载哪个版本解析

谷歌服务框架版本如何选择 我该下载哪个版本解析 来源&#xff1a;www.18183.com作者&#xff1a;似水流年时间&#xff1a;2017-06-29 谷歌服务框架版本如何选择呢&#xff1f;本文小编为您带来谷歌服务框架版本如何选择 我该下载哪个版本解析。 谷歌服务框架版本如何选择呢?…

GAPPS版本区别

细雨灯花落&#xff0c;泪眼若为容。 Open Gapps GAPPS是谷歌软件服务集合&#xff08;Google Apps&#xff09;的缩写形式。由于移动设备生产厂商的某些限制&#xff0c;一些运行Android系统的设备没有安装谷歌服务框架。这类设备在无法运行一些基于谷歌服务框架开发的应用软…

线性代数(矩阵和向量)

目录 矩阵和向量加法和标量乘法矩阵向量乘法矩阵乘法矩阵乘法特征逆和转置 矩阵和向量 矩阵&#xff1a; 下图为一个R(4x2)和一个R(2x3)的矩阵 矩阵优点&#xff1a;快速整理&#xff0c;索引和访问大量数据。 向量&#xff1a; 下图为一个R(4)的向量 加法和标量乘法 加…

线性代数(7):矩阵的应用

一、简化矩阵 &#xff08;1&#xff09;阶梯形矩阵 1.1.1 定义 a. 如果矩阵有零行&#xff08; 元素全为 0 的行 &#xff09;&#xff0c; 零行 全在下面&#xff1b; b. 各非零行的第一个非零元素列标随行标增大而增大&#xff1b; 1.1.2 展示 下图两个矩阵都是阶梯矩阵 …

线性代数之矩阵

矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集合&#xff0c;矩阵是许多学科中常用的数学工具。 1 矩阵运算 m*n个数aij(i1,2,...,m;j1,2,...,n)排成m行n列的矩形数表&#xff1a; 称为m*n矩阵&#xff0c;一般记为Am*n。 元素是实数就是实矩阵&…

线性代数2:矩阵(1)

目录 矩阵&#xff1a; 矩阵的定义&#xff1a; 0矩阵 方阵 同型矩阵&#xff1a; 矩阵相等的判定条件 矩阵的三则运算&#xff1a; 乘法的适用条件 矩阵与常数的乘法&#xff1a; 矩阵的乘法&#xff1a; 矩阵的乘法法则&#xff1a; Note1&#xff1a; Note2&…

线性代数:矩阵运算之乘法?

线性代数&#xff1a;矩阵运算之乘法&#xff1f; 分步阅读 授人予鱼不如授人予渔&#xff0c;在《线性代数》的学习中&#xff0c;方法尤为重要。下面就让我们一起解决《线性代数》中令人头痛的——矩阵的乘法运算吧&#xff01; 如果您对——矩阵乘法的学习比较吃力&#…

线性代数:矩阵及其运算

总体结构图&#xff1a; 矩阵的定义&#xff1a; 由m*n个数&#xff0c;组成的m行n列的表格&#xff08;注意&#xff0c;这里的表格&#xff0c;表明了矩阵和行列式的本质区别&#xff0c;行列式本质桑是一个数&#xff0c;并且行列式一定是方方正正的&#xff0c;行数和列数…

3.线性代数-矩阵

矩阵和Tensor 1. Tensor2.矩阵3.线性代数正确打开方式3.1 行视图3.2 列视图 4.线性相关和线性无关5. Span、基和子空间(Subspace)6.四个基本的子空间6.1 列空间6.2 零空间6.3 行空间6.4 左零空间6.5 四个基本子空间的关系 7.可逆矩阵8.方阵的特征值与特征向量9.特征分解9.1一般…