使用Systrace分析UI性能_菠萝菠萝派的博客-程序员宝宝

技术标签: Android性能优化  android  性能  

使用Systrace分析UI性能

转自http://www.devtf.cn/?p=1117
开发应用的时候,应该检查它是否有流畅的用户体验,即60fps的帧率。如果由于某种原因丢帧,我们首先要做的就是知道系统在做什么(造成丢帧的原因)。

Systrace允许你监视和跟踪Android系统的行为(trace)。它会告诉你系统都在哪些工作上花费时间、CPU周期都用在哪里,甚至你可以看到每个线程、进程在指定时间内都在干嘛。它同时还会突出观测到的问题,从垃圾回收到渲染内容都可能是问题对象,甚至提供给你建议的解决方案。本文章将介绍如何导出trace以及使用它来优化UI的办法。

总览

Systrace可以帮助你分析应用在不同Android系统上的运行情况。它将系统和应用的线程运行情况放置在同一条时间线上分析。你首先需要收集系统和应用的trace(后面会告诉你怎么做),之后Systrace会帮你生成一份细致、直观的报告,它展示了设备在你监测的这段时间内所发生的事情。

这里写图片描述
图1. 连续滑动应用5秒的Trace,它并没有表现得很完美。

图1展示了应用在滑动不流畅的时候生成的trace。默认缩放成全局显示,你可以放大到自己所关注的地方。横轴代表着时间线,事件记录按照进程分组,同一个进程内按线程进行纵向拆分,每个线程记录自己的工作。

在本例中,一共有三个组:Kernel, SurfaceFlinger, App,他们分别以包名为标识。每个应用进程都会包含其中所有线程的记录信号,你可以看到从InputEvent到RenderThread都有。

生成Trace

在获取trace之前需要做一些启动工作。首先,设备要求API>=16(Android 4.1),之后通过正常的Debug流程(开启调试、连接工作环境、安装App)连接设备。由于需要记录磁盘活动和内核工作,你可能需要root权限。不过大部分时候你只要能够正常Debug即可。

Systrace 可以通过命令行或者图形界面启动,本篇文章重点介绍通过命令行使用Systrace。

在Android 4.3及以上的系统中获取trace

在4.3以上的系统获取Trace步骤:
1. 保证设备USB连接正常,并可以debug;
2. 在命令行中设置选项,开启trace,比如:

$ cd android-sdk/platform-tools/systrace
$ python systrace.py --time=10 -o mynewtrace.html sched gfx view wm

你可以通过Systrace选项来了解更多命令行选项

在Android 4.2及以下的系统中获取trace

在4.2及以下的系统中高效地使用Systrace的话,你需要在配置的时候显式指定要trace的进程种类。一共有这两类种类:
- 普通系统进程,比如图形、声音、输入等。(通过tags设置,具体在Systrace命令行中有介绍)
- 底层系统进程,比如CPU、内核、文件系统活动。(通过options设置,具体在Systrace命令行中有介绍)

你可以通过以下命令行操作来设置tags:
- 使用 –set-tags选项:

$ cd android-sdk/platform-tools/systrace
$ python systrace.py --set-tags=gfx,view,wm
  • 重启adb shell来trace这些进程:
$ adb shell stop
$ adb shell start

你也可以通过手机上的图形界面设置tags:
1. 在设备上进入设置> 开发者选项 > 监控 > 启用跟踪(部分手机上没有这个选项);
2. 选择追踪进程类型,点击确认。

注意: 在图形界面中设置tag时adb shell不用重新启动。

在配置完tags后,你可以开始收集操作信息了。

如何在当前设置下启动trace:

  1. 保证设备的usb连接正常,并且可以正常debug;
  2. 使用低系统等级的命令行选项开启trace,比如:
$ python systrace.py --cpu-freq --cpu-load --time=10 -o mytracefile.html
  1. 在设备上做任何你想让trace记录的操作。

你可以通过Systrace选项来了解更多命令行选项。

分析trace报告

