欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android性能分析工具systrace使用

程序员文章站 2023-11-23 11:21:58
Android性能分析工具systrace的使用,能根据需要抓取trace。 了解trace文件中数据的含义,能分析简单的性能问题。 1、systrace简介 systrace是Android4.1版本之后推出的,对系统Performance分析的工具。 systrace的功能包括跟踪系统的I/O操 ......

android性能分析工具systrace的使用,能根据需要抓取trace

了解trace文件中数据的含义,能分析简单的性能问题。


1systrace简介


systraceandroid4.1版本之后推出的,对系统performance分析的工具。

systrace的功能包括跟踪系统的i/o操作、内核工作队列、cpu负载以及android各个子系统的运行状况等。android平台中,它主要由3部分组成:

  • 内核部分:systrace利用了linux kernel中的ftrace功能。所以,如果要使用systrace的话,必须开启kernel中和ftrace相关的模块。

  • 数据采集部分android定义了一个trace。应用程序可利用该类把统计信息输出给ftrace。同时,android还有一个atrace程序,它可以从ftrace中读取统计信息然后交给数据分析工具来处理。

  • 数据分析工具android提供一个systrace.pypython脚本文件,位于android sdk目录/sdk/platform-tools/systrace中,其内部将调用atrace程序)用来配置数据采集的方式(如采集数据的标签、输出文件名等)和收集ftrace统计数据并生成一个结果网页文件供用户查看。

     

简单来说,当机器以60/秒显示(也就是16.6 ms),用户会感觉机器会流畅。如果出现显示时出现丢帧的情况,就需要知道系统在做什么?

systrace 是用来收集系统和应用的数据信息和一些中间生成数据的细节,在android 4.1系统和4.1之后的系统。

systrace在一些分析显示的问题上特别有用,如应用画图慢,显示动作或动画时变形


2、抓取systrace

进入android/sdk/platform-tools/systrace目录下

 

python systrace.py -b 8000 -t 5 -o systrace.html


 

google chrome浏览器可以打开systrace,如果打不开,可以浏览器输入chrome://tracing/,然后load systrace


1)脚本命令的option

options

描述

-o < file >

输出的目标文件

-t n, –time=n

执行时间,默认5s

-b n, –buf-size=n

buffer大小(单位kb),用于限制trace总大小,默认无上限

-k < kfuncs >,–ktrace=< kfuncs >

追踪kernel函数,用逗号分隔

-a < app_name >,–app=< app_name >

追踪应用包名,用逗号分隔

from-file=< from_file >

从文件中创建互动的systrace

-e < device_serial >,–serial=< device_serial >

指定设备

-l, –list-categories

列举可用的tags


2) 在app添加自己的systrace log

说明1-o trace输出的文件路径

说明2--time 配置抓取systrace的时间,通常设置5秒,并在5秒内重现问题,时间太短会导致问题重现时没有被抓到,时间太长会导致javaheap不够而无法保存,因此在能抓到问题点的情况下,时间越小越好。

说明3--buf-size buffer size是存储systracesize,同样的,太小会导致信息丢失,时间太长会导致java heap不够而无法保存,建议20480

说明4:如果用户有自己在应用程序中加入自己的systrace log,如下:

trace.beginsection("newinstance");

trace.endsection("newinstance");

那么此处必须选择这个应用对应的进程名字,否则新加的systrace log不会被抓到。


在一些方法里加入trace 方便自己 跟踪调试 , 如下:

trace.tracebegin("performtraversals");

try {

……

} finally {

trace.traceend();

}

需要保证 tracebegin traceend 一定要成对出现。 并且一定要在同一个线程里面。

加入trace的好处在于,生成的trace文件中,会在跟踪的代码段执行对应时间轴区间打上一个tag标记(比如上例中的performtraversals

如果在代码中加入了trace,在生成trace文件时,必须指定进程为trace所在的进程



3systrace.html分析

3.1 trace图结构

3.1.1、颜色释义

在进程的上面有一条很细的进度条,包含了该线程的状态:

灰色: 睡眠。
蓝色: 可以运行(它可以运行,但还未被调度运行)。
绿色: 正在运行(调度程序认为它正在运行)。

红色: 不间断的睡眠(通常发生在内核锁上), 指出i / o负载,对于性能问题的调试非常有用
橙色: 由于i / o负载导致的不间断睡眠。
要查看不间断睡眠的原因(可从sched_blocked_reason跟踪点获取),请选择红色不间断睡眠切片。

------------------------------------------------------------------------------------------------------------------------

同一个进程内按线程进行纵向拆分,每个线程记录自己的工作分别以包名为标识。每个应用进程都会包含其中所有线程的记录信号,可以看到从inputeventrenderthread都有

除了进程和线程运行信息,还有两个重要信息:

3.1.2frame(例:ui performance

每个app都有一行专门显示frame,每一帧就显示为圆圈,正常绘制是160帧,大约一帧16.6毫秒,在这个值以下是正常颜色绿色,如果超过它就会变成红色、黄色。非绿色的都说明有问题。这时需要通过’w’键放大那一帧,然后按‘