Systrace UI性能分析工具

在开发应用时,需要确保UI交互顺滑,有60fps的帧率。如果出现了丢帧现象,解决问题的第一步是弄清楚系统都做了什么。

Systrace工具可以收集和检查所有进程的时序信息,展示什么地方在占用CPU,以及每个进程和线程每个时间段在做什么。它也会检查捕获到的trace信息,高亮显示发现的问题。

概述

Systrace帮助你分析应用如何在Android设备上运行。它将系统线程和应用线程的执行放在同一时间线上。要使用Systrace分析应用,你首先需要收集trace日志。

图1 Systrace信息

图1展示了捕获到的5s时长的滑动一个性能不太好的app的trace信息。默认会显示一个缩小的视图。横坐标是时间,纵坐标是分组进程信息,进程内部按照线程分组。

分组的顺序是Kernel,SurfaceFlinger,接下来是各个应用,以包名为标签。每个应用程序进程包含每个线程所包含的所有trace标记,包括基于启用trace类别的高级trace事件的层次结构。

生成trace

生成trace有两个条件:

  • Android系统最低为4.1(API 16)
  • 有root权限

生成trace可以使用命令行或者从IDE启动。

命令行生成trace

命令行的方式在4.2和4.3系统上是不同的。

在Android 4.3(API 18)及以上系统生成trace

步骤:

  • 确保连接了设备并开启了debug模式
  • 运行trace,比如:
$ cd android-sdk/platform-tools/systrace
$ python systrace.py --time=10 -o mynewtrace.html sched gfx view wm
  • 在设备上执行你想观察的动作。

详细的参数信息,参照https://developer.android.google.cn/studio/profile/systrace-commandline.html#options-4.3

在Android 4.2(API 17)及以上系统生成trace

https://developer.android.google.cn/studio/profile/systrace-commandline.html#options-pre-4.3

Android Studio生成trace

  1. 连接设备
  2. 在Android Studio中打开应用,并在设备中运行。
  3. 在Android Studio中打开Android Device Monitor:Tools -> Android -> Android Device Monitor
    图2
  4. 然后选中DDMS标签。点击左侧你要追踪的应用,然后点击Systrace按钮:


    图3
  5. 在弹出的窗口中,配置你的设置:


    图4
    • Destination File:trace文件的保存位置
    • Trace duaration:默认5s,推荐30s。
    • Trace Buffer Size:trace大小
    • Enable Application Traces from:选择你的应用
    • Select tags to enable:至少选择一个追踪标记。
  6. 点击OK开启trace
  7. 操作你的应用
  8. trace结束后,会自动返回到Android Device Monitor。

trace分析

生成trace后,使用浏览器打开trace文件。

帧检测

以下图为例:

图5

每个渲染帧的应用都会展示一行帧的圆圈(F圆圈),典型的是绿色的。黄色和红色的圆圈表示该帧的渲染时间超过了16.6s。

你可以用鼠标点选每一帧来高亮显示该帧,或者点选帧内的元素,最下面的窗口会显示一些详细信息。

查看警告

Systrace会自动分析trace,并高亮性能问题作为警告,对处理方式提出建议。

图6

如上图所示,在你选择了一个耗时较长的帧后,一个警告会显示出来。查看警告的描述,对查找问题很有帮助。上述表示Adapter的getView方法可能做了太多的工作。

你也可以点击右侧的Alerts标签来查看trace中所有的警告:

图7

快捷键

描述
w 放大
s 缩小
a 左移
d 右移
e 定位到中间位置
g 显示网格线
选择上一个
选择下一个

trace代码

框架定义的trace标记并不适用所有的情况,所以你可能需要添加你自己的标记。在Android 4.3(API18)以上的系统,你可以使用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 {
            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);
                mDataset.add(rowItem);
            } finally {
                Trace.endSection();
            }
            holder.bind(mDataset.get(position));
        } finally {
            Trace.endSection();
        }
    }

…

}

注意:

  • begin和end是成对出现的。
  • begin和end必须在同一线程内。
  • try...catch块中,确保end在finally中。

在测试应用性能时,应该打开应用级trace,即使你没有自己添加标记。很多库,比如RecyclerView,包含了一些trace标记,可以提供很多有用的信息

**注:本文翻译自Google官方文档。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350

推荐阅读更多精彩内容