当前位置: 首页 > article >正文

Android性能优化第(六)篇---TraceView 分析图怎么看

Android性能优化系列好久没有更新了,一直在写Android源码解析的部分,附上前面性能优化文章的链接。

Android性能优化第(一)篇—基本概念
Android性能优化第(二)篇—Memory Monitor检测内存泄露
Android性能优化第(三)篇—MAT比Menmery Monitor更强大
Android性能优化第(四)篇—Allaction Tracing追踪内存分配的轨迹
Android性能优化第(五)篇—AndroidUI渲染机制

现在废话不多讲,直接开车了。TraceView是什么,TraceView 是 Android 平台特有的数据采集和分析工具,主要用做热点分析,找出最需要优化的点。TraceView 从代码层面分析性能问题,针对每个方法来分析,比如当我们发现我们的应用出现卡顿的时候,我们可以来分析出现卡顿时在方法的调用上有没有很耗时的操作,通过TraceView,可以得到两种数据。
- 单次执行最耗时的方法
- 执行次数最多的方法

TraceView

要打开上面的面板,一般有两种方式

1、第一种方式

首先选择跟踪范围,在想要根据的代码片段之间使用以下两句代码

   Debug.startMethodTracing(“hello”);Debug.stopMethodTracing();

生成的traceview文件会自动放在SDCARD上,没有SDCARD卡会出现异常,所以使用这种方式需要确保应用的AndroidMainfest.xml中的SD卡的读写权限是打开的,其中hello是traceview文件的名字,是然后用adb导出traceview文件。

adb pull sdcard/hello.trace    C:\Users\wangjing\Desktop

然后启动Android Device Monitor–>File–>openFile,打开traceview文件即可。

2、第二种方式

同样是要先打开Android Device Monitor

先选择应用进程,然后点击Start Method Profiling(开启方法分析),按钮会变为Stop Method Profiling(停止方法分析),开启方法分析后,对应用的目标页面进行测试操作,测试完毕后停止方法分析,界面会自动跳转到 DDMS 的 trace 分析界面。

两种方式的对比:第一种方式更精确到方法,起点和终点都是自己定,不方便的地方是自己需要添加方法并且要导出文件,第二种方式的优缺点刚好相反。

2、分析方式

下面写一个DEMO,来分别模拟调用次数不多,但每次调用却需要花费很长时间的函数,和自身占用时间不长,但调用却非常频繁的函数。


public class MainActivity extends Activity {int count = 0;long longCount=-1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Debug.startMethodTracing("hello");//线程1new Thread(new Runnable() {@Overridepublic void run() {printNum();}},"printNum_thread").start();//线程2new Thread(new Runnable() {@Overridepublic void run() {calculate();}},"calculate_thread").start();}@Overrideprotected void onDestroy() {super.onDestroy();Debug.stopMethodTracing();}private void printNum() {for (int i = 0; i < 20000; i++) {print();}}/*** 模拟一个自身占用时间不长,但调用却非常频繁的函数*/private void   print(){count=count++;}/*** 模拟一个调用次数不多,但每次调用却需要花费很长时间的函数*/private  void  calculate(){for (int i = 0; i < 1000; i++) {for (int j = 0; j < 1000; j++) {for (int l = 0; l < 1000; l++) {if(longCount>10){longCount=-10;}}}}Log.e("MainActivity",String.valueOf(longCount));}
}

现在来分析一下采集的数据。先看线程面板
线程面板
在线程面板上发现我们应用中的三个线程,main线程,这个线程是都会有的,还有printNum_thread,calculate_thread两个线程。

再看时间线面板

时间线面板
时间线面板以每个线程为一行,右边是该线程在整个过程中方法执行的情况,一行中有很多的小色块。这些色块代表采集过程中方法调用时间线,相同的颜色代表相同的方法,其中的每一个小色块就代表一次方法的调用,色块的长度代表方法执行时间的长短,左边为第一个色块代表方法执行开始,最右边色块代表最后一个方法执行结束,有时候可以根据色块长度来做个大致判断,哪一个方法执行时间相对来说比较长,你可以把鼠标放到色块上,就会显示该方法调用的详细信息,你可以随意滑动你的鼠标,滑倒哪里,左上角就会显示该方法调用的信息,并且可以按住CTRL键加鼠标滚轮进行放大。如下图。

