Android系統(tǒng)優(yōu)化工具介紹_第1頁(yè)
Android系統(tǒng)優(yōu)化工具介紹_第2頁(yè)
Android系統(tǒng)優(yōu)化工具介紹_第3頁(yè)
Android系統(tǒng)優(yōu)化工具介紹_第4頁(yè)
Android系統(tǒng)優(yōu)化工具介紹_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Android系統(tǒng)優(yōu)化工具介紹第一頁(yè),共62頁(yè)。系統(tǒng)優(yōu)化工具TraceviewDDMS-HeapMAT(MemoryAnalyzerTool)HierarchyViewerLint第二頁(yè),共62頁(yè)。Traceview

Traceview是android平臺(tái)配備的一個(gè)很好的性能分析工具。它可以通過(guò)圖形化的方式讓我們了解我們要跟蹤的程序的性能,并且能具體到method。

它是一個(gè)數(shù)據(jù)分析工具,主要的數(shù)據(jù)為程序執(zhí)行過(guò)程中各個(gè)方法所占用的cpu時(shí)間,通過(guò)消耗的時(shí)間以及調(diào)用的次數(shù)來(lái)分析程序的性能。第三頁(yè),共62頁(yè)。Traceview——數(shù)據(jù)采集方法一:通過(guò)在代碼中添加相關(guān)函數(shù)

如果具體定位到需要分析的關(guān)鍵代碼,在關(guān)鍵代碼段開(kāi)始前調(diào)用AndroidSDK中Debug類(lèi)的startMethodTracing()方法,在關(guān)鍵代碼段結(jié)束前調(diào)用stopMethodTracing()方法。若未定位具體定位到相關(guān)代碼,可分別在onCreate()和onDestory()方法里調(diào)用。

在這兩個(gè)方法的運(yùn)行過(guò)程中將采集運(yùn)行時(shí)間內(nèi)該應(yīng)用所有線程的方法執(zhí)行情況,并采集數(shù)據(jù)保存到執(zhí)行的sdcard目錄下的一個(gè)文件中。

再將該文件pull到電腦中,拖拽到Eclipse里打開(kāi)。第四頁(yè),共62頁(yè)。Traceview——數(shù)據(jù)采集方法一:通過(guò)在代碼中添加相關(guān)函數(shù)在點(diǎn)擊“更新”摁鈕的時(shí)候開(kāi)始數(shù)據(jù)采集在界面更新完成后結(jié)束數(shù)據(jù)采集。數(shù)據(jù)文件路徑為storge/sdcard0/aaa.trace第五頁(yè),共62頁(yè)。Traceview——數(shù)據(jù)采集方法二:通過(guò)AndroidSDK中的DDMS工具

此方法適用于沒(méi)有目標(biāo)應(yīng)用源代碼的情況。打開(kāi)Eclipse中的DDMS界面,選中所要跟蹤的進(jìn)程。點(diǎn)擊上方的Start/StopMethodProfiling摁鈕來(lái)開(kāi)始/停止采集數(shù)據(jù)。當(dāng)停止采集時(shí),DDMS會(huì)自動(dòng)觸發(fā)Traceview工具來(lái)瀏覽采集到的數(shù)據(jù)。第六頁(yè),共62頁(yè)。Traceview——數(shù)據(jù)采集方法二:通過(guò)AndroidSDK中的DDMS工具第七頁(yè),共62頁(yè)。Traceview——圖形界面

通過(guò)Traceview打開(kāi)采集到的數(shù)據(jù),UI分為上下兩個(gè)面板,一個(gè)是TimelinePanel(時(shí)間線面板),一個(gè)是Pro(分析面板)。第八頁(yè),共62頁(yè)。Traceview——圖形界面TimelinePanel左邊的Panel為測(cè)試數(shù)據(jù)中所采集的線程信息。右邊Panel為時(shí)間線,時(shí)間線上是每個(gè)線程測(cè)試時(shí)間段內(nèi)所涉及到的方法調(diào)用信息。移動(dòng)時(shí)間線縱軸,將在上方顯示當(dāng)前時(shí)間點(diǎn)鼠標(biāo)所指線程正在執(zhí)行的方法。第九頁(yè),共62頁(yè)。Traceview——圖形界面Pro列名描述Name線程運(yùn)行過(guò)程中所調(diào)用的方法名InclCpuTime某方法占用的CPU時(shí)間,包含內(nèi)部調(diào)用其他方法的CPU時(shí)間ExclCpuTime某方法占用的CPU時(shí)間,但不包含內(nèi)部調(diào)用其他方法的CPU時(shí)間InclRealTime某方法運(yùn)行的真實(shí)時(shí)間(毫秒),包含內(nèi)部調(diào)用其他方法的真實(shí)時(shí)間ExclRealTime某方法運(yùn)行的真實(shí)時(shí)間(毫秒),不包含內(nèi)部調(diào)用其他方法的真實(shí)時(shí)間Call+RecurCalls/Total某方法被調(diào)用次數(shù)以及遞歸調(diào)用占總調(diào)用次數(shù)的百分比CpuTime/Call某方法調(diào)用CPU時(shí)間與調(diào)用次數(shù)的比,相當(dāng)于該方法平均執(zhí)行時(shí)間RealTime/Call同CpuTime/Call類(lèi)似,但統(tǒng)計(jì)單位為真實(shí)時(shí)間每個(gè)Time列對(duì)應(yīng)有一個(gè)用時(shí)間百分比來(lái)統(tǒng)計(jì)的列,表示以百分比來(lái)統(tǒng)計(jì)各個(gè)時(shí)間。第十頁(yè),共62頁(yè)。Traceview——圖形界面