在你获取trace之后你可以在网页浏览器中打开它。这部分内容告诉你怎么通过trace去分析和解决UI性能。

监视帧数

每个应用都有一行专门显示frame,每一帧就显示为一个绿色的圆圈。不过也有例外,当显示为黄色或者红色的时候,它的渲染时间超过了16.6ms(即达不到60fps的水准)。’w’键可以放大,看看这一帧的渲染过程中系统到底做了什么。

提示:你可以按右上角的’?’按钮来查看界面使用帮助。

这里写图片描述
图2. Systrace显示长渲染时间的帧

单击该帧可以高亮它,这时候跟该帧有关的内容会被突出显示。在5.0及以上的系统中,显示工作被拆分成UI线程和Render线程两部分;在5.0以下的系统中,所有的显示工作在UI线程中执行。

点击单个Frame下面的组件可以看他们所花费的时间。每个事件(比如performTraversals)都会在你选中的时候显示出它们调用了哪些方法及所用的时间。

调查警告事件

Systrace会自动分析事件,它会将任何它认为性能有问题的东西都高亮警告,并提示你要怎么去优化。

这里写图片描述
图3. 选择一个被高亮帧,它会显示出检测到的问题(回收ListView消耗时间太长)。

在你选择类似图三中的问题帧之后,它就会提示你检测出的问题。在这个例子中,它被警告的主要原因是ListView的回收和重新绑定花费太多时间。在Systrace中也会提供一些对应链接,它们会提供更多解释。

如果你想知道UI线程怎么会花费这么多时间的话,你可以使用TraceView,它会告诉你都是哪些函数在消耗时间。

你可以通过右侧的’Alert’选项卡来查看整个trace过程中发生的所有问题,并进行快速定位。

这里写图片描述
图4. 点击Alert选项卡

你可以将Alert面板中的问题视为需要处理的bug,很有可能每一次微小的优化能够去除整个应用中的警告!

应用级别调试

Systrace并不会追踪应用的所有工作,所以你可以在有需求的情况下自己添加要追踪的代码部分。在Android 4.3及以上的代码中,你可以通过Trace类来实现这个功能。它能够让你在任何时候跟踪应用的一举一动。在你获取trace的过程中,Trace.beginSection()Trace.endSection()之间代码工作会一直被追踪。

下面这部分代码展示了使用Trace的例子,在整个方法中含有两个Trace块。

public void ProcessPeople() {
    Trace.beginSection("ProcessPeople");
    try {
        Trace.beginSection("Processing Jane");
        try {
           // 待追踪的代码
        } finally {
            Trace.endSection(); // 结束 "Processing Jane"
        }

        Trace.beginSection("Processing John");
        try {
            // 待追踪的代码
        } finally {
            Trace.endSection(); // 结束 "Processing John"
        }
    } finally {
        Trace.endSection(); // 结束 "ProcessPeople"
    }
}

注意:在Trace是被嵌套在另一个Trace中的时候,endSection()方法只会结束理它最近的一个beginSection(String)。即在一个Trace的过程中是无法中断其他Trace的。所以你要保证endSection()与beginSection(String)调用次数匹配。

注意:Trace的begin与end必须在同一线程之中执行!

当你使用应用级别追踪的时候,你必须通过-a或者-app=来显式地指定应用包名。可以通过Systrace指南查看更多关于它的信息。

你在评估应用的时候应该开启应用级别跟踪,即使当你没有手动添加Trace信号。因为很多库函数里面是有添加Trace信号的(比如RecyclerView),它们往往能够提供很多信息。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wanglu198506/article/details/50524876

智能推荐

nginx_诺坎普第一球探的博客-程序员宝宝

nginx1. nginx简介2. nginx的特性与优点2.1 nginx的特性2.2 nginx的优点3. nginx反向代理3.1 反向代理的作用3.2 正向代理和反向代理的区别4. nginx的安装与配置4.1 nginx的安装4.2 nginx安装后的配置1. nginx简介nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)...