方法调用信息
比如我放大后,现在鼠标停在一个红色的方块上,这个红色的方块是在printNum_thread线程条上,左上角显示了这个色块代表的是MainActivity的printNum方法,在0.883的时候调用了这个方法,下面还有一些详细时间信息,下面细说。如果想回到最初的状态,双击时间线就可以。

最后看一下数据分析面板,在数据分析面板,你可以点击某个函数展开更详细的信息

数据分析面板
展开后,大多数有以下两个类别:
- Parents:调用该方法的父类方法
- Children:该方法调用的子类方法
如果该方法含有递归调用,可能还会多出两个类别:
- Parents while recursive:递归调用时所涉及的父类方法
- Children while recursive:递归调用时所涉及的子类方法

至于数据分析面板红色框中,各个字段的含义如下:

开发者最关心的数据有:
很重要的指标:Calls + Recur Calls / Total , 最重要的指标: Cpu Time / Call
因为我们最关心的有两点,一是调用次数不多,但每次调用却需要花费很长时间的函数。这个可以从Calls + Recur Calls / Total反映出来。另外一个是那些自身占用时间不长,但调用却非常频繁的函数。这个可以从* Cpu Time / Call*反映出来。

点击Calls + Recur Calls这一栏,可以按照方法调用次数排序,如下图,可以看出print方法执行了2000次。
调用次数最多
点击Cpu Time / Call这一栏,可以按照方法调用时间排序,如下图,
占用CPU时间最多
可以看到calculate方法执行了13s多,非常的耗时。

这是模拟的两个极端的情况,实际情况下,分析的难度比较大,但是当体验卡顿的时候,我们可以借助TraceView来定位问题。所以TraceView虽说不常用,但是还是很有意义的!

参考链接:
- Android 编程下的 TraceView 简介及其案例实战
- android使用traceView进行性能测试
- android性能测试专项测试
- Android性能专项测试之TraceView工具(Device Monitor)
- Android系统性能调优工具介绍

Please accept mybest wishes for your happiness and success!

http://www.lryc.cn/news/2414743.html

相关文章:

  • P2P(Peer to Peer)网络的原理
  • 【Android TV 开发】-->一些优秀 TV 开发相关框架 文章
  • OpenGL绘图基础
  • 基础电子元器件介绍-4.二极管
  • 第十三篇 Python建模库介绍
  • Sudoku Problem Solver (数独游戏解谜器)
  • 什么是腾讯云轻量应用服务器?2023年腾讯云轻量与云服务器对比区别有哪些?
  • 洗牌算法
  • 网站设计基础:简述各类有创意的导航方式
  • AutobahnPython: 功能强大的实时通信框架
  • 如何在 Linux下进行文件切割操作?
  • .net面试问答(大汇总)
  • 记一次配置华为路由器DDNS(花生壳)动态域名解析
  • awstats的安装和配置
  • C# System.NullReferenceException 异常与回调函数初始化
  • CSDN积分获取方法(转)
  • 101个微软提供的Visual Studio 2005示例
  • 谷歌浏览器GoogleChrome“无法访问此网站”问题解决
  • Video_player_for_3DS 开源项目教程
  • EventHandler(事件处理器)学习
  • VBA中 InputBox 函数
  • 论文速读之SUNet、MAXIM、Restormer、MIRNet、SwinIR、HINet、MPRNet、CSRNet
  • ARM Cortex M3 基础(学习笔记)
  • CopyFile 使用方法
  • 数据库系统原理
  • 【CTS测试】CTS测试环境搭建
  • C++图片保存,加载(LoadImage()),编辑,资源句柄(HBITMAP )的使用总结
  • Root你的设备
  • BBS论坛系统的设计与实现
  • linux的 lseek 函数