Android Systrace 使用方法
ztj100 2024-11-22 00:12 36 浏览 0 评论
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android
Systrace允许您在系统级别收集和检查设备上运行的所有进程的计时信息。 它将来自Android内核的数据(例如CPU调度程序,磁盘活动和应用程序线程)组合起来,以生成HTML报告。
本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:
- Systrace 简介
- Systrace 使用方法
- 使用命令行抓取 Systrace
- 使用Systrace 检测UI 性能
- 使用Systrace 检测警告以及掉帧问题
- 查看trace 文件的快捷键
- 代码中添加trace 标记具体分析问题所在
- 使用TraceView 分析trace Log
1.Systrace 简介
Systrace 允许您在系统级别收集和检查设备上运行的所有进程的计时信息。 它将来自Android内核的数据(例如CPU调度程序,磁盘活动和应用程序线程)组合起来,以生成HTML报告。
2.Systrace 使用方法
抓取Systrace 的方法
如果想分析Android系统或者app的问题,首先我们需要抓取Systrace文件分析并找出引起系统卡顿,或者app反应慢的原因,然后在源码上解决引起慢的问题。
抓取Systrace 的方法:
- 首先链接手机,打开Android Device Monitor,选择要分析的进程(比如com.google.process.gapps),点击Capture system wide trace using Android systrace(下图右上角箭头所指的地方)
抓取Systrace的方法
- 配置需要抓取Systrace的内容
此时根据不同的需求,配置抓取不同的trace 时间(时间请勿过长,否则会导致抓取内容部分丢失),内容等,然后点击OK,操作要分析系统卡顿或app运行缓慢的部分,系统会自动收集运行时的信息,然后用Chrome 浏览器打开生成的trace 文件 。
根据不同的需求,配置抓取不同的trace 时间,内容等
注意:
假如抓取过多次trace,为避免数据丢失,请及时清除缓存中的内容,清理地方在 Android Device Monitor的右下角,如下图所示
及时清除缓存中的信息,防止抓取trace内容无效
用Chrome 浏览器打开生成的trace 文件,如下图所示,里面会包含每个CPU,以及图形渲染,输入事件等等内容。
用Chrome 浏览器打开生成的trace 文件
抓取的Trace报告提供了Android系统进程在特定时间段内的整体情况。 它检查捕获的跟踪信息,并突出显示其检查到的问题,例如在显示运动或动画时UI粗糙,并提供关于如何解决这些问题的建议。
但是,systrace不会在应用程序进程中收集有关代码执行的信息。 有关您的应用程序执行哪些方法以及使用多少CPU资源的更多详细信息,请使用Android Studio的内置CPU分析器,或生成跟踪日志并使用Traceview查看它们。
3.使用命令行抓取 Systrace
本文档介绍了如何从命令行生成systrace报告,浏览由该工具生成的跟踪文件,并使用它们来分析和提高应用程序用户界面(UI)的性能。
抓取systrace之前,请完成以下步骤:
- 下载并安装Android SDK Tools
- 安装Python ,并将其包含在工作站的执行路径中。
- 连接手机,打开开发者选项中的USB Debug选项 。
- Systrace存储路径如下android-sdk/platform-tools/systrace/
使用命令行抓取 Systrace的语法如下:
python systrace.py [options] [categories]
例如,以下命令调用systrace在10秒钟内记录设备进程,包括图形进程,并生成一个名为mynewtrace的HTML报告:
python systrace.py --time=10 -o mynewtrace.html gfx
如果不指定任何类别或选项,systrace将生成包含所有可用类别的报告,并使用默认设置。 可用的类别取决于您使用的连接设备。
Global options
Commands and command options
4.使用Systrace 检测UI 性能
systrace对于检查应用程序的UI性能特别有用,因为它可以分析您的代码和帧速率以识别问题区域并提供可能的解决方案。 开始,按照以下步骤进行:
- 连接手机并运行您的app。
- 使用以下命令运行systrace:
- python systrace.py view --time = 10
- 操作您的应用 10秒后,systrace生成一个HTML报告。
- 使用网络浏览器打开HTML报告。
您现在可以与报告进行交互,以便在记录期间检查设备CPU使用情况。 以下部分介绍如何检查报告中的信息以查找和修复UI性能问题。
5. 使用Systrace 检测警告以及掉帧问题
如下报告列出了每个进程呈现UI帧,并指示沿着时间线的每个渲染帧。 在绿色框架圆圈中指示在16.6毫秒内呈现的帧以保持每秒稳定60帧。 花费16.6毫秒以上渲染的帧用黄色或红色框圈表示。
UI渲染帧率查看
注意:
在运行Android 5.0(API级别21)或更高版本的设备上, UI 渲染的工作是在UI Thread和RenderThread两个线程完成。 在之前的版本中,创建框架的所有工作都是在UI Thread上完成的。
点击一个F框架圈可以提供有关系统为渲染该框架而完成的工作的其他信息,包括警报。 它还向您展示了在渲染该框架时系统正在执行的方法,因此您可以调查这些方法是否导致UI jank。
点击黄色或红色帧按钮,会分析提示此帧卡顿的信息
选择慢帧后,您可能会在报告的底部窗格中看到警报。 上图中显示的Alert提出,框架的主要问题是在ListView回收和重新绑定中花费了太多的时间。 跟踪中有相关事件的链接可以解释更多关于系统在这段时间内正在做什么的事情。
要查看工具在trace中发现的每个Alert以及设备触发Alert的次数,请单击窗口最右侧的Alerts选项卡,如下图所示。
Alerts面板可帮助您查看发生了哪些问题,以及发生的频率。 将Alert面板看作是要修复的错误列表, 通常情况下,一个区域的微小变化或改进可以消除应用程序中的全部警报。
Alert 分析面板
Frame Input File Metrics Alerts 等面板
如果你在UI Thread上做太多的工作,你需要找出哪些方法消耗了太多的CPU时间。
一种方法是添加跟踪标记(请参阅检测应用代码)到您认为会导致这些瓶颈的方法,以查看这些函数调用是否显示在systrace中。 如果您不确定哪些方法可能会在UI线程上造成瓶颈,请使用Android Studio的内置CPU分析器,或者生成跟踪日志并使用Traceview查看它们。
6. 查看trace 文件的快捷键
查看trace 文件的快捷键如图
7. 代码中添加trace 标记具体分析问题所在
由于systrace是在系统级显示有关进程的信息,因此很难在HTML报告中的某个特定时间知道您的应用程序正在执行什么方法。 在Android 4.3(API级别18)及更高版本中,您可以使用代码中的Trace类在HTML报告中标记执行事件。 您不需要用代码来记录systrace的跟踪记录,但是这样做可以帮助您查看应用程序代码的哪些部分可能会导致线程挂起或UI断线。 这种方法与使用Debug类不同,Trace类简单地将标志添加到systrace报告中,而Debug类可帮助您通过生成.trace文件来检查详细的app CPU使用情况。
要生成包含已检测的跟踪事件的systrace HTML报告,需要使用-a或--app命令行选项运行systrace,并指定应用程序的包名称。
通常我们在怀疑引起jank代码地方,添加如下内容:
Trace.beginSection("MyAdapter.onCreateViewHolder");
和 Trace.endSection(); ,主要这两个是成对出现的。
代码举例
多次调用beginSection(String)时,调用endSection()只会结束最近调用的beginSection(String)方法。 因此,对于嵌套的调用,例如上面示例中的调用,您需要确保通过调用endSection()将每个调用正确匹配到beginSection()。
此外,您不能在一个线程上调用beginSection()并从另一个线程结束 - 您必须从同一线程调用endSection()。
8. 使用TraceView 分析trace Log
Traceview是提供跟踪日志的图形表示的工具。 您可以通过使用Debug类来设置代码来生成日志。 这种跟踪方法非常精确,因为您可以准确指定要启动的代码中的哪个位置,并停止记录跟踪数据。 如果尚未生成这些跟踪日志并将其从连接的设备保存到本地计算机,请转至通过检测应用程序生成跟踪日志。 使用Traceview检查这些日志可帮助您调试您的应用程序并剖析其性能。
提示:可以使用命令行中的dmtracedump来生成跟踪日志文件的图形调用堆栈图。
如果您不需要查看通过使用Debug类检测应用程序来记录的跟踪日志,则可以使用Android Studio 3.0及更高版本中包含的CPU分析器来查看应用程序的线程和记录方法跟踪。
使用Android Device Monitor可以查看trace Log内容,步骤如下,打开Android Device Monitor,选择File,然后打开*.trace log分析。
当然,你也可以使用Android Device Monitor 的图形按键进行trace的抓取与查看。
使用Android Device Monitor 查看trace Log
打开跟踪日志后,Traceview使用以下两个窗格显示日志数据:
- 时间轴窗格:
- 描述每个线程何时进入和退出方法的时间轴窗格
- 配置文件窗格:
- 总结每个线程在跟踪日志的执行期间的配置文件窗格
- 以下各节提供有关traceview输出窗格的附加信息。
1.时间轴窗格
每个线程的执行都显示在自己的进程中,并且时间向右增加。 每种方法都以不同的颜色显示。 第一行下方的细线显示所选方法的子项(从入口到出口),如下图所示。
时间轴窗格
2. 配置文件窗格
如下图所示,配置文件窗格提供了系统在跟踪日志期间执行的每种方法的列表以及执行这些方法所用的时间。
调用另一个方法的方法称为父级方法,父级调用的方法称为其子级。 当您通过单击方法选择一种方法时,它会在两个单独的节点下显示其父项和子项。
对于每种方法(顶级节点),该表都显示包含和排他时间(以毫秒为单位)以及总时间的百分比。独占时间是执行方法自己的代码的时间,而包含时间是执行方法自己的代码的时间加上执行子程序的时间。定时信息也以CPU时间和实时的方式报告。 CPU时间只考虑线程主动使用CPU时间的时间,实时提供绝对时间信息,从您的应用程序进入方法的时刻到退出该方法的时间 - 无论线程处于活动状态还是休眠状态。
对于配置文件窗格中的每个顶级节点,表中的Calls + Rec,Calls / Total列(图2中未显示)将报告该方法的调用次数和递归调用次数。或者,对于父级和子级方法,此列显示方法在顶级节点中是方法的子级或父级的调用次数。
image.png
Traceview 已知问题
Traceview日志记录不能很好地处理线程,导致以下问题:
- 1.如果线程在分析期间退出,线程名称不会被发射(在Android 5.1及更高版本中被修复)。
- 虚拟机重用线程ID。 如果一个线程停止,另一个线程开始,他们可能会得到相同的ID。
相关推荐
- sharding-jdbc实现`分库分表`与`读写分离`
-
一、前言本文将基于以下环境整合...
- 三分钟了解mysql中主键、外键、非空、唯一、默认约束是什么
-
在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。...
- MySQL8行级锁_mysql如何加行级锁
-
MySQL8行级锁版本:8.0.34基本概念...
- mysql使用小技巧_mysql使用入门
-
1、MySQL中有许多很实用的函数,好好利用它们可以省去很多时间:group_concat()将取到的值用逗号连接,可以这么用:selectgroup_concat(distinctid)fr...
- MySQL/MariaDB中如何支持全部的Unicode?
-
永远不要在MySQL中使用utf8,并且始终使用utf8mb4。utf8mb4介绍MySQL/MariaDB中,utf8字符集并不是对Unicode的真正实现,即不是真正的UTF-8编码,因...
- 聊聊 MySQL Server 可执行注释,你懂了吗?
-
前言MySQLServer当前支持如下3种注释风格:...
- MySQL系列-源码编译安装(v5.7.34)
-
一、系统环境要求...
- MySQL的锁就锁住我啦!与腾讯大佬的技术交谈,是我小看它了
-
对酒当歌,人生几何!朝朝暮暮,唯有己脱。苦苦寻觅找工作之间,殊不知今日之事乃我心之痛,难道是我不配拥有工作嘛。自面试后他所谓的等待都过去一段时日,可惜在下京东上的小金库都要见低啦。每每想到不由心中一...
- MySQL字符问题_mysql中字符串的位置
-
中文写入乱码问题:我输入的中文编码是urf8的,建的库是urf8的,但是插入mysql总是乱码,一堆"???????????????????????"我用的是ibatis,终于找到原因了,我是这么解决...
- 深圳尚学堂:mysql基本sql语句大全(三)
-
数据开发-经典1.按姓氏笔画排序:Select*FromTableNameOrderByCustomerNameCollateChinese_PRC_Stroke_ci_as//从少...
- MySQL进行行级锁的?一会next-key锁,一会间隙锁,一会记录锁?
-
大家好,是不是很多人都对MySQL加行级锁的规则搞的迷迷糊糊,一会是next-key锁,一会是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加...
- 一文讲清怎么利用Python Django实现Excel数据表的导入导出功能
-
摘要:Python作为一门简单易学且功能强大的编程语言,广受程序员、数据分析师和AI工程师的青睐。本文系统讲解了如何使用Python的Django框架结合openpyxl库实现Excel...
- 用DataX实现两个MySQL实例间的数据同步
-
DataXDataX使用Java实现。如果可以实现数据库实例之间准实时的...
- MySQL数据库知识_mysql数据库基础知识
-
MySQL是一种关系型数据库管理系统;那废话不多说,直接上自己以前学习整理文档:查看数据库命令:(1).查看存储过程状态:showprocedurestatus;(2).显示系统变量:show...
- 如何为MySQL中的JSON字段设置索引
-
背景MySQL在2015年中发布的5.7.8版本中首次引入了JSON数据类型。自此,它成了一种逃离严格列定义的方式,可以存储各种形状和大小的JSON文档,例如审计日志、配置信息、第三方数据包、用户自定...
你 发表评论:
欢迎- 一周热门
-
-
MySQL中这14个小玩意,让人眼前一亮!
-
旗舰机新标杆 OPPO Find X2系列正式发布 售价5499元起
-
【VueTorrent】一款吊炸天的qBittorrent主题,人人都可用
-
面试官:使用int类型做加减操作,是线程安全吗
-
C++编程知识:ToString()字符串转换你用正确了吗?
-
【Spring Boot】WebSocket 的 6 种集成方式
-
PyTorch 深度学习实战(26):多目标强化学习Multi-Objective RL
-
pytorch中的 scatter_()函数使用和详解
-
与 Java 17 相比,Java 21 究竟有多快?
-
基于TensorRT_LLM的大模型推理加速与OpenAI兼容服务优化
-
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)