Android Framework 框架之 Systrace 性能分析工具

本文详细介绍Systrace工具的使用方法,包括命令行抓取、检测UI性能、分析警告及掉帧问题,以及如何利用TraceView分析跟踪日志,帮助开发者有效提升Android应用性能。

640?wx_fmt=gif

640?wx_fmt=gif

极力推荐Android 开发大总结文章:欢迎收藏程序员Android 力荐 ,Android 开发者需要的必备技能

640?wx_fmt=jpeg

Systrace允许您在系统级别收集和检查设备上运行的所有进程的计时信息。 它将来自Android内核的数据(例如CPU调度程序,磁盘活动和应用程序线程)组合起来,以生成HTML报告。

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

  1. Systrace 简介

  2. Systrace 使用方法

  3. 使用命令行抓取 Systrace

  4. 使用Systrace 检测UI 性能

  5. 使用Systrace 检测警告以及掉帧问题

  6. 查看trace 文件的快捷键

  7. 代码中添加trace 标记具体分析问题所在

  8. 使用TraceView 分析trace Log

1.Systrace 简介

Systrace 允许您在系统级别收集和检查设备上运行的所有进程的计时信息。 它将来自Android内核的数据(例如CPU调度程序,磁盘活动和应用程序线程)组合起来,以生成HTML报告。

2.Systrace 使用方法

抓取Systrace 的方法

如果想分析Android系统或者app的问题,首先我们需要抓取Systrace文件分析并找出引起系统卡顿,或者app反应慢的原因,然后在源码上解决引起慢的问题。

抓取Systrace 的方法:

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

640?wx_fmt=png

抓取Systrace的方法

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

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

640?wx_fmt=png

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

注意:Android Device Monitor的右下角,如下图所示

640?wx_fmt=png

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

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

640?wx_fmt=png

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

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

3.使用命令行抓取 Systrace

本文档介绍了如何从命令行生成systrace报告,浏览由该工具生成的跟踪文件,并使用它们来分析和提高应用程序用户界面(UI)的性能。

抓取systrace之前,请完成以下步骤:

  1. 下载并安装Android SDK Tools

  2. 安装Python ,并将其包含在工作站的执行路径中。

  3. 连接手机,打开开发者选项中的USB Debug选项 。

  4. Systrace存储路径如下android-sdk/platform-tools/systrace/

使用命令行抓取 Systrace的语法如下:python systrace.py [options] [categories]

例如,以下命令调用systrace10秒钟内记录设备进程,包括图形进程,并生成一个名为mynewtraceHTML报告:

python systrace.py --time=10 -o mynewtrace.html gfx

如果不指定任何类别或选项,systrace将生成包含所有可用类别的报告,并使用默认设置。 可用的类别取决于您使用的连接设备。

640?wx_fmt=png

Global options

640?wx_fmt=png

Commands and command options

4.使用Systrace 检测UI 性能

systrace对于检查应用程序的UI性能特别有用,因为它可以分析您的代码和帧速率以识别问题区域并提供可能的解决方案。 开始,按照以下步骤进行:

  1. 连接手机并运行您的app

  2. 使用以下命令运行systrace:python systrace.py view --time = 10

  3. 操作您的应用 10秒后,systrace生成一个HTML报告。

  4. 使用网络浏览器打开HTML报告。

您现在可以与报告进行交互,以便在记录期间检查设备CPU使用情况。 以下部分介绍如何检查报告中的信息以查找和修复UI性能问题

5. 使用Systrace 检测警告以及掉帧问题

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

640?wx_fmt=png

UI渲染帧率查看

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

点击一个F框架圈可以提供有关系统为渲染该框架而完成的工作的其他信息,包括警报。 它还向您展示了在渲染该框架时系统正在执行的方法,因此您可以调查这些方法是否导致UI jank

640?wx_fmt=png

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

选择慢帧后,您可能会在报告的底部窗格中看到警报。 上图中显示的Alert提出,框架的主要问题是在ListView回收和重新绑定中花费了太多的时间。 跟踪中有相关事件的链接可以解释更多关于系统在这段时间内正在做什么的事情。

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

640?wx_fmt=png

Alert 分析面板

640?wx_fmt=png

Frame Input File Metrics Alerts 等面板

如果你在UI Thread上做太多的工作,你需要找出哪些方法消耗了太多的CPU时间systrace中。 如果您不确定哪些方法可能会在UI线程上造成瓶颈,请使用Android Studio的内置CPU分析器,或者生成跟踪日志并使用Traceview查看它们。

6. 查看trace 文件的快捷键

640?wx_fmt=png

查看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(); ,主要这两个是成对出现的。

640?wx_fmt=png

代码举例

多次调用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的抓取与查看。

640?wx_fmt=png

使用Android Device Monitor 查看trace Log

打开跟踪日志后,Traceview使用以下两个窗格显示日志数据:

  1. 时间轴窗格:

  1. 配置文件窗格:

1.时间轴窗格

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

640?wx_fmt=png

时间轴窗格

2. 配置文件窗格

如下图所示,配置文件窗格提供了系统在跟踪日志期间执行的每种方法的列表以及执行这些方法所用的时间。

