android性能分析

android性能分析

對于一個app的性能口蝠,我們可以通過以下幾個點去分析:

  • 內(nèi)存
  • CPU
  • GPU
  • 網(wǎng)絡(luò)

而這些性能直接影響到手機(jī)耗電量,發(fā)熱量掂器,界面的流程度亚皂,以及流量的消耗俱箱,所以通過對這些點的分析国瓮,可以很好的改善app的整體性能。

對于這四個維度的分析狞谱,android studio提供如下四種監(jiān)測工具:

  • Memory Monitor
  • CPU Monitor
  • GPU Monitor
  • Network Monitor

通過以上工具乃摹,app的運行情況都會直觀,實時的顯示在圖表中跟衅。根據(jù)圖表孵睬,可以初步判斷是否存在內(nèi)存抖動,cup負(fù)荷過大等問題伶跷,但如果需要進(jìn)一步分析掰读,就需其詳細(xì)的數(shù)據(jù),尤其是memory和cpu中叭莫,由于代碼實現(xiàn)的不合理導(dǎo)致性能低下且不易被發(fā)現(xiàn)的問題蹈集。

屏幕快照 2017-06-28 下午2.30.00.png

接下來將進(jìn)一步介紹工具等使用,獲取性能相關(guān)的數(shù)據(jù)雇初,以及對這些數(shù)據(jù)的分析拢肆。

*在android studio3.0版本中,Monitor系列工具全新升級為Profiler靖诗,功能更加強(qiáng)大郭怪。

Memory Monitor

內(nèi)存的使用分析,即對其堆的使用刊橘,可以通過Memory Monitor直接獲取.hprof(堆轉(zhuǎn)儲)和.trac文件鄙才。利用這些數(shù)據(jù)確定是否存在內(nèi)存泄漏的問題以及對應(yīng)方法的內(nèi)存占用情況。

*堆轉(zhuǎn)儲

hprof(堆轉(zhuǎn)儲)是應(yīng)用堆中所有對象的快照促绵。

在Memory Monitor中攒庵,有一套完整,高效的內(nèi)存分析工具绞愚,使用也非常簡單叙甸。

  1. 在 Memory 監(jiān)視器的頂部,點擊

    Dump Java Heap.

    Android Studio 會創(chuàng)建一個文件名為 application-id_yyyy.mm.dd_hh.mm.hprof 的堆快照文件位衩,在 Android Studio 中打開文件裆蒸,然后將文件添加到 Captures 標(biāo)簽的 Heap Snapshot 列表中。

  2. 在 Captures 標(biāo)簽中糖驴,右鍵點擊文件僚祷,然后選擇 Export to standard .hprof佛致。

    在視圖中,你可以查看堆中的使用情況辙谜,也可以方便的查看引用tree俺榆。

  3. 使用Analyzer Task工具,點擊運行按鈕獲取堆中存在泄露的Activity装哆,也可以監(jiān)測重復(fù)的String類.型

屏幕快照 2017-06-28 下午3.38.09.png

以未來域為例罐脊,如圖所示,可以迅速的檢測出存在一個內(nèi)存泄漏的對象蜕琴,在MyHouseActivity類中的RetrofitClient對象萍桌,進(jìn)行了網(wǎng)絡(luò)請求,問題在于未在Activity退出的時候進(jìn)行銷毀凌简。

跟蹤內(nèi)存分配

Allocation Tracker(跟蹤內(nèi)存分配)可以讓您更好地了解分配占用內(nèi)存的對象的位置上炎,跟蹤內(nèi)存分配位于哪些線程上,以及內(nèi)存分配來自何處雏搂。

  1. 在內(nèi)存監(jiān)視器工具欄中藕施,點擊“Allocation Tracker” 開始內(nèi)存分配。

  2. 與您的應(yīng)用交互凸郑。

  3. 再次點擊“Allocation Tracker” 停止分配跟蹤裳食。

    Android Studio 會創(chuàng)建一個文件名為 application-id_yyyy.mm.dd_hh.mm.alloc 的分配文件,在 Android Studio 中打開該文件线椰,然后將文件添加到 Captures 標(biāo)簽內(nèi)的 Allocations 列表中胞谈。

  4. 在分配文件中,確定您的應(yīng)用中哪些操作可能會引起過多分配憨愉,并確定應(yīng)在應(yīng)用中什么位置嘗試減少分配和釋放資源烦绳。

屏幕快照 2017-06-28 下午4.21.42.png

該圖顯示了未來域的“首頁”模塊中的內(nèi)存發(fā)布,上半部分是線程中方法所占的內(nèi)存比配紫,下部分用圖表來展示對象的內(nèi)存占比径密,圓形弧度越大內(nèi)存占用越大,可以看出躺孝,BGABanner占用了較大比重的內(nèi)存享扔,其原因在于banner中涉及到了大圖以及切換動畫等。

