Android性能与优化初步

Android性能与优化初步

TraceView tool使用介绍

       Traceview是Android平台特有的数据采集和分析工具,它主要用于分析Android中应用程序的hotspot。Traceview本身只是一个数据分析工具,而数据的采集则需要使用Android SDK中的Debug类或者利用DDMS工具。

界面

上半部分(Timeline Panel界面):

图1-1

由上图可以看到,这是一个trace文件,记录在一定时间内,程序运行的一些信息。

  • 左边Pane显示的是测试数据中所采集的线程信息。
  • 右边Pane所示为时间线,时间线上是每个线程测试时间段内所涉及的函数调用信息。这些信息包括函数名、函数执行时间等。由图1-4可知,main线程对应行的的内容非常丰富,而其他线程在这段时间内干得工作则要少得多。
  • 另外,开发者可以在时间线Pane中移动时间线纵轴。纵轴上边将显示当前时间点中某线程正在执行的函数信息。

下半部分(Profile Panel界面):

图1-2

Profile Panel是Traceview的核心界面,其内涵非常丰富。它主要展示了某个线程(先在Timeline Panel中选择线程)中各个函数调用的情况,包括CPU使用时间、调用次数等信息。在Profile Panel中,选择按Cpu Time/Call进行降序排序(从上之下排列,每项的耗费时间由高到低)。

 

表1-1  Profile Panel各列作用说明

列名

描述

Name

该线程运行过程中所调用的函数名

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类似,只不过统计单位换成了真实时间

 

另外,每一个Time列还对应有一个用时间百分比来统计的列(如Incl Cpu Time列对应还有一个列名为Incl Cpu Time %的列,表示以时间百分比来统计的Incl Cpu Time)。

使用方法

  • 开发者在一些关键代码段开始前调用Android SDK中Debug类的startMethodTracing函数,并在关键代码段结束前调用stopMethodTracing函数。这两个函数运行过程中将采集运行时间内该应用所有线程(注意,只能是Java线程)的函数执行情况,并将采集数据保存到/mnt/sdcard/下的一个文件中。开发者然后需要利用SDK中的Traceview工具来分析这些数据。
  • 借助Android SDK中的DDMS工具。DDMS可采集系统中某个正在运行的进程的函数调用信息。对开发者而言,此方法适用于没有目标应用源代码的情况。DDMS工具中Traceview的使用如图1-3所示。

图1-3

利用Traceview来查找热点

一般而言,热点包括两种类型的函数(hotspot即是有可能我们要进行优化的部分):

  • 一类是调用次数不多,但每次调用却需要花费很长时间的函数。在示例代码中,它就是热点 1。
  • 一类是那些自身占用时间不长,但调用却非常频繁的函数。在示例代码中,它就是热点 2。

如果以上热点是你自己写的方法,那么这就意味着你可以对这些方法进行优化。而在这两者里,热点1比较好找,因为透视图面板一开始是以时间长度降序排列的,你也可以通过手动点击字段来设置排序的条件。

    你可以通过这些方法所占用cpu的时间百分比进行取舍,决定是否要对该方法进行优化。

注:Framework的函数也有可能是热点,但主因一般还是在应用本身(例如设置复杂的界面,导致对应XML解析非常慢)。

Traceview的缺点

虽然Traceview工具是Android平台应用程序性能分析的利器,但是个人觉得它的UI还是有些复杂。并且使用的流畅度不够好。

 

HierarchyViewer使用介绍

为什么使用HierarchyViewer

不合理的布局会使我们的应用程序UI性能变慢,HierarchyViewer能够可视化的角度直观地获得UI布局设计结构和各种属性的信息,帮助 我们优化布局设计。HierarchyViewer是我们优化程序的工具之一,它是Android自带的非常有用的工具,可以帮助我们更好地检视和设计用 户界面(UI),绝对是UI检视的利器。

怎么使用HierarchyViewer

1)连接设备真机或者模拟器(真机可能无法连接,我用的2.3,连接上了,没读到内容);

2)启动你要观察的应用。

3)打开Hierarchyviewer,点击hierarchyviewer文件即可。连接后如下图:


图2-1

4)双击最上面的,如下图的,这个是当前窗口,加载完毕后会显示当前界面层次结构。

5)观察层次结构图,这个图有点大,可以拖动。View Hierarchy窗口显示了Activity的所有View对象,选中某个View还可以查看View的具体信息,最好选择工具中的Show Extras选项。

图2-2

6)观察单个view,选择单个view后会出现如下图所示图形。这里会看到Measure、Layout、Draw的耗时。

图2-3

如上图,这里1 view表明这个文本控件没再包含其他子控件了,只有1个就是它本身。而下方的带颜色的三个圆圈指示灯,分别说明了在测量(measure)、布局(layout)以及画视图(draw)三个阶段,这个控件所占用的时间百分比,如果是绿色的,表示该控件在该阶段比起其他50%的控件的速度要快,为黄色的表示比起其他的50%的控件的速度要慢,为红色的则表示该控件在该阶段的处理速度是最慢的。

