【工利其器】必会工具之(三)systrace篇(1)官网翻译
前言
Android 开发者官网中对systrace(Android System Trace)有专门的介绍,本篇文章作为systrace系列的开头,笔者先不做任何介绍,仅仅翻译一下官网的介绍。在后续的文章中再整理一份学习教程,以及笔者的实践经历。官网中对该工具的介绍文档路径为【https://developer.android.google.cn/studio/command-line/systrace?hl=en#java】。或者在进入到官网的首页后,按照Android Developers > Android Studio > USER GUIDE > Command line tools > systrace的路径访问该文档。
该文档主要包含如下内容:
一、systrace简述
systrace命令允许你收集和检查在你的设备上运行的所有系统级别进程的定时信息。它联合Android内核(比如CPU调度程序)、磁盘活动和app线程,生成一份HTML报告,如图1所示:
图1:一个systrace的HTML报告案例,它显示了与app 5秒钟的交互。这份报告高亮显示了那些systrace认为可能没有被适当地渲染的帧。
这份报告提供了一份在给定时间段内Android设备系统进程的全局图。它也检查了被捕获的追踪信息,用于高亮显示它观察到的问题,比如显示动作或动画时的UI jank(笔者注:界面来不及刷新导致的卡塞空白现象),以及提供修复这些问题的建议。但是,systrace不会收集在app进程内与代码执行相关的信息。 关于你的app正在执行哪些方法以及它占用了多少CPU资源的详情,请查看 【Android Studio CPU profiler】。你也可以使用CPU Profiler来生成追踪日志,导出并检查它们。
这份文档解释了怎样从命令行生成systrace报告,操作由工具生成的trace文件,并且使用它们分析及改善应用的UI性能。
★注意:在运行于Android 9(API level 28)或者更高的设备上,你可以使用一个叫做System Tracing的系统app在设备上记录system trace。
为了运行systrace,请完成下面的步骤:
- 从Android Studio中,【下载和安装最新的Android SDK Tools】。
- 安装【Python】并且包含到你的工作站执行路径。
- 使用【USB debugging connection】连接一个运行Android4.3(APL Level 18)或更高的设备到你的开发系统。
systrace工具在Android SDK Tools 包中提供,其路径为 android-sdk/platform-tools/systrace/
二、语法
为了给app生成HTML报告,你需要在命令行中使用如下的语法运行systrace:
$python systrace.py [option][categories]
例如,如下的命令行调用了systrace用于记录设备活动,并且生成一份名为 mynewtrace.html 的HTML报告。该categories列表对大多数设备而言是一个合理的默认列表。
$ python systrace.py -o mynewtrace.html sched freq idle am wm gfx view \ binder_driver hal dalvik camera input res
★ 提示:如果你想看输出的trace中任务的名字,你的命令参数中必须包含“sched” category。
想查看你连接的设备所支持的category列表,请运行下面的命令:
$ python systrace.py --list-categories
如果你没有指定任何的category或者option,systrace会生成一个包含所有可用category的报告并且使用默认的设置。这些可用的category依赖于你所连接的正在使用的设备。
1、全局option
全局option | 描述 |
---|---|
-h | --help |
显示帮助信息 |
-l | --list-categories |
列出你连接的设备所支持的可用category |
2、命令和命令选项
Commands and options | Description |
-o file | 把HTML trace报告写入到指定file。如果你不指定这个选项,systrace将会把你的报告保存到和systrace.py相同的根目录下,并且命名为trace.html。 |
-t N | --time=N | 追踪设备活动N秒钟。如果你不指定该选项,systrace将会提示你在命令行中按Enter键结束追踪。 |
-b N | --buf-size=N | 使用一个大小为N KB的trace缓存。这个选项可以让你限制追踪过程中收集的数据的大小。 |
-k functions | --ktrace=functions |
追踪指定内核函数的活动,在一个以逗号隔开的列表中列出。 |
-a app-name | --app=app-name |
激活追踪app,这些app在以逗号分隔的进程名列表中被指定列出。这些app必须包含来自于Trace 类的追踪检测调用。 无论何时你profile你的应用,你都应该指明这个选项,很多库(比如RecyclerView)都包含了追踪检测调用, 当你激活应用级别的追踪时,这些调用提供了有用的信息。想了解更多信息,请阅读关于怎样“检测你的app代码”这部分内容。 |
--from-file=file-path | 从文件当中创建一个交互式的HTML报告,比如包含原始trace数据的TXT文件,而不是运行实时追踪。 |
-e device-serial | --serial=device-serial |
在指定连接的设备上进行追踪,该设备由设备序列号来识别。 |
categories | 包含你所指定的系统进程的追踪信息,比如gfx表示用于图像渲染的系统进程。你可以通过加上 -l 命令运行systrace来查看你所连接的设备上可用的服务列表。 |
三、调查用户界面性能问题
systrace 在检查你的app的用户界面性能方面尤其有用,因为它能够分析你的代码和帧率来验证问题区域和建议可能的解决方案。首先,按照如下步骤进行:
1)在你连接的设备上运行你的app。
2)用下面的命令运行systrace,
$ python systrace.py -t 10 [other-options] [categories]
这个例子会追踪你的app 10秒钟。
3)当systrace正在运行的时候,和你的app进行交互(笔者注:即操作你的app)。
4)在你定义的限定时间过去后,比如该例中的10秒,systrace会生成一个HTML 报告。
5)使用一个web浏览器打开这份HTML报告。
通过和这份报告交互,你可以检查设备在这段记录时间内的CPU使用情况。为了帮助操作HTML报告,请查看“键盘快捷键”这一部分,或者点击报告右上角的"?"按钮。
下面这一部分解释了怎样检查报告中的信息,从而找到并修复UI性能问题。
1、检查帧和警告
如图2所示,报告列出了每一个渲染UI帧的进程并且沿着时间线指出了所有的渲染帧。这些帧在16.6毫秒内渲染一帧, 需要维持一个稳定的每秒60帧的帧率,在报告中他们用绿色的圆圈表示。那些渲染超过16.6毫秒的帧则用黄色或者红色圆圈表示。
图2:长时间运行的帧放大后的systrace显示
★ 注意:在运行版本为Android5.0(API level 21)或更高的设备上,UI线程和渲染线程之间用于渲染帧的工作是分离的。在之前的版本中,创建帧的所有工作都是在UI线程中完成的。
点击一个Frame圆圈(带有F标记的圆圈,后面简称圆圈)会让它变成高亮并且提供额外的信息,这些信息是关于系统渲染这一帧做所的工作,包括警告。同时也会向你显示渲染这一帧过程中系统正在执行的方法,所以你可以调查引起那些UI jank的方法。
图3:选择有问题的帧,一个警告会出现在trace报告下面来标识问题。
当你选择一个渲染较慢的帧,你会在报告面板底部看到一个警告。图3中显示的警告唤起了该帧主要的问题,而该帧在ListView内回收和重新绑定时花费了太多时间。有一些链接指向trace中有关事件,他们解释了更多关于这段时间内系统做了些什么。
为了查看该工具在你的trace中发现的每一个警告,以及该设备触发每一个警告的次数,请点击窗口最右边的“Alerts”标签,如图4所示。这个“Alerts”面板会帮你查看在这份trace中发生了什么问题,以及引起UI jank的频率。把这个面板当成一个bug列表去修复。通常,一个在某区域微小的改变或者改善可能消除你app中整个警告类型。
图4:点击右侧的“Alert”按钮将显示“alter”标签
如果你看到在UI线程中做了太多的工作,你需要找出是哪个方法消费了太多的CPU时间。有一种方法就是添加trace标记(查看“检测你的app代码”这一节)到那些你认为有可能导致这些瓶颈的方法中,用来查看那些在systrace中出现的功能调用。如果你不确定在UI线程中哪些方法可能导致瓶颈,使用Android Studio CPU profier 。你可以生成trace日志并且使用CPU Profiler来导入和检测它们。
2、HTML报告键盘快捷键
下面的表格列出了当浏览systrace HTML报告时可用的键盘快捷键。
按键 | 描述 |
---|---|
W | 放大trace时间轴。 |
S | 缩小trace时间轴。 |
A | 在时间轴上向左平移。 |
D | 在时间轴上向右平移。 |
E | 将trace时间轴置于当前鼠标的中心。 |
G | 在当前选择的任务的开始处显示网格。 |
Shift + G | 在当前选择的任务的结尾处显示网络. |
Right Arrow | 在当前选择的时间轴上选择下一个事件(笔者注:当聚焦在frame 圆圈上时容易看到效果)。 |
Left Arrow | 爱当前选择的时间轴上选择前一个事件。 |
四、检测你的app代码
因为systrace仅仅只在系统级别给你显示进程信息,所以在HTML报告中很难知道在给定的时间内你的app执行了哪些方法。在Android4.3(API level 18)已经更高的版本中,你可以在你的代码中使用Trace类来标记HTML报告中执行的事件。你没有必要用systrace去检测你的代码来记录trace,但是这样做可以帮助你看到你的app代码中哪部分可能引起线程挂起或者UI jank。这种途径有别于使用Debug类,Trace类简单地添加标签到systrace报告,但是Debug类通过.trace文件能帮助你检测详细的app CPU使用情况。
为了生成包含你检测trace事件的systrace HTML报告,你需要运行结合-a或者--app命令行运行systrace,并指明你的app的包名。
下面的代码实例向你展示了怎样使用Trace类来标记方法的执行,包括在那个方法内的两段嵌套的代码块:
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
...
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Trace.beginSection("MyAdapter.onCreateViewHolder");
MyViewHolder myViewHolder;
try {
myViewHolder = MyViewHolder.newInstance(parent);
} finally {
// In 'try...catch' statements, always call endSection()
// in a 'finally' block to ensure it is invoked even when an exception
// is thrown.
Trace.endSection();
}
return myViewHolder;
} @Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Trace.beginSection("MyAdapter.onBindViewHolder");
try {
try {
Trace.beginSection("MyAdapter.queryDatabase");
RowItem rowItem = queryDatabase(position);
dataset.add(rowItem);
} finally {
Trace.endSection();
}
holder.bind(dataset.get(position));
} finally {
Trace.endSection();
}
}
...
}
★ 注意:当你调用beginSection(String)多次,调用endSection()只结束最近一次调用的beginSection(String)。所以,对于嵌套的代码,比如上面例子中的,你需要确定你适当地匹配了一次beginSection()调用和一次endSection()。另外,你不能在一个线程中调用beginSection(),却在另外一个线程中结束它,你必须在相同的线程中调用endSection()。
结语
到这里,该篇文章就翻译结束了,后面的文章中,笔者将根据自己的理解和实际操作,继续对System Trace进行阐述。限于笔者的水平,如有翻译不准确或不妥当的地方,望不吝赐教。
【工利其器】必会工具之(三)systrace篇(1)官网翻译的更多相关文章
- 【工利其器】必会工具之(二)Android开发者官网篇
前言 当刚开始踏入Android程序员这个行业的时候,想必绝大多数的人都和笔者一样,热血沸腾,激情四射,买了很多讲解Android开发的书籍.当开发某个功能需要学习某方面知识的时候,大家又成了“面向百 ...
- android測试工具MonkeyRunner--google官网翻译
近期在复习之前的笔记,在回想MonkeyRunner时看了看google官网的内容,写得不错.就翻译出来分享下.事实上google官网真是一个学习的好地方. 基础知识 MonkeyRunner工具提供 ...
- 【工利其器】必会工具之(三)systrace篇(2)
systrace工具打开路径 以AndroidStudio(后面简写为AS),在顶部菜单栏中 Tools>Android>Android Device Monitor 打开后看到如下界面, ...
- 【工利其器】必会工具之(一)Source Insight篇
前言 “Source Insight(以下简称SI)是世界上最好的编辑器”,说这句话不知道会不会出门被打呢?-_- 中国古话说得好,“文无第一,武无第二”,所以不敢说SI是最好的,但是 ...
- 【工利其器】Android Lint篇——为Android量身定做的静态代码审查工具
前言 我们在进行代码优化的时候,往往是通过开发者的经验来判断哪些代码可能存在潜在问题,哪些资源的使用不合规范等.实际上Android SDK提供了一款功能非常强大的工具,来帮助开发者自动检测代码的质量 ...
- svn的差异查看器和合并工具换成BCompare.exe
svn的差异查看器和合并工具换成BCompare.exe
- mac必装工具以及mac使用介绍
必装工具 Scroll Reverserhttp://pilotmoon.com/scrollreverser/:一款可以使得鼠标使用方式和windows系统一致的软件 编程工具 ,,,,, 常用快捷 ...
- iOS之17个提升iOS开发效率的必用工具
时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我提升编码速度和工作效率的工具 ...
- 17个提升iOS开发效率的必用工具
时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我们提升编码速度和工作效率的工 ...
随机推荐
- bash: jar: 未找到命令..(command not found)
/bin/bash: jar: command not found 解决办法: cd /usr/bin 必须先进入/usr/bin,下同 sudo ln -s -f /usr/lib/jvm/jdk1 ...
- persistent_storage_worker.go
package) ) :length],) ) :length]) } func (engine *Engine) persistentStorageInitWorker(shard int) { ...
- BZOJ_1251_序列终结者
BZOJ_1251_序列终结者 [问题描述] 给定一个长度为N的序列,每个序列的元素是一个整数(废话).要支持以下三种操作: 1. 将[L,R]这个区间内的所有数加上V. 2. 将[L,R]这个区间翻 ...
- 重构:以Java POI 导出EXCEL为例2
前言 上一篇博文已经将一些对象抽象成成员变量以及将一些代码块提炼成函数.这一节将会继续重构原有的代码,将一些函数抽象成类,增加成员变量,将传入的参数合成类等等. 上一篇博文地址:http://www. ...
- 【爆料】-《伯明翰大学学院毕业证书》UCB一模一样原件
☞伯明翰大学学院毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归 ...
- Mui Webview下来刷新上拉加载实现
有些事情经历过之后才会发现,原来再次之前我是如此的啥,因为是第一次做,毫无头绪,有时会想假如有个一demo就好了,那么就不会花费这么多的无用功了.今天使用mui 的webview实现了一个H5页面的上 ...
- MySQL - 高可用性:少宕机即高可用?
我们之前了解了复制.扩展性,接下来就让我们来了解可用性.归根到底,高可用性就意味着 "更少的宕机时间". 老规矩,讨论一个名词,首先要给它下个定义,那么什么是可用性? 1 什么是可 ...
- 你真的了解ASP.NET Core 部署模型吗?
---------------------------- 以下内容针对 ASP.NET Core2.1,2.2出现IIS进程内寄宿 暂不展开讨论-------------------------- ...
- EF Core in Action 中文翻译 第一部分导航
Entityframework Core in action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core ...
- 学习JVM是如何从入门到放弃的?
前言 只有光头才能变强 JVM在准备面试的时候就有看了,一直没时间写笔记.现在到了一家公司实习,闲的时候就写写,刷刷JVM博客,刷刷电子书. 学习JVM的目的也很简单: 能够知道JVM是什么,为我们干 ...