CPU Monitor

android studio提供了一套cup使用追蹤工具CPU Monitor植袍,通過該工具可以實時顯示cup使用使用率惧眠。

am-cpumon2.png

圖中可以看到,cup的使用分為兩種類型

  • User:代碼需要系統(tǒng)接口才能服務(wù)硬件和內(nèi)存于个,出現(xiàn)崩潰是可恢復(fù)的氛魁,
  • Kernel:可直接訪問硬件和物理內(nèi)存,出現(xiàn)崩潰往往會導(dǎo)致設(shè)備停止運行。

一般情況下我們需要關(guān)注的是User類型秀存,以及進(jìn)行相應(yīng)的代碼調(diào)優(yōu)捶码。

在CPU Monitor中,我們可以獲取.trace(Method Tracer)文件來進(jìn)行性能分析或链。

  1. 在CPU Monitor中惫恼,點擊

    Start Method Tracing。

  2. 在交互完成后澳盐,再次點擊

    以停止跟蹤祈纯。

此時會生成package_yyyy.mm.dd_hh.mm.ss.trace的文件,Android Studio會默認(rèn)打開該文件洞就,展示入下圖:

屏幕快照 2017-06-28 下午5.06.58.png

圖中給出了方法對應(yīng)的CPU使用時間盆繁。但該工具無法查看方法等調(diào)用棧掀淘,即方法的parent和其child方法旬蟋,同時給的列類型太少,比如realtiem革娄,cputime以及遞歸調(diào)用次數(shù)等等倾贰。因此,我們需要其他的分析工具拦惋,比如SystraceTraceview

Systrace

Systrace用于UI性能的分析匆浙,通過在瀏覽器中打開trace.html文件可以看到每一幀所執(zhí)行的方法以及需要的時間,是否達(dá)到60的幀率厕妖。

有三種方式可以獲取trace.html:

  • 使用SDK中的python腳步

    android4.3+

    $ cd android-sdk/platform-tools/systrace
    $ python systrace.py --time=10 -o mynewtrace.html sched gfx view wm
    

    android4.2-

    $ cd android-sdk/platform-tools/systrace
    $ python systrace.py --set-tags=gfx,view,wm
    $ adb shell stop
    $ adb shell start
    
  • 添加代碼塊(android4.3+ only)

    Trace.beginSection() 開始首尼,以 Trace.endSection() 結(jié)束。

  • 使用DDMS工具

最終獲取到的以trace.html為結(jié)尾的文件言秸,可直接通過瀏覽器打開

屏幕快照 2017-06-27 下午4.01.50.png

以上是未來域的首頁列表滑動過程的System trace软能。

從圖中,我們可以看到在中間紅框中有多個'F'举畸,在表格里每一個'F'都表示一幀查排,綠色的表示在16ms內(nèi)完成了所有的存在的處理。黃色表示該未在16ms內(nèi)完成處理抄沮,但沒消耗太多時間跋核,可能影響接下來的一幀數(shù)據(jù)。紅色表示性能很差叛买,消耗了過多時間砂代,可能會丟棄接下來的多幀數(shù)據(jù)。

我們可以看到在中間一部分出現(xiàn)了多個黃色和幾個紅色幀率挣,
對于這些出錯幀刻伊,我們可以點擊對應(yīng)的'F',然后按'M'按鈕可以高亮顯示該幀區(qū)域,查看窗口關(guān)于出現(xiàn)該現(xiàn)象的原因以及解決建議娃圆。你也可以直接點擊右邊紅框Alerts來查看錯誤的類型玫锋。可以看到存在33個Scheduling delay讼呢。關(guān)于該提示撩鹿,大致是存在需要被處理的特定片段的線程,未及時的被cpu處理悦屏,而導(dǎo)致線程需要更長時間去處理节沦。

我們可以直觀的確定當(dāng)前操作是否存在掉幀的情況,但在trace.html中我們無法定位到特定方法础爬,也看不到具體的執(zhí)行時間甫贯,如果需要進(jìn)一步確認(rèn)出現(xiàn)問題的方法,就需要使用TraceView看蚜。

TraceView

TraceView是一個強(qiáng)大的性能分析工具叫搁,使用該工具加載trace文件,以圖形的形式展示代碼的執(zhí)行時間供炎、次數(shù)及調(diào)用棧渴逻,便于我們分析。

使用TraceView前音诫,我們需要獲取.trace文件惨奕,可以通過以下三種方法獲取:

  • 使用代碼塊

    在對應(yīng)的代碼區(qū)間內(nèi)輸入如下代碼塊:

     // start tracing to "/sdcard/calc.trace"
    Debug.startMethodTracing("calc");
    // ...
    // stop tracing
    Debug.stopMethodTracing();
    
  • 使用CPU Monitor

    CPU Monitor段落中的1竭钝,2兩步操作梨撞。

  • 使用DDMS工具