View Hierarcy 同时能帮助你识别渲染性能比较低的部分。View节点中带有红色或黄色的点代表速度较慢的View对象。如单步运行应用程序那样,你可以这样来判断某个 View 速度一直很慢,还是只在某个特定环境下速度才慢。

请注意,低性能并不表示一定有问题,特别像是ViewGroup对象,View的子节点越多,结构越复杂,性能越差。

View Hierarchy 窗口还可以帮助你找到性能问题。只要看每个View节点的性能指标(颜色点)就可以,你可以看到测量(布局或绘制)最慢的View对象是哪个,这样你就能 快速确定,要优先察看哪个问题。

图2-4

当我们按“display View”按钮后,在当我们点某个控件时,在稍等1-2秒后,会另外单独打开一个小窗口,显示该空间的单独效果图

1)我们再来看下右上角的缩略显示窗口,当界面里的控件太多时,可以在这个窗口中,点选某一部分,立刻会在主窗口中显示该区域控件的情况

2)在右方中部的属性列表中,会显示所点击的控件的详细属性情况

3)右下角则显示所点击的控件在整个界面中的实际位置,如果勾选了show extra views,则还会在这个区域中,将控件的实际图片也显示出来,十分清晰。

HierarchyViewer插件功能说明:

图2-5

刷新显示

要注意的是,在HierarchyViewer中,当修改了界面后,需要手工点Refresh按钮,才能同步在Hierarchy Viewer中显示更新过后的界面情况。下图是分别对应用中的第2,第3个界面进行操作的示意图,可以看到,这两个界面的布局比第一个界面稍微复杂了。

HierarchyViewer的缺点

在使用的过程中HierarchyViewer对非常复杂的布局的显示会十分吃力,并且偶尔会无法显示单个view的详细情况,有部分机型无法连接。

Lint Warnings使用介绍

Lint是SDK Tools 16 (ADT 16)之后才引入的工具,通过它对Android工程源代码进行扫描和检查,可发现潜在的问题,以便程序员及早修正这个问题。Android Lint提供了命令行方式执行,还可与IDE(如Eclipse)集成,并提供了html形式的输出报告。

由于Android Lint在最初设计时就考虑到了independent于IDE,所以它可以很方便的与项目中的其他自动系统(配置/ Build / 测试等)集成.

Lint静态代码分析工具,无需运行,无需测试用例 扫描整个项目,分析以下潜在的问题,分类指出问题描述、问题位置,并提供合理的修改建议。

图3-1

图3-2

图3-3

图3-4

Android Lint主要用于检查以下这些错误:

1、Missing translations (and unused translations)没有翻译的文本

2、Layout performance problems (all the issues the old layoutopt tool used to find, and more)

3、Unused resources未使用的冗余资源

4、Inconsistent array sizes (when arrays are defined in multiple configurations)在多配置中的数组大小不一致文件

5、Accessibility and internationalization problems (hardcoded strings, missing contentDescription, etc)

6、Icon problems (like missing densities, duplicate icons, wrong sizes, etc)

7、Usability problems (like not specifying an input type on a text field)

8、Manifest errors

当然Android Lint远远不至检查以上的错误,更多的内容可以参考《Android Lint 检查规则列表

它们的意义分别如下:

 刷新

 快捷修复

 检查规则的基本定制

 在这个文件中忽略这个问题

  在这个工程中忽略这个问题

  在所有文件中忽略这个问题

 删除这条lint标记

 删除所有的lint标记

 展开所有lint,显示具体问题

 关闭所有lint显示的详情

  Configure Columns用于设置在lint Window中对于检查出的issue的哪些项显示哪些项不显示

图3-5

 Edit Options Edit Options 点击该按钮会弹出Lint Preference dialog,如图1或图3-8在里面你可以定制默认/全局的Android Lint的基本检查规则,在其中可以设置所有项目默认的lint检查规则的检查级别,把检查级别(Severity)设为”ignore“,其实就是忽略(suppress)该检查规则

图3-6

总结:

性能检视有关的工具还有很多如MAT,Oprofile等,根据个人的需要使用这些工具对工程进行优化,能够提高代码的健壮性并能适当地提升应用程序的性能,了解这些工具的使用对有志于这方面的程序员能够提供一定的帮助。
参考资料:

       http://blog.jobbole.com/78995/

       http://www.cnblogs.com/sunzn/p/3192231.html

       http://hb.qq.com/a/20110809/000032.htm

       http://blog.csdn.net/xyz_lmn/article/details/14222975

       http://www.cnblogs.com/0616–ataozhijia/p/3746260.html

       Android Lint 检查规则列表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值