文章目录
  1. 1. 性能优化工具
    1. 1.1. Profile GPU rending
  2. 2. 查看overdraw情况:
  3. 3. HierarchyViewer
    1. 3.1. TraceView
      1. 3.1.1. 代码中确定起始点和结束点
      2. 3.1.2. DDMS
    2. 3.2. Systrace

参考资料:
胡凯的性能优化笔记 http://hukai.me/android-performance-patterns/
trinea的性能优化 http://www.trinea.cn/android/performance/
高建武的系列文章 http://androidperformance.com/

性能优化工具

Profile GPU rending

.android要求绘制的帧率在60fps,因此我们需要了解我们的app现在的帧率
可以在 Developer options打开Profile GPU rending选项,再用
adb shell dumpsys gfxinfo 即可获得最近128帧消耗的时间
Draw 是指花费在创建和更新Display List 上的时间,在Android中,一个视图在进行渲染之前,先要被转换成GPU所熟悉的格式,简单来说就是几条绘图命令,复杂点的可能是你的自定义的View嵌入了自定义的Path. 一旦完成,结果会作为一个DisplayList对象被系统送入缓存,可以理解为 View.onDraw(Canvas) 所消耗的时间。可以理解为执行每一个View的onDraw方法,就是创建或者更新每一个View的Display List对象
Process :Android 2D Redner 处理 Display List 的时间
Excute:Swap GL buffers

查看overdraw情况:

OverDraw是一个术语, 指的是在屏幕一个像素上绘制多次(超过一次),比.问题就在于,像素渲染的并不全是用户最后能看打的部分, 这是在浪费GPU的时间.OverDraw很大程序上来自于视图互相重叠的问题,更经常发生的是不必要的背景重叠.
在 Developer options 里打开 show overdraw options.
透明 = no overdraw
蓝色: 1倍过度绘制,即一个像素点绘制了2次
绿色:2倍过度绘制,即一个像素点绘制了3次
浅红色:3倍过度绘制,即一个像素点绘制了4次
深红色:4倍过度绘制及以上,即一个像素点绘制了5次及以上
比如去除Window的默认背景:
this.getWindow().setBackgroundDrawableResource(android.R.color.transparent);

HierarchyViewer

ddms有该工具
1.树视图展现了视图控件的相互关系。
2.树视图中可以显示每个节点measure、layout、draw的时间,并且每一项用一个圆点表示其耗时是否正常,每个圆点分别用绿色、黄色、红色表示耗时正常、警告、危险,这样就可以很方便的找到有性能瓶颈了。如果树视图中没有显示这些时间,你可以点击“Obtain layout times for tree rooted at selected node”按钮刷新界面显示。

TraceView

用以跟踪方法执行时间,有2种方法

代码中确定起始点和结束点

在开始调试的地方,如Activity的onCreate函数,添加Debug.startMethodTracing(“tracefilename”);
结束调试的地方,如Activity的onDestroy函数,添加Debug.stopMethodTracing();
之后运行你的app一段时间并退出会在sd卡根目录生成tracefilename.trace这个log文件,记录这段时间内的运行信息。
将日志文件pull到PC端,cmd到android sdk tools文件夹内(或绑定sdk tools目录到系统path内),运行traceview tracefilename.trace即可打开TraceView分析界面

DDMS

打开devices窗口,选择某个进程,点击右上角的start method profiling
运行app一段时间后,再点击已变成stop method profiling的该按钮。eclipse会自动弹出debug的标签(可通过菜单File->save as保存数据)
Incl Cpu Time:某函数占用的CPU时间,包含内部调用其它函数的CPU时间
Excl Cpu Time:某函数占用的CPU时间,但不含内部调用其它函数所占用的CPU时间
Incl Real Time:某函数运行的真实时间(以毫秒为单位),内含调用其它函数所占用的真实时间
Excl Real Time:某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间
Call+Recur Calls/Total:某函数被调用次数以及递归调用占总调用次数的百分比
Cpu Time/Call:某函数调用CPU时间与调用次数的比。相当于该函数平均执行时间
Real Time/Call:同CPU Time/Call类似,只不过统计单位换成了真实时间

Systrace

http://developer.android.com/tools/debugging/systrace.html
可收集Android关键子系统(如surfaceflinger、WindowManagerService等Framework部分关键模块、服务)的运行信息,从而帮助分析系统瓶颈,改进性能。
ddms亦有该工具,点击直接运行。
工具会记录5秒钟的数据,之后我们回得到一个html页面。打开后,我们能看到页面中显示了系统中一切运行情况的概述。   
浏览的操作时通过WASD来完成,W/S 放大/缩小 A/D 左移/右移   
surfaceFlinger能反应出整体绘制情况,一般正常情况都是连续的,如果出现空档,一种是没有操作或者滑动到头,没东西需要绘制,这种属于正常,另一种就是有问题存在,有其他操作时间过长。
另外,
在SDK/tools/systrace下面有一个systrace.py的Python脚本,也可以使用这个脚本可以生成相应的HTML结果文件。
要追踪函数,先要设置相应的TAG,有两种方式可以使用,一种用设置-》开发者选项-》启用跟踪,选择相应的TAG就可以了,第二种方式是用命令模式:
./systrace.py —set-tag加相应的TAG就可以了,与从设置里设置TAG一样的效果,但使用命令模式,需要adb shell stop及adb shell start一下,注意TAG之间不能有空格。
android 4.3系统上,应用可以使用添加自己的tag
import android.os.Trace;
Trace.beginSection(“TEST”);
Trace.endSection();
添加systrace跟踪,然后通过thon systrace.py —app=TEST 指定apk。

待续

文章目录
  1. 1. 性能优化工具
    1. 1.1. Profile GPU rending
  2. 2. 查看overdraw情况:
  3. 3. HierarchyViewer
    1. 3.1. TraceView
      1. 3.1.1. 代码中确定起始点和结束点
      2. 3.1.2. DDMS
    2. 3.2. Systrace