獲取到trace文件后,可以在Android Device Monitor中打開香罐,會展示出如下圖表

屏幕快照 2017-06-28 下午11.22.07.png

圖中可按順序分為線程面板1卧波,時間面板2,數(shù)據(jù)分析面板3穴吹。

線程面板展示了在記錄時間區(qū)間內(nèi)活動的線程幽勒,我們可以看到常見的main線程,對應(yīng)的時間面板中港令,有很多色塊組成啥容,這些色塊表示采集過程中方法調(diào)用時間線,每一個色塊代表一個方法顷霹。當(dāng)點擊色塊的時候咪惠,會在數(shù)據(jù)分析面板中顯示對應(yīng)的方法,以及其調(diào)用棧和相關(guān)性能數(shù)據(jù)淋淀。該面板中的列字段大致意義如下:

列名 描述
Name 該線程運行過程中所調(diào)用的函數(shù)名
Incl Cpu Time 某函數(shù)占用的CPU時間包含內(nèi)部調(diào)用其它函數(shù)的CPU時間
Excl Cpu Time 某函數(shù)占用的CPU時間但不含內(nèi)部調(diào)用其它函數(shù)所占用的CPU時間
Incl Real Time 某函數(shù)運行的真實時間以毫秒為單位內(nèi)含調(diào)用其它函數(shù)所占用的真實時間
Excl Real Time 某函數(shù)運行的真實時間以毫秒為單位不含調(diào)用其它函數(shù)所占用的真實時間
Call+Recur Calls/Total 某函數(shù)被調(diào)用次數(shù)以及遞歸調(diào)用次數(shù)/總調(diào)用次數(shù)
Real Time/Call 同CPU Time/Call類似只不過統(tǒng)計單位換成了真實時間

要定位到問題遥昧,就需要結(jié)合這些數(shù)據(jù)來獲取不同類型的潛在可優(yōu)化的熱點,然后進(jìn)行優(yōu)化,具體可參考TraceView工具的使用中的處理技巧炭臭。

GPU Monitor

GPU Monitor顯示視圖的渲染情況永脓,與直接在手機(jī)開發(fā)者模式中開啟GPU分析視圖一樣。

am-gpumon2.png

每一幀最好的狀態(tài)是保持在綠線以內(nèi)鞋仍。

Network Monitor

在Studio中常摧,通過該工具可以直觀的檢測網(wǎng)絡(luò)的使用情況,及其上傳和下載的流量威创。在Android Studio3.0中的升級版Monitor本中落午,提供了抓包功能!android可以不再需要設(shè)置代理肚豺,使用第三方抓包工具了溃斋!強(qiáng)大!

networkprofiler_2x.png

選擇2區(qū)域進(jìn)行你需要抓包的區(qū)域吸申, 會在3窗口會顯示接受或發(fā)送的文件信息梗劫,包括文件名,大小呛谜,類型在跳,狀態(tài)和時間等信息。點擊3中的鏈接名隐岛,會在4窗口展示更詳細(xì)的信息,可以查看response瓷翻,消息頭等數(shù)據(jù)聚凹。

獲取當(dāng)前top的Activity

linux:

adb shell dumpsys activity | grep "mFocusedActivity"

windows:

adb shell dumpsys activity | findstr "mFocusedActivity"

相關(guān)文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市长踊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌栖茉,老刑警劉巖纹笼,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異孝常,居然都是意外死亡旗们,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門构灸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來上渴,“玉大人,你說我怎么就攤上這事〕淼” “怎么了曹阔?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長隔披。 經(jīng)常有香客問我次兆,道長,這世上最難降的妖魔是什么锹锰? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任芥炭,我火速辦了婚禮,結(jié)果婚禮上恃慧,老公的妹妹穿的比我還像新娘园蝠。我一直安慰自己,他們只是感情好痢士,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布彪薛。 她就那樣靜靜地躺著,像睡著了一般怠蹂。 火紅的嫁衣襯著肌膚如雪善延。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天城侧,我揣著相機(jī)與錄音易遣,去河邊找鬼。 笑死嫌佑,一個胖子當(dāng)著我的面吹牛豆茫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屋摇,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼揩魂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了炮温?” 一聲冷哼從身側(cè)響起火脉,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柒啤,沒想到半個月后倦挂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡白修,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年妒峦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兵睛。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡肯骇,死狀恐怖窥浪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笛丙,我是刑警寧澤漾脂,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站胚鸯,受9級特大地震影響骨稿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姜钳,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一坦冠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哥桥,春花似錦辙浑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至送滞,卻和暖如春侠草,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犁嗅。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工边涕, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愧哟。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓奥吩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蕊梧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容