文档章节

性能优化工具(二)-Systrace

天王盖地虎626
 天王盖地虎626
发布于 06/24 22:11
字数 2449
阅读 27
收藏 0

一、简介

Systrace是分析Android性能问题的神器,Google IO 2017上更是对其各种强推. 是分析卡顿掉帧问题核心工具,只要能提供卡顿现场,systrace就能很好定位问题,但是有一定上手难度,所以会稍微花比较多的篇幅来学习,当然systrace配合traceView使用效果更佳,之后也会介绍traceView。

二、原理

在介绍使用之前,先简单说明一下Systrace的原理:它的思想很朴素,在系统的一些关键链路(比如System Service,虚拟机,Binder驱动)插入一些信息(我这里称之为Label),通过Label的开始和结束来确定某个核心过程的执行时间,然后把这些Label信息收集起来得到系统关键路径的运行时间信息,进而得到整个系统的运行性能信息。Android Framework里面一些重要的模块都插入了Label信息(Java层的通过android.os.Trace类完成,native层通过ATrace宏完成),用户App中可以添加自定义的Label,这样就组成了一个完成的性能分析系统。另外说明的是:Systrace对系统版本有一个要求,就是需要Android 4.1以上。系统版本越高,Android Framework中添加的系统可用Label就越多,能够支持和分析的系统模块也就越多;因此,在可能的情况下,尽可能使用高版本的Android系统来进行分析。

三、日志获取

3.1 AndroidStudio 抓取:

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

2)配置需要抓取Systrace的内容

Trace duration 默认5秒,
Trace Buffer Size 默认2M,理论上,时间越长,需要的buffer越大
Enable Application Traces from : 选择要监控的app, 如果没有就选none
根据需要勾选要展示数据的内容。
生成trace.html 文件后,直接在浏览器中打开就可以。

3.2 命令行抓取(推荐)
命令行
python systrace.py [options] [category1] [category2] ... [categoryN]

配置好adb,python。

1)保持ADB device的连接;
2)cd 到systrace的目录下:如cd Library/Android/sdk/platform-tools/systrace;
3)比如我执行如下操作:

python systrace.py --time=10 -o mytrace.html sched gfx view wm

时间默认是5秒,在这5秒过程中做对应的操作,mytrace.html即我生成的检测结果,在systrace中找到并用chrome打开。

抓取的过程就是:在执行以上命令之后,开始你对应的手机操作,最终生成trace的html文件供分析,当然我们也发现了,命令后面带了一串参数:sched gfx view wm ,它决定了你的trace输出的数据包含哪些内容,如果trace数据太繁杂会让你眼花缭乱,所以缩小需要分析的数据集合会有助于我们定位问题,因此下面来了解下这些参数有哪些,都是干嘛的,对应的分析场景应该使用哪些。

先来了解下这些参数有哪些:

参数分为两个部分options和category

options可取值:

options 解释
-o <FILE> 指定trace数据文件的输出路径,如果不指定就是当前目录的trace.html
-t N, –time=N 执行时间,默认5s。绝对不要把时间设的太短导致你操作没完Trace就跑完了,这样会出现Did not finish 的标签,分析数据就基本无效了
-b N, –buf-size=N buffer大小(单位kB),用于限制trace总大小,默认无上限
-k <KFUNCS>,–ktrace=<KFUNCS> 追踪kernel函数,用逗号分隔
-a <APP_NAME>,–app=<APP_NAME> 这个选项可以开启指定包名App中自定义Trace Label的Trace功能。也就是说,如果你在代码中使用了Trace.beginSection("tag"), Trace.endSection;默认情况下,你的这些代码是不会生效的,因此,这个选项一定要开启
–from-file=<FROM_FILE> 从文件中创建互动的systrace
-e <DEVICE_SERIAL>,–serial=<DEVICE_SERIAL> 指定设备,在特定连接设备上进行跟踪,由设备序列号标识 。
-l, –list-categories 这个用来列出你分析的那个手机系统支持的Trace模块,一般来说,高版本的支持的模块更多

category可取值:

category 解释
gfx Graphic系统的相关信息,包括SerfaceFlinger,VSYNC消息,Texture,RenderThread等;分析卡顿非常依赖这个。
input Input
view View绘制系统的相关信息,比如onMeasure,onLayout等。。
webview WebView
wm Window Manager
am ActivityManager调用的相关信息;用来分析Activity的启动过程比较有效。
sm Sync Manager
audio Audio
video Video
camera Camera
hal Hardware Modules
app Application
res Resource Loading
dalvik 虚拟机相关信息,比如GC停顿等。
rs RenderScript
bionic Bionic C Library
power Power Management
sched CPU调度的信息,非常重要;你能看到CPU在每个时间段在运行什么线程;线程调度情况,比如锁信息。
binder_driver Binder驱动的相关信息,如果你怀疑是Binder IPC的问题,不妨打开这个。
core_services SystemServer中系统核心Service的相关信息,分析特定问题用。
irq IRQ Events
freq CPU Frequency
idle CPU Idle
disk Disk I/O
mmc eMMC commands
load CPU Load
sync Synchronization
workq Kernel Workqueues
memreclaim Kernel Memory Reclaim
regulators Voltage and Current Regulators