移動(dòng)TimelinePanel上的時(shí)間線縱軸,界面將顯示當(dāng)前時(shí)間點(diǎn)鼠標(biāo)所指線程正在執(zhí)行的方法調(diào)用情況第十一頁(yè),共62頁(yè)。Traceview——圖形界面

點(diǎn)擊Pro內(nèi)的某個(gè)方法名,將會(huì)展開(kāi)該方法被調(diào)用及調(diào)用情況,同時(shí)也會(huì)在TimelingPanel內(nèi)顯示出該方法在各個(gè)線程中被執(zhí)行的時(shí)間段。第十二頁(yè),共62頁(yè)。Traceview——數(shù)據(jù)分析LetvWeather第十三頁(yè),共62頁(yè)。Traceview——數(shù)據(jù)分析LetvWeather首先對(duì)應(yīng)用程序中自己實(shí)現(xiàn)的方法進(jìn)行排查。將Pro先按InclCpuTime%的降序來(lái)進(jìn)行排序,從Name列表里從上到下尋找到應(yīng)用程序中自己實(shí)現(xiàn)的方法。第十四頁(yè),共62頁(yè)。Traceview——數(shù)據(jù)分析LetvWeather也可以按CpuTime/Call降序排列,排在第一至第四為的都為我們自己實(shí)現(xiàn)的方法,分別為:onClick(),access$400,onKeyConfirm(),onItemConfirmed()。第十五頁(yè),共62頁(yè)。Traceview——數(shù)據(jù)分析LetvWeather第十六頁(yè),共62頁(yè)。Traceview——數(shù)據(jù)分析LetvWeather第十七頁(yè),共62頁(yè)。Traceview——數(shù)據(jù)分析LetvWeather

重點(diǎn)分析ConfigManager里的saveWeatherUpdateAferCityUpdate,setLocation,setProvince,setArea和setCity五個(gè)方法。

通過(guò)點(diǎn)擊這五個(gè)方法,從TimelinePanel里我們可以看到這五個(gè)方法所在的線程都是Main線程。第十八頁(yè),共62頁(yè)。DDMS-HeapAndroidtools中的DDMS帶有一個(gè)內(nèi)存檢測(cè)工具Heap,可以用來(lái)檢測(cè)應(yīng)用進(jìn)程的內(nèi)存使用情況。啟動(dòng)eclipse后,切換到DDMS視圖,打開(kāi)Devices視圖和Heap視圖。設(shè)備連上PC后,在Devices視圖中將顯示設(shè)備的序列號(hào),以及正在運(yùn)行的進(jìn)程信息。選中待檢測(cè)的進(jìn)程,點(diǎn)擊上方的“UpdateHeap”圖標(biāo),此時(shí)對(duì)應(yīng)進(jìn)程名的后方會(huì)出現(xiàn)一個(gè)小標(biāo)志。第十九頁(yè),共62頁(yè)。DDMS-Heap在Heap視圖里點(diǎn)擊”CauseGC”摁鈕。在Type列中點(diǎn)擊不同的類(lèi)型,將在下方的直方圖中顯示該類(lèi)型的數(shù)據(jù)在內(nèi)存中的情況。Type列里有一個(gè)dataobject,即數(shù)據(jù)對(duì)象,就是程序中大量存在的類(lèi)類(lèi)型的對(duì)象,其中的“TotalSize”的值就是當(dāng)前進(jìn)程中所有Java數(shù)據(jù)對(duì)象的內(nèi)存總量。Type列里的1-bytearray(byte[],Boolean[])一般為程序中的bitmap占用的空間,也包含類(lèi)似newbyte[data-_size]語(yǔ)句開(kāi)辟的空間。第二十頁(yè),共62頁(yè)。Heap——數(shù)據(jù)分析LetvWeather第二十一頁(yè),共62頁(yè)。Heap——數(shù)據(jù)分析LetvWeather

