本文主要介绍Android性能调优工具TraceView的使用及通过其确定性能点

目前性能优化专题已完成以下部分:

性能优化总纲——性能问题及性能调优方式

性能优化第四篇——移动网络优化

性能优化第三篇——Java(Android)代码优化
性能优化第二篇——布局优化
性能优化第一篇——数据库性能优化

性能优化实例

Android自带的TraceView堪比java的性能调优工具visualvm线程视图,可以方便的查看线程的执行情况,某个方法执行时间、调用次数、在总体中的占比等,从而定位性能点。
1、生成日志,运行TraceView
运行TraceView有两种方式
a、调用Debug类
在开始调试的地方,如Activity的onCreate函数,添加

Java <textarea class="crayon-plain print-no" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">Debug.startMethodTracing(&quot;tracefilename&quot;);</textarea>
1 Debug . startMethodTracing ( "tracefilename" ) ;

结束调试的地方,如Activity的onDestroy函数,添加

Java <textarea class="crayon-plain print-no" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">Debug.stopMethodTracing();</textarea>
1 Debug . stopMethodTracing ( ) ;

之后运行你的app一段时间并退出会在sd卡根目录生成tracefilename.trace这个log文件,记录这段时间内的运行信息。
将日志文件pull到PC端,cmd到android sdk tools文件夹内(或绑定sdk tools目录到系统path内),运行traceview tracefilename.trace即可打开TraceView分析界面,如下


这种方式可以随意开始和结束调试的位置,所以适合具体代码的性能排查。find貌似只支持小写,所以如果查找JsonObject需要输入jsonobject

b、使用DDMs
打开devices窗口,选择某个进程,点击右上角的start method profiling

运行app一段时间后,再点击已变成stop method profiling的该按钮。eclipse会自动弹出debug的标签(可通过菜单File->save as保存数据)。界面同上面。
这种方式不需要修改代码,所以对于没有源码的程序同样可以进行排查。同时可以方便的进行全局性能排查

2、TraceView界面信息介绍
TraceView界面包括时间面板和方法面板
(1) 时间面板(Timeline Panel)
时间面板展示了每个线程的执行情况,其中的[1]main即为ui主线
程。
移动到某个位置可以查看该点对应的方法的执行信息,点击方法面板则会选中相应的方法。
可以左键按住不放选中区域放大局部精细查看,不同方法用不同颜色标注

(2) 方法面板(Profile Panel)
方法面板展示了所有方法的执行情况,点击某个方法可以查看在对应线程上的执行时间区域,并会显示其父方法及子方法。

每个方法包括如下信息列,可点击某列进行排序,从而确定产生性能问题的函数:
Incl Cpu Time, Excl Cpu Time, Incl Real Time, Excl Real Time, Incl Cpu Time%, Excl Cpu Time%, Incl Real Time%, Excl Real Time%, Calls+RecurCalls/Total, Cpu Time/Call, Real Time/Call
所有的Time都是以毫秒计算。每列具体含义及作用如下:
a. Incl表示将所有子函数耗时也计算在内,Excl则表示不包括子函数的调用时间。对比可以确定耗时操作发生是自身还是子函数中。
b. Cpu Time表示占用cpu执行的时间,Real Time包括Cpu Time以及等待、切换的时间等,所以一般都大于Cpu Time。对比可以判断耗时操作是否在cpu执行段内。
c. 上面四个指标对应的%表示函数在总时间的占比。方便查看某个函数的时间占比。
d. Calls+RecurCalls/Total表示被外部调用次数+递归次数/总次数。可以查看调用次数是否符合自己预期。
e. Cpu Time/Call, Real Time/Call表示总的Cpu Time及Real Time与总调用次数的比例。查看每次调用的耗时,一般可通过简单此项确定每个函数的性能。

3、其他调优工具
(1) dmtracedump
sdk tools下的另外一个工具dmtracedump可用于生成上述log文件内的函数调用关系图,不过在windows上稍微大点的文件即或报错

(2) visualvm
看到ddms提供了dump hprof file的功能,本来准备生成hprof文件用visualvm打开试试,结果一直打不开..

在银狐的帮忙下,发现android sdk tools dump的hprof需要经过sdk tools下的hprof-conv转换为标准的hprof文件,才能通过visualvm或eclipse的MemoryAnalyzer打开进行分析,之后就同java一样了。hprof-conv格式为

hprof-conv <infile> <outfile>

关于visualvm可以简单的查看http://trinea.iteye.com/blog/1216170

之后会写篇文章详细的介绍visualvm和MemoryAnalyzer

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. Android(安卓)重点知识回顾
  5. Android架构组件(三)——ViewModel
  6. 转:[Android]实现静默安装APK的两种方法
  7. 性能优化工具
  8. [Android]实现静默安装APK的两种方法
  9. Unity3D研究院之与Android相互传递消息(十九)

随机推荐

  1. android ListView的滑动效率问题
  2. [置顶] 学习链接
  3. android 开发问题----avd按钮无法按
  4. android系统自带的intent集锦
  5. android开发教程(八)——环境搭建之android
  6. varnish 配置使用 Chrome,iphone,android
  7. 编译用于Android的busybox---步骤,问题和
  8. Vue和ios、android交互通信
  9. Android(安卓)基于paho的mqtt service的
  10. Textview与Button设置圆角