系统优化工具TraceviewDDMS-HeapMAT(MemoryAnalyzerTool)HierarchyViewerLintTraceviewTraceview是android平台配备的一个很好的性能分析工具。它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到method。它是一个数据分析工具,主要的数据为程序执行过程中各个方法所占用的cpu时间,通过消耗的时间以及调用的次数来分析程序的性能。Traceview——数据采集•方法一:通过在代码中添加相关函数如果具体定位到需要分析的关键代码,在关键代码段开始前调用AndroidSDK中Debug类的startMethodTracing()方法,在关键代码段结束前调用stopMethodTracing()方法。若未定位具体定位到相关代码,可分别在onCreate()和onDestory()方法里调用。在这两个方法的运行过程中将采集运行时间内该应用所有线程的方法执行情况,并采集数据保存到执行的sdcard目录下的一个文件中。再将该文件pull到电脑中,拖拽到Eclipse里打开。Traceview——数据采集•方法一:通过在代码中添加相关函数在点击“更新”摁钮的时候开始数据采集在界面更新完成后结束数据采集。数据文件路径为storge/sdcard0/aaa.traceTraceview——数据采集•方法二:通过AndroidSDK中的DDMS工具此方法适用于没有目标应用源代码的情况。打开Eclipse中的DDMS界面,选中所要跟踪的进程。点击上方的Start/StopMethodProfiling摁钮来开始/停止采集数据。当停止采集时,DDMS会自动触发Traceview工具来浏览采集到的数据。Traceview——数据采集•方法二:通过AndroidSDK中的DDMS工具Traceview——图形界面通过Traceview打开采集到的数据,UI分为上下两个面板,一个是TimelinePanel(时间线面板),一个是ProfilePanel(分析面板)。Traceview——图形界面•TimelinePanel左边的Panel为测试数据中所采集的线程信息。右边Panel为时间线,时间线上是每个线程测试时间段内所涉及到的方法调用信息。移动时间线纵轴,将在上方显示当前时间点鼠标所指线程正在执行的方法。Traceview——图形界面•ProfilePanel列名描述Name线程运行过程中所调用的方法名InclCpuTime某方法占用的CPU时间,包含内部调用其他方法的CPU时间ExclCpuTime某方法占用的CPU时间,但不包含内部调用其他方法的CPU时间InclRealTime某方法运行的真实时间(毫秒),包含内部调用其他方法的真实时间ExclRealTime某方法运行的真实时间(毫秒),不包含内部调用其他方法的真实时间Call+RecurCalls/Total某方法被调用次数以及递归调用占总调用次数的百分比CpuTime/Call某方法调用CPU时间与调用次数的比,相当于该方法平均执行时间RealTime/Call同CpuTime/Call类似,但统计单位为真实时间每个Time列对应有一个用时间百分比来统计的列,表示以百分比来统计各个时间。Traceview——图形界面移动TimelinePanel上的时间线纵轴,界面将显示当前时间点鼠标所指线程正在执行的方法调用情况Traceview——图形界面点击ProfilePanel内的某个方法名,将会展开该方法被调用及调用情况,同时也会在TimelingPanel内显示出该方法在各个线程中被执行的时间段。Traceview——数据分析•LetvWeatherTraceview——数据分析•LetvWeather首先对应用程序中自己实现的方法进行排查。将ProfilePanel先按InclCpuTime%的降序来进行排序,从Name列表里从上到下寻找到应用程序中自己实现的方法。Traceview——数据分析•LetvWeather也可以按CpuTime/Call降序排列,排在第一至第四为的都为我们自己实现的方法,分别为:onClick(),access$400,onKeyConfirm(),onItemConfirmed()。Traceview——数据分析•LetvWeatherTraceview——数据分析•LetvWeatherTraceview——数据分析•LetvWeather重点分析ConfigManager里的saveWeatherUpdateAferCityUpdate,setLocation,setProvince,setArea和setCity五个方法。通过点击这五个方法,从TimelinePanel里我们可以看到这五个方法所在的线程都是Main线程。DDMS-HeapAndroidtools中的DDMS带有一个内存检测工具Heap,可以用来检测应用进程的内存使用情况。•启动eclipse后,切换到DDMS视图,打开Devices视图和Heap视图。•设备连上PC后,在Devices视图中将显示设备的序列号,以及正在运行的进程信息。•选中待检测的进程,点击上方的“UpdateHeap”图标,此时对应进程名的后方会出现一个小标志。DDMS-Heap•在Heap视图里点击”CauseGC”摁钮。•在Type列中点击不同的类型,将在下方的直方图中显示该类型的数据在内存中的情况。•Type列里有一个dataobject,即数据对象,就是程序中大量存在的类类型的对象,其中的“TotalSize”的值就是当前进程中所有Java数据对象的内存总量。•Type列里的1-bytearray(byte[],Boolean[])一般为程序中的bitmap占用的空间,也包含类似newbyte[data_size]语句开辟的空间。Heap——数据分析•LetvWeatherHeap——数据分析•LetvWeather取消背景设置Heap——数据分析•LetvWeather背景图采用了两种设置方法:在布局文件中通过android:background属性设置通过setBackgroundResource方法设置Heap——数据分析•LetvWeather采用上面的方法设置背景时,会缓存图片的cache,以便重绘时加快速度。如果内存紧张的情况下,在设置大背景图片时尽量避开使用上述两种方法,而用setBackgroundDrawable方法来代替。并在适当的时候调用recycle方法来释放该内存。同时为了减小大背景图片读入到内存的占有空间,也可以对图片做适当的采样处理。Heap——数据分析•LetvWeather处理后MemoryAnalyzerTool(MAT)MAT是一个eclipse的插件,同时也有单独的Windows和Linux版本的客户端,通过解析hprof文件来分析内存使用情况。•在DDMS的Heap视图中,观察对应程序在运行过程中的数据变化•点击Devices视图里的“DumpHproffile”摁钮采集数据,最后确定数据保存路径此时得到的hprof文件在MAT工具中仍然不能打开,需要用SDK中自带的hprof-conv工具进行转换。如:$./hprof-convraw.hprofconverted.hprofMAT——图形界面•Overview视图中指出了内存的使用情况,并通过饼图展示内存的分配情况,列出占用内存最大的几个java对象,以及其他视图工具的链接MAT——图形界面•Histogram,列出每个类的实例对象的数量。ClassName:类名Objects:每一种类型的对象数量ShallowHeap:一个对象本身(不包括该对象引用的其他对象)占用的内存RetainedHeap:一个对象本身,以及由该对象引用的其他对象的ShallowHeap的总和MAT——图形界面•Histogram右菜单中的ListObject(withoutgoingreferences/withincomingreferences),表示列出由该类的对象引用的其他对象/引用该类的对象的其他对象。MAT——图形界面•DominatorTree,列出进程中的所有对象。与Histogram不同的是左侧列是对象,而不是类。MAT——图形界面•DominatorTreeListObject(withoutgoingreferences/withincomingreferences),列出由该对象引用的其他对象/引用该对象的其他对象PathToGCRoots,由当前对象到GCRoots引用链。在子菜单中可以选择排除不同的非强引用组合来筛选到GCRoots的引用链GCRoots,是指那些不会被垃圾回收的对象。图中对象名前面有黄色圆点的就是GCRoots,每个GCRoots对象名的后面有灰黑色的标识,表面这个对象之所有是GCRoots的原因MAT——图形界面•TopConsumers:以class和package分类表示占用内存比较多的对象•LeakSuspects:对内存泄露原因的简单分析,列出可能的怀疑对象MAT——数据分析得到的hprof文件在MAT中打开从Overview视图中的饼图中看到com.my.mattest.MainActivity@0x41887910对象占用了非常多的内存MAT——数据分析DominatorTree视图,按照RetainedHeap降序排列ArrayList类型的成员变量,在该ArrayList集合中包含了非常多的Object对象。MAT——数据分析Histogram视图中按RetainedHeap降序排列java.lang.Object[]类的对象占用的内存最大。MAT——数据分析选择ListObject-withincomingreferences子菜单,按RetainedHeap降序排列java.lang.Object[2261947]@0x43557858对象占用内存最大。点开后发现它是由com.my.mattest.MainActivity@0x41887910中的一个ArrayList引用着。HierarchyViewerHierarchyViewer是AndroidSDK中自带的一个查看界面布局的工具,通过此工具可以详细的理解当前界面的控件布局以及某个控件的属性。在Eclipse里可以将视图切换到HierarchyViewer视图,也可以在命令行里输入命令打开Hierarchyviewer的图形界面,在sdk/tools目录下输入:./hierarchyviewerHierarchyViewer——图形界面•图为在命令行里打开HierarchyViewer的视图“Refresh”为刷新摁钮“LoadViewHierarchy”为进入ViewHierarchywindow,控件层次查看界面“InspectScreenshot”为进入PixelPerfectwindow,界面精确查看模式。左下角的三个图标摁钮,为三个视图的切换HierarchyViewer——图形界面•在ViewHierarchy视图里分成了上图的1,2,3,4四个部分1区域显示界面控件的层次结构,为主窗口2区域是以缩略图的方式显示整个应用中各个控件的层次关系,当一个界面中的控件比较多的时候,可以通过鼠标在这个显示区域进行移动,则左边的1主窗口中会具体显示相关控件信息3区域,显示每个控件的具体信息,是控件的属性面板4区域显示界面的控件的具体位置HierarchyViewer——图形界面在主窗口中点击某个节点后,会在该节点上方弹出一个窗口,显示该控件的实际效果图,子空间的数目,选择上方的“ProfileNode”,会看到测量(Measure)、布局(Layout)、画视图(Draw)的耗时,三个圆圈指示灯。绿色表示该控件在该阶段比起其他的50%的控件的速度要快,黄