取消背景設(shè)置第二十二頁(yè),共62頁(yè)。Heap——數(shù)據(jù)分析LetvWeather背景圖采用了兩種設(shè)置方法:在布局文件中通過(guò)android:background屬性設(shè)置通過(guò)setBackgroundResource方法設(shè)置第二十三頁(yè),共62頁(yè)。Heap——數(shù)據(jù)分析LetvWeather

采用上面的方法設(shè)置背景時(shí),會(huì)緩存圖片的cache,以便重繪時(shí)加快速度。如果內(nèi)存緊張的情況下,在設(shè)置大背景圖片時(shí)盡量避開(kāi)使用上述兩種方法,而用setBackgroundDrawable方法來(lái)代替。并在適當(dāng)?shù)臅r(shí)候調(diào)用recycle方法來(lái)釋放該內(nèi)存。同時(shí)為了減小大背景圖片讀入到內(nèi)存的占有空間,也可以對(duì)圖片做適當(dāng)?shù)牟蓸犹幚怼5诙捻?yè),共62頁(yè)。Heap——數(shù)據(jù)分析LetvWeather

處理后第二十五頁(yè),共62頁(yè)。MemoryAnalyzerTool(MAT)MAT是一個(gè)eclipse的插件,同時(shí)也有單獨(dú)的Windows和Linux版本的客戶(hù)端,通過(guò)解析hprof文件來(lái)分析內(nèi)存使用情況。在DDMS的Heap視圖中,觀察對(duì)應(yīng)程序在運(yùn)行過(guò)程中的數(shù)據(jù)變化點(diǎn)擊Devices視圖里的“DumpHproffile”摁鈕采集數(shù)據(jù),最后確定數(shù)據(jù)保存路徑此時(shí)得到的hprof文件在MAT工具中仍然不能打開(kāi),需要用SDK中自帶的hprof-conv工具進(jìn)行轉(zhuǎn)換。如:$./hprof-convraw.hprofconverted.hprof第二十六頁(yè),共62頁(yè)。MAT——圖形界面Overview視圖中指出了內(nèi)存的使用情況,并通過(guò)餅圖展示內(nèi)存的分配情況,列出占用內(nèi)存最大的幾個(gè)java對(duì)象,以及其他視圖工具的鏈接第二十七頁(yè),共62頁(yè)。MAT——圖形界面Histogram,列出每個(gè)類(lèi)的實(shí)例對(duì)象的數(shù)量。ClassName:類(lèi)名Objects:每一種類(lèi)型的對(duì)象數(shù)量ShallowHeap:一個(gè)對(duì)象本身(不包括該對(duì)象引用的其他對(duì)象)占用的內(nèi)存RetainedHeap:一個(gè)對(duì)象本身,以及由該對(duì)象引用的其他對(duì)象的ShallowHeap的總和第二十八頁(yè),共62頁(yè)。MAT——圖形界面Histogram右菜單中的ListObject(withoutgoingreferences/withincomingreferences),表示列出由該類(lèi)的對(duì)象引用的其他對(duì)象/引用該類(lèi)的對(duì)象的其他對(duì)象。第二十九頁(yè),共62頁(yè)。MAT——圖形界面DominatorTree,列出進(jìn)程中的所有對(duì)象。與Histogram不同的是左側(cè)列是對(duì)象,而不是類(lèi)。第三十頁(yè),共62頁(yè)。MAT——圖形界面DominatorTreeListObject(withoutgoingreferences/withincomingreferences),列出由該對(duì)象引用的其他對(duì)象/引用該對(duì)象的其他對(duì)象PathToGCRoots,由當(dāng)前對(duì)象到GCRoots引用鏈。在子菜單中可以選擇排除不同的非強(qiáng)引用組合來(lái)篩選到GCRoots的引用鏈GCRoots,是指那些不會(huì)被垃圾回收的對(duì)象。圖中對(duì)象名前面有黃色圓點(diǎn)的就是GCRoots,每個(gè)GCRoots對(duì)象名的后面有灰黑色的標(biāo)識(shí),表面這個(gè)對(duì)象之所有是GCRoots的原因第三十一頁(yè),共62頁(yè)。MAT——圖形界面TopConsumers:

以class和package分類(lèi)表示占用內(nèi)存比較多的對(duì)象LeakSuspects:

對(duì)內(nèi)存泄露原因的簡(jiǎn)單分析,列出可能的懷疑對(duì)象第三十二頁(yè),共62頁(yè)。MAT——數(shù)據(jù)分析得到的hprof文件在MAT中打開(kāi)從Overview視圖中的餅圖中看到com.my.mattest.MainActivity@0x41887910對(duì)象占用了非常多的內(nèi)存第三十三頁(yè),共62頁(yè)。MAT——數(shù)據(jù)分析DominatorTree視圖,按照RetainedHeap降序排列ArrayList類(lèi)型的成員變量,在該ArrayList集合中包含了非常多的Object對(duì)象。第三十四頁(yè),共62頁(yè)。MAT——數(shù)據(jù)分析Histogram視圖中按RetainedHeap降序排列java.lang.Object[]類(lèi)的對(duì)象占用的內(nèi)存最大。第三十五頁(yè),共62頁(yè)。MAT——數(shù)據(jù)分析選擇ListObject->withincomingreferences子菜單,按RetainedHeap降序排列java.lang.Object[2261947]@0x43557858對(duì)象占用內(nèi)存最大。點(diǎn)開(kāi)后發(fā)現(xiàn)它是由com.my.mattest.MainActivity@0x41887910中的一個(gè)ArrayList引用著。第三十六頁(yè),共62頁(yè)。HierarchyViewerHierarchyViewer是AndroidSDK中自帶的一個(gè)查看界面布局的工具,通過(guò)此工具可以詳細(xì)的理解當(dāng)前界面的控件布局以及某個(gè)控件的屬性。在Eclipse里可以將視圖切換到HierarchyViewer視圖,也可以在命令行里輸入命令打開(kāi)Hierarchyviewer的圖形界面,在sdk/tools目錄下輸入:./hierarchyviewer第三十七頁(yè),共62頁(yè)。HierarchyViewer——圖形界面圖為在命令行里打開(kāi)HierarchyViewer的視圖

“Refresh”為刷新摁鈕“LoadViewHierarchy”為進(jìn)入ViewHierarchywindow,控件層次查看界面“InspectScreenshot”為進(jìn)入PixelPerfectwindow,界面精確查看模式。左下角的三個(gè)圖標(biāo)摁鈕,為三個(gè)視圖的切換第三十八頁(yè),共62頁(yè)。HierarchyViewer——圖形界面在ViewHierarchy視圖里分成了上圖的1,2,3,4四個(gè)部分1區(qū)域顯示界面控件的層次結(jié)構(gòu),為主窗口2區(qū)域是以縮略圖的方式顯示整個(gè)應(yīng)用中各個(gè)控件的層次關(guān)系,當(dāng)一個(gè)界面中的控件比較多的時(shí)候,可以通過(guò)鼠標(biāo)在這個(gè)顯示區(qū)域進(jìn)行移動(dòng),則左邊的1主窗口中會(huì)具體顯示相關(guān)控件信息3區(qū)域,顯示每個(gè)控件的具體信息,是控件的屬性面板4區(qū)域顯示界面的控件的具體位置第三十九頁(yè),共62頁(yè)。HierarchyViewer——圖形界面

在主窗口中點(diǎn)擊某個(gè)節(jié)點(diǎn)后,會(huì)在該節(jié)點(diǎn)上方彈出一個(gè)窗口,顯示該控件的實(shí)際效果圖,子空間的數(shù)目,選擇上方的“Pro”,會(huì)看到測(cè)量(Measure)、布局(Layout)、畫(huà)視圖(Draw)的耗時(shí),三個(gè)圓圈指示燈。

綠色表示該控件在該階段比起其他的50%的控件的速度要快,黃色表示比起其他的50%的控件的速度要慢,紅色表示該控件在該階段的處理速度是最慢的。第四十頁(yè),共62頁(yè)。HierarchyViewer——圖形界面在界面精確查看模式里可以看到精確的看到每個(gè)控件在整個(gè)界面的位置,精確到像素第四十一頁(yè),共62頁(yè)。HierarchyViewer——布局優(yōu)化<include>標(biāo)簽Include標(biāo)簽常用于將布局中的公告部分提取出來(lái)供其他layout共用,實(shí)現(xiàn)布局模塊化。下面在一個(gè)布局main.xml中用include引入另一個(gè)布局footer.xml,下面為main.xml代碼第四十二頁(yè),共62頁(yè)。HierarchyViewer——布局優(yōu)化<include>標(biāo)簽footer.xml的代碼第四十三頁(yè),共62頁(yè)。HierarchyViewer——布局優(yōu)化<viewstub>標(biāo)簽Viewstub是一個(gè)輕量級(jí)的view,它是一個(gè)看不見(jiàn)、不占布局位置,占用資源非常小的控件。