[options] 是一些命令参数,[category] 是你感兴趣的系统模块,比如view代表view系统(包含绘制流程),am代表ActivityManager(包含Activity创建过程等);分析不同问题的时候,可以选择不同你感兴趣的模块。需要重复的是,尽可能缩小需要Trace的模块,其一是数据量小易与分析;其二,虽然systrace本身开销很小,但是缩小需要Trace的模块也能减少运行时开销。比如你分析卡顿的时候,power, webview 就几乎是无用的。

常用的比较通用的命令:
./systrace.py -t 10 -a <package_name> -o xxtrace.html app sched gfx view am wm dalvik binder_driver freq idle load sync

四、工具简单使用介绍

使用Web浏览器打开HTML报告

该报告列出了呈现UI帧并指示沿时间线的每个渲染帧的每个进程。用绿色框架圆圈表示在16.6毫秒内渲染以保持每秒60帧稳定所需的帧。渲染时间超过16.6毫秒的帧用黄色红色框架圆圈表示。

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

单击框架圆圈会突出显示它,并提供有关系统完成该框架所做工作的其他信息,包括警报。它还会向您显示系统在渲染该帧时执行的方法,因此您可以调查这些方法以获取UI jank的原因。

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

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

要查看工具在trace中发现的每个Alert以及设备触发Alert的次数,请单击窗口最右侧的Alerts选项卡,如下图所示。

Alerts面板可帮助您查看发生了哪些问题,以及发生的频率。 将Alert面板看作是要修复的错误列表, 通常情况下,一个区域的微小变化或改进可以消除应用程序中的全部警报。

如果你在UI Thread上做太多的工作,你需要找出哪些方法消耗了太多的CPU时间。

一种方法是添加跟踪标记到您认为会导致这些瓶颈的方法,以查看这些函数调用是否显示在systrace中。 如果您不确定哪些方法可能会在UI线程上造成瓶颈,请使用Android Studio的内置CPU分析器,或者生成跟踪日志并使用Traceview查看它们。

当然除了看frame 红 黄 绿状态以及系统给出的描述之外,还有其他值得关注的点:

从app角度出发:

1)发现黄色 尤其是红色的帧,这种颜色表示超过了16ms的绘制要求了,那就看看两帧之间都做了些什么,缺少信息的就打点trace进去。或者结合Traceview去排查方法耗时的问题。
2)systrace上task的运行状态:
灰色:Sleeping
蓝色:Runnable (它可以运行,但是需要等待调度程序唤醒)
绿色:Running
橙色:Uninterruptible sleep 由于 I/O 负载而不可中断休眠

尤其关注Runnable, 很有可能wake by pid xxx , cpu此时被xxx进程抢占着,去看看这个进程是否有什么异常。

从framework层面出发:


这个流程是Surfaceflinger每隔16ms接收vsync信号进行layer合成的操作,看看这个操作本身是否就超过了16ms
SurfaceFlinger不了解的可以先看看这个系列的问题:Android图形系统篇总结

 

五 、Android 官方案例分析

最后给一个官方案例的分析来给点分析启发吧
https://source.android.com/devices/tech/debug/systrace

 

本文转载自:https://www.jianshu.com/p/fa6cfad8ccc2

天王盖地虎626

天王盖地虎626

粉丝 31
博文 522
码字总数 20708
作品 0
南京
私信 提问
Android性能分析工具Systrace和TraceView

Android性能分析工具Systrace和TraceView的使用- https://blog.csdn.net/xiyangyang8/article/details/50545707 -- TraceView 在开始调试的地方,如Activity的onCreate函数, 添加Debug.sta......

desaco
2018/10/24
0
0
应用卡顿优化

概要 应用运行时的卡顿问题非常影响用户体验,严重降低产品表现力,本文将介绍应用卡顿原因以及分析方法等等。 卡顿问题可分为两类,应用卡顿和系统卡顿,本文针对系统正常时应用卡顿场景。 ...

某昆
2017/09/30
0
0
Android系统性能调优工具介绍

经作者授权,发表Tieto某青年牛的一篇《程序员》大作。 Android系统性能调优工具介绍 在软件开发过程中,想必很多读者都遇到过系统性能问题。而解决系统性能问题的几个主要步骤是: 测评:对...

邓凡平
2013/06/02
13.5K
17
Android性能分析工具简介

在Android项目开发工程中,功能开发只是其中的一部分,更多的时候是优化,优化除了个人的良好习惯,往往还需要借助第三方工具。本文罗列Android优化过程中的一些常用工具借助这些工具,可以很...

code_xzh
2018/05/02
0
0
爱奇艺技术分享:爱奇艺Android客户端启动速度优化实践总结

本文由爱奇艺技术团队原创分享,原题《爱奇艺Android客户端启动优化与分析》。 1、引言 互联网领域里有个八秒定律,如果网页打开时间超过8秒,便会有超过70%的用户放弃等待,对Android APP而...

JackJiang2011
01/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
3
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
7
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部