Android 复制内容到剪切板_赖毛不是酒_的博客-程序员宝宝

ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); cm.setText(tvMsg.getText());

Flink+Hologres 亿级用户实时UV精确去重最佳实践_阿里云技术的博客-程序员宝宝

UV、PV计算,因为业务需求不同,通常会分为两种场景:离线计算场景:以T+1为主,计算历史数据 实时计算场景:实时计算日常新增的数据,对用户标签去重针对离线计算场景,Hologres基于RoaringBitmap,提供超高基数的UV计算,只需进行一次最细粒度的预聚合计算,也只生成一份最细粒度的预聚合结果表,就能达到亚秒级查询。具体详情可以参见往期文章>>Hologres如何支持超高基数UV计算(基于RoaringBitmap实现)对于实时计算场景,可以使用Flink+Hologres

计算机隐藏文件夹无法显示,隐藏文件夹无法显示怎么办_鱼吞舟的博客-程序员宝宝

隐藏文件夹无法显示怎么办电脑不能显示隐藏文件,在文件夹选项里调了,关了对话框重开又返回到不显示隐藏文件选项。以下是小编整理的隐藏文件夹无法显示的处理方法,希望可以帮助大家!解决方法:新建一个记事本文件,把下面的内容拷贝到里面去:Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrent...

尽量不用+直接拼接字符串,使用StringBuilder来进行拼接_Csea_的博客-程序员宝宝

看测试代码package com.csea;/** * @author Csea * @title * @date 2020/4/26 16:33 */public class StringAppend { public static void main(String[] args) { long times = System.currentTimeMill...

随便推点

day-9 xctf-int_overflow_a525024162806525的博客-程序员宝宝

xctf-int_overflow题目传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5058&page=undefinedchecksec文件,No canary found,32位程序:用ida打开查看:判断输入,选择功能菜单:1...

Badoo 告诉你切换到 PHP7 节省了 100 万美元_weixin_34129145的博客-程序员宝宝

介绍我们成功的把我们的应用迁移到了php7上面(数百台机器的集群),而且运行的很好,据说我们是第二个把如此规模的应用切换到php7的企业,在切 换的过程我们发现了一些php7字节码缓存的bug,庆幸的是这些bug现在已经被修复了,现在我们把这个激动人心的消息分享给所有的php社 区:php7现在已经可以稳定的运行在商用环境上,而且比以前更加节省内存...

配置tomcat数据库连接池及使用数据库连接池(hibernate数据源配置和使用)_一枪尽骚丶魂的博客-程序员宝宝

转载自:http://blog.csdn.net/centre10/article/details/6746088配置tomcat数据库连接池及使用数据库连接池(hibernate数据源配置和使用)数据库连接池就是一个装有很多个数据库连接的东西,配置包括3步:1.让tomcat容器启动创建数据库连接池2.在某个项目中关联数据库连接池,3.取得数据库连接池并使用。使用包括,当拿到

安卓面试基础(如会必过)_wd_113634687的博客-程序员宝宝_安卓面试

Activity1、 什么是Activity?Activity是四大组件之一,他给用户的感受就是一个用户交互界面。一个Activity就是一个可见的界面。他的特点是:1、可见 2、可交互他之所以可交互,是因为他同时实现了Window.Callback和KeyEvent.Callback, 可以处理与窗体用户交互的事件和按键事件.这两个特点,是他和service最大的区别。一个Activ...

[kuangbin带你飞]专题五 并查集——C - How Many Tables(并查集模板)_免费的单身汉RainsdRop的博客-程序员宝宝

链接:https://vjudge.net/contest/66964#problem/C题目Today is Ignatius’ birthday. He invites a lot of friends. Now it’s dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all

Linux vi/vim 编辑命令总结_ocean1010的博客-程序员宝宝_linux vi 确认/c确认

一. VIM高亮进入vim后,在普通模式下输入如下命令,开启php代码高亮显示   :syntax enable   :source $VIMRUNTIME/syntax/php.vim 二. VI常用命令_______________________________________________________一般模式

推荐文章

热门文章

相关标签