可以為viewstub指定一個(gè)布局,在inflate布局的時(shí)候,只有viewstub會(huì)被初始化,然后當(dāng)viewstub被設(shè)置為可見(jiàn)的時(shí)候或是調(diào)用ViewStub.inflate()的時(shí)候,viewstub所指向的布局才會(huì)被inflate和實(shí)例化。一個(gè)布局main.xml中加入網(wǎng)絡(luò)錯(cuò)誤時(shí)的提示頁(yè)面network_error.xml為例。Main.xml代碼如下:第四十四頁(yè),共62頁(yè)。HierarchyViewer——布局優(yōu)化<viewstub>標(biāo)簽network_error.xml為只有在網(wǎng)絡(luò)錯(cuò)誤時(shí)才顯示的布局,默認(rèn)不會(huì)被解析第四十五頁(yè),共62頁(yè)。HierarchyViewer——布局優(yōu)化<viewstub>標(biāo)簽網(wǎng)絡(luò)錯(cuò)誤時(shí),代碼上的處理第四十六頁(yè),共62頁(yè)。HierarchyViewer——布局優(yōu)化<merge>標(biāo)簽

在使用了include后可能導(dǎo)致布局嵌套過(guò)多,多余不必要的layout節(jié)點(diǎn),從而導(dǎo)致解析變慢,可以通過(guò)hierarchyviewer顯示布局邊界查看。Merge標(biāo)簽可用于一下兩種典型情況:布局根節(jié)點(diǎn)是FrameLayout且不需要設(shè)置background或padding等屬性,可以用merge代替某布局作為子布局被其他布局include時(shí),使用merge當(dāng)做該布局的頂節(jié)點(diǎn),這樣在被引入時(shí)頂節(jié)點(diǎn)會(huì)自動(dòng)被忽略,而將其子節(jié)點(diǎn)全部合并到主布局中第四十七頁(yè),共62頁(yè)。HierarchyViewer——布局優(yōu)化<merge>標(biāo)簽merge代替FrameLayout

原始布局的節(jié)點(diǎn)層次圖第四十八頁(yè),共62頁(yè)。HierarchyViewer——布局優(yōu)化<merge>標(biāo)簽merge代替FrameLayout

merge代替FrameLayout后布局的節(jié)點(diǎn)層次圖第四十九頁(yè),共62頁(yè)。HierarchyViewer——布局優(yōu)化<merge>標(biāo)簽使用include時(shí),merge當(dāng)做子布局的頂節(jié)點(diǎn)(<include>標(biāo)簽中的示例)原始布局的節(jié)點(diǎn)層次圖第五十頁(yè),共62頁(yè)。HierarchyViewer——布局優(yōu)化<merge>標(biāo)簽使用include時(shí),merge當(dāng)做子布局的頂節(jié)點(diǎn)merge當(dāng)做子布局的頂節(jié)后的節(jié)點(diǎn)層次圖第五十一頁(yè),共62頁(yè)。HierarchyViewer——布局優(yōu)化<merge>標(biāo)簽使用include時(shí),merge當(dāng)做子布局的頂節(jié)點(diǎn)代碼修改第五十二頁(yè),共62頁(yè)。LintAndroidLint是SDKTools16(ADT16)之后引入的工具,通過(guò)他對(duì)Android工程源代碼進(jìn)行掃描和檢查,可以發(fā)現(xiàn)潛在的問(wèn)題,以便及早修正。AndroidLint主要用于檢查一下這些錯(cuò)誤:Missingtranslations(andunusedtranslations)沒(méi)有翻譯的文本Layoutperformanceproblems(alltheissuestheoldlayoutopttoolusedtofind,andmore)Unusedresources未使用的冗余資源Inconsistentarraysizes(whenarraysaredefinedinmultipleconfigurations)在多個(gè)配置中的數(shù)組大小不一致文件Accessibilityandinternationalizationproblems(hardcodedstrings,missingcontentDescription,etc.)Iconproblems(likemissingdensities,duplicateicons,wrongsize,etc.)Usabilityproblems(likenotspecifyinganinputtypeonatextfield)Manifesterrors.……第五十三頁(yè),共62頁(yè)。Lint在Eclipse中可以在菜單

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論