一:?HierarchyView?
新密網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
老牌分析工具,在早期的SDK中是有快捷方式的,新版的找不到快捷方式了,后來找了很久才找到入口
首先找到Android Device Monitor
可以進(jìn)入到sdk的安裝目錄下 從tools目錄下點(diǎn)擊monitor.bat 啟動(dòng) Android Device Monitor
然后找到下圖紅框位置 點(diǎn)擊?HierarchyView 按鈕就可以打開 如果沒有HierarchyView 按鈕就點(diǎn)擊DDMS按鈕左邊的更多按鈕,里面會(huì)列出來HierarchyView 按鈕
HierarchyView 最大的好處是以這種結(jié)構(gòu)樹圖的方式展示ViewTree 能夠一目了然的看清結(jié)構(gòu),并且可以評(píng)估繪制時(shí)間
但是在新的android版本里面?HierarchyView會(huì)提示找不到Service 遇到這種情況 參照如下文章解決
二:UI Automator
比較常見的工具,在很長(zhǎng)一段時(shí)間內(nèi),找不到HierarchyView用的就是他,但是這個(gè)工具不是很好用,有時(shí)候顯示的層級(jí)也不準(zhǔn),可能是我不太會(huì)用
入口如下圖
點(diǎn)擊紅框處進(jìn)入
三:Layout Inspector
入口
打開之后是這個(gè)樣子
三種工具各有各的特點(diǎn),大家可以根據(jù)自己的需求進(jìn)行選擇
1.TraceView
官方說明文檔:
android CPU profiler
CPU profiler可以實(shí)時(shí)檢查應(yīng)用的CPU使用率和線程activity,并記錄函數(shù)跟蹤,以便于您可以優(yōu)化和調(diào)試您的應(yīng)用程序.
Flame Chart如果出現(xiàn)問題 顏色也會(huì)加深
2.systrace
簡(jiǎn)介:
systrace是Android4.1版本之后推出的,對(duì)系統(tǒng)Performance分析的工具。systrace的功能包括跟蹤系統(tǒng)I/O操作,內(nèi)核工作隊(duì)列,CPU負(fù)載以及Android各個(gè)子系統(tǒng)的運(yùn)行狀況等。
主要由三部分構(gòu)成:
1.內(nèi)核部分
systrace采用了linux Kernel的ftrace功能,所以如果要使用systrace的話,必須開啟Kernel和ftrace相關(guān)的模塊.
2.數(shù)據(jù)采集部分
Android中定義了一個(gè)trace類,應(yīng)用程序可以使用該類把統(tǒng)計(jì)信息輸出給trace,同時(shí),android有一個(gè)atrace程序,它可以從ftrace中讀取統(tǒng)計(jì)信息然后交給數(shù)據(jù)分析工具來處理.
3.數(shù)據(jù)分析工具
Android提供一個(gè)systrace.py用來配置數(shù)據(jù)采集的方法(如采集數(shù)據(jù)的標(biāo)簽,輸出文件名等)和收集ftrace統(tǒng)計(jì)數(shù)據(jù)并生成一個(gè)結(jié)果網(wǎng)頁文件供用戶查看。
簡(jiǎn)單的說,當(dāng)機(jī)器以60幀/秒顯示,用戶會(huì)感知機(jī)器流暢。如果出現(xiàn)顯示時(shí)丟幀的情況,就需要知道系統(tǒng)在做什么?Systrace是用來收集系統(tǒng)和應(yīng)用的數(shù)據(jù)信息和一些中間生成數(shù)據(jù)的細(xì)節(jié),在Android4.1和4.2系統(tǒng)之后出現(xiàn)。Systrace在分析一些顯示問題上特別有用,如應(yīng)用畫圖慢,顯示動(dòng)作或者動(dòng)畫時(shí)變形。
抓取systrace
進(jìn)入本地Android/Sdk/platform-tools/systrace目錄下,執(zhí)行python systrace.py view --time = 10
python腳本的option
如果仍需使用以前的DDMS,可以雙擊文件夾下的? Android-SDK--tools--monitor.bat 即可 。
既然AS 不提供 DDMS面板了那肯定有替代的工具啊,經(jīng)過查找總結(jié)如下:
DDMS 和 Systrace、Hierarchy Viewer都不用了。使用Android Profiler替代DDMS 和 Systrace ,Layout Inspector 替代Hierarchy Viewer
下面進(jìn)入正題,簡(jiǎn)單說下? Layout Inspector 工具簡(jiǎn)單使用,
1、首先要打開 layout inspector 工具呀 直接上截圖吧
2、選擇要分析的應(yīng)用id,選中后點(diǎn)擊 “OK” 如圖?
3、通過下拉按鈕選擇要分析的界面后點(diǎn)擊“OK”(如:loginActivity、MainActivity等)
4、這樣就可以查看界面的 布局情況了最后的截圖就不貼了吧,太丑
如圖1所示, 步驟
** 1, 2, 3** 為打開Android Monitor并切換標(biāo)簽到monitor的過程
4, 5, 6 對(duì)應(yīng)的圖標(biāo)和文字含義分別是
MAT 工具識(shí)別,并解析hprof文件,
有兩種方式可以獲得hprof文件
MAT并不能直接打開這兩個(gè)hprof, 必須通過hprof-conv來轉(zhuǎn)換一次
如圖3所示,選中(過濾出MainActivity), 然后通過Objects可以看出它有8個(gè)實(shí)例
接著選中 com.example.wowo.MainActivity 然后右鍵選擇
Merge shortest paths to GC Roots - exclude week references
因?yàn)槿跻檬菚?huì)被回收的,所以排除掉更加容易發(fā)現(xiàn)OOM.
什么是OOM out-of-memory?
Android下的APP運(yùn)行在VM中(Dalvik or ART), 一個(gè)APP需要的內(nèi)存是有限,這個(gè)值在不同的平臺(tái), 不同的手機(jī)上是不同的,當(dāng)APP需要的內(nèi)存超過了內(nèi)存上限,就會(huì)引起OOM.
下面給出一個(gè)最基本的Android APP顯示HelloWorld的例子.
這時(shí)如果不停的旋轉(zhuǎn)屏幕, 這時(shí)通過觀察Android Monitor里的Free和allocated的memory會(huì)發(fā)現(xiàn) allocated 的memory會(huì)不斷增加,而Free的memory會(huì)不斷減小
這時(shí)通過圖1中步聚5 dump java heap, 然后filter到MainActivity, 會(huì)發(fā)現(xiàn)MainActivity有多個(gè)實(shí)例
接著再通過MAT來分析, 圖4所示
發(fā)現(xiàn)有很多FinalizerReference, 應(yīng)該是與GC有關(guān),由于旋轉(zhuǎn)屏幕會(huì)導(dǎo)致MainActivity銷毀并重新創(chuàng)建實(shí)例,而JVM在創(chuàng)建MainActivity實(shí)例時(shí)還有free的memory, 所以并沒有觸發(fā)GC,即原來的MainActivity的實(shí)例并沒有被回收,所以多次旋轉(zhuǎn)后,在free memory還有的情況下就會(huì)保存多個(gè)MainActivity的實(shí)例造成內(nèi)存泄露的假象。當(dāng)free memory 不夠時(shí),這時(shí)會(huì)觸發(fā)GC, 會(huì)回收之前銷毀的MainActivity的實(shí)例。
所以在查看OOM問題時(shí),當(dāng)allocated內(nèi)存不斷增大時(shí),應(yīng)該人為先觸發(fā)GC(點(diǎn)擊圖1的4)。
如果allocated的內(nèi)存沒有下降,說明當(dāng)前并沒有可回收的實(shí)例占據(jù)內(nèi)存了。
而在該例中,如果點(diǎn)擊了initiate GC后,allocated的內(nèi)存立即減少了。
Android Monitor看到MainActivity也就只有一個(gè)實(shí)例了。