对于每种方法(顶级节点),该表都显示包含和排他时间(以毫秒为单位)以及总时间的百分比。独占时间是执行方法自己的代码的时间,而包含时间是执行方法自己的代码的时间加上执行子程序的时间。定时信息也以CPU时间和实时的方式报告。 CPU时间只考虑线程主动使用CPU时间的时间,实时提供绝对时间信息,从您的应用程序进入方法的时刻到退出该方法的时间 - 无论线程处于活动状态还是休眠状态。

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

640?wx_fmt=png

Traceview 已知问题

Traceview日志记录不能很好地处理线程,导致以下问题:

  • 1.如果线程在分析期间退出,线程名称不会被发射(在Android 5.1及更高版本中被修复)

  1. 虚拟机重用线程ID。 如果一个线程停止,另一个线程开始,他们可能会得到相同的ID。

640?wx_fmt=jpeg

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

640?wx_fmt=jpeg

如有侵权,请联系小编,小编对此深感抱歉,届时小编会删除文章,立即停止侵权行为,请您多多包涵。

640?wx_fmt=other

既然都看到这里,领两个红包在走吧!以下两个红包每天都可以领取

1.支付宝搜索 522398497,或扫码支付宝红包海报。

支付宝扫一扫,每天领取大红包

2.微信红包,微信扫一扫即可领取红包

微信扫一扫,每天领取微信红包

小礼物走一走,来简书关注我

Android FrameworkAndroid 系统的核心部分,它为应用程序提供运行环境和服务支持。Android Framework 的架构组成主要包括以下几个层次和关键组件: ### 1. 系统架构层次 Android 系统整体架构分为四层:Linux 内核层、系统运行库层(Native Framework)、应用框架层(Java Framework)以及应用程序层。其中,Framework 主要涉及应用框架层和部分系统运行库层的内容。 - **Linux 内核层**:负责硬件驱动、电源管理、进程调度等底层功能。 - **系统运行库层**:包括 C/C++ 库,如 Surface Manager、Media Framework、SQLite、OpenGL ES 等。 - **应用框架层(Framework)**:为应用开发提供 Java 接口,包括 ActivityManager、WindowManager、PackageManager、ContentProvider 等核心组件。 - **应用程序层**:包含系统应用和第三方应用,它们都运行在 Framework 提供的环境中。 ### 2. Framework 主要组件 Android Framework 的核心组件包括以下部分: - **Binder**:Android 中的跨进程通信机制,负责在不同进程之间传递数据和调用方法。Binder 是基于驱动实现的,其性能优异,是 Android 系统 IPC 的核心[^4]。 - **ActivityManagerService (AMS)**:负责管理应用程序的生命周期,包括 Activity 的启动、切换、销毁等。 - **WindowManagerService (WMS)**:管理窗口的显示和布局,负责将应用的 UI 渲染到屏幕上。 - **PackageManagerService (PMS)**:负责解析和管理 APK 文件,提供应用程序的安装、卸载、权限管理等功能。 - **ContentProvider**:用于在应用程序之间共享数据,提供统一的数据访问接口。 - **Handler 和 Looper**:实现线程间通信机制,尤其在主线程与子线程之间的消息传递中起关键作用。 ### 3. 工作原理 Android Framework 的工作原理主要围绕系统启动流程和组件间的协作机制展开: - **系统启动流程**:从 Bootloader 启动后,依次加载 Linux 内核、init 进程、Zygote 进程,最终启动 SystemServer 进程。SystemServer 负责启动 Framework 中的核心服务,如 AMS、WMS、PMS 等。 - **组件协作机制**:通过 Binder 实现跨进程通信,各组件之间通过 AIDL(Android Interface Definition Language)定义接口,进行交互。例如,应用程序通过 Binder 与 AMS 通信,请求启动一个 Activity;AMS 再与 WMS 协作,完成窗口的创建和显示。 ### 4. 源码阅读难点 Framework 源码阅读的难点主要体现在以下几个方面: - **复杂性**:Framework 涉及大量系统级组件,代码量庞大,结构复杂。 - **抽象层次高**:许多功能通过抽象类和接口实现,理解其设计模式和调用链较为困难。 - **跨进程通信**:Binder 的实现涉及底层驱动和 IPC 机制,理解其工作原理需要一定的系统底层知识。 - **调试难度大**:由于 Framework 是系统级组件,调试往往需要结合日志、Trace 工具进行分析。 ### 5. 开发与调试建议 - **掌握系统启动流程**:了解从 Bootloader 到 SystemServer 的整个启动过程,有助于理解 Framework 的初始化机制。 - **熟悉 Binder 通信机制**:理解 Binder 的驱动层和 Framework 层实现,是掌握 Android 系统通信机制的关键。 - **使用调试工具**:如 ADB、Systrace、GDB 等工具可以帮助分析 Framework 中的性能瓶颈和调用流程。 - **阅读官方文档和源码**:结合《Android Framework 源码开发揭秘》等书籍,深入理解源码结构和设计思想[^1]。 ```java // 示例:通过 Binder 调用远程服务 IBinder binder = ServiceManager.getService("activity"); IActivityManager am = IActivityManager.Stub.asInterface(binder); am.startActivity(...); ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值