作Android開發五年,開發工具從最初的eclipse+ADT
插件到AndroidStduio
。Google更是在新版的AndroidStudio
中集成了Android
應用性能分析利器——Profiler
。linux
本文基於AndroidStudio 3.2.1
正式版進行分析並定位問題緣由。附上下載地址:android
在AndroidStudio
中run
項目,便可在底部選項卡中找到Profiler
,打開後會默認顯示當前run
的應用的信息。能夠點擊Profiler
頁面右上加號選擇鏈接的設備以及其餘能夠調試的應用進程。git
圖中能夠看出,Profiler
能夠監控選擇的應用的 CPU、內存、網絡、電量使用狀況並經過波形圖、柱形圖、折線圖實時的展現出來。github
點擊左上角的紅色方形或者在監控的會話中右鍵彈出選項框結束當前應用的監控或刪除監控會話。算法
頂部工具欄依次是:windows
在概覽圖中,點擊CPU模塊,進入CPU使用分析頁面。android-studio
圖中三個菜單依次是:緩存
Sampled Java
、Instrumented Java
、Sampled Java
、System Trace
。點擊Record
按鈕開始採集CPU使用數據,點擊Stop
按鈕中止採集數據。採集完成以後的樣子如圖,網絡
圖中深色部分表示採集區間,能夠放大監控視圖,而後縮小記錄區間,選擇一個線程,能夠詳細看見線程中執行的方法。app
Profiler
支持四種方式顯示執行的方法。
經過分析CPU使用的視圖,能夠大體定位下面的問題。
Profiler
會同步記錄用戶的觸摸事件及頁面跳轉等事件。對比CPU的瞬時使用狀況找出問題代碼。上圖展現了ImageLoader
加載圖片所使用的CPU資源。可以得出的結論是,ImageLoader
相關的代碼被反覆執行,自己就是一件異常的狀況。
宏觀分析觀察CPU使用狀況的波形圖,發現存在週期性的CPU使用峯值。
再附上優化後的CPU使用狀況波形圖,已消除CPU使用峯值。
出現峯值的緣由,單憑監控線程的方法調用不容易定位問題,除非在特別熟悉代碼的狀況下。一般還須要結合內存使用和網絡使用狀況綜合分析,進而定位問題。
切換至內存分析頁面。
圖中三個菜單依次是:
內存使用,一樣能夠從宏觀和微觀的角度分析。Profiler
將不一樣類型的數據佔用的內存用不一樣顏色表示。有:Java
、Native
、Graphics
、Stack
、Code
、Others
。
如圖,內存持續增加,直至系統釋放內存資源,所以宏觀內存波形圖呈鋸齒狀。並且能夠看出主要是Native空間佔用的內存持續增長。
從微觀上看,放大顯示區間,點擊dump按鍵開始記錄,選擇分析區間,查看內存中,各種型數據所佔用的空間。
Live Allocation
和 Heap Dump
。image heap
、zygote heap
、app heap
、JNI heap
。Arrange by class
、Arrange by package
、Arrange by callstack
。圖中是優化後的內存監控圖,內存佔用已經趨於平穩。
網絡分析工具比較簡單,圖中折線圖一個峯值表示一次網絡鏈接。
經過選中一次網絡鏈接能夠查看到鏈接請求地址以及發送和接收的數據。
最後附上優化後的網絡監控。
耗電監控,一般檢測不到任何問題,通常只是用來衡量應用的耗電狀況。遇到耗電異常的應用,在CPU、內存、網絡監控中都能發現問題。如:網絡鏈接過程發送和接收數據須要使用網卡模塊、推送功能須要保持的長鏈接、GC內存、定位功能都須要電量支持。附上圖中優化先後的對比,注意看Light基線中電量使用的柱形圖。應用耗電問題獲得明顯改善。
上面只是大概介紹了內存分析工具四個模塊的簡單使用。可能讀者對優化先後的對比處於懵懂的狀態。下面解讀下,筆者待測試應用中存在的問題。
應用詳情:
正常狀況下,ImageLoader支持三級緩存,根據LRU算法,輪播圖片應該會保存在內存中,而且複用。不會出髮網絡鏈接以及內存的持續增加。
問題詳情:
綜上,被測試應用總會發起網絡請求以及內存資源佔用持續增加致使出發系統GC。間接的致使了應用耗電。有興趣的童鞋能夠驗證下,耗電峯值、網絡鏈接、內存GC和CPU使用峯值之間的關聯。他們四者之間的關係很微妙喲。
考慮到篇幅,暫時介紹至這裏。後續可能會針對四個模塊精講。敬請期待。
以爲有用?那打賞一個唄。我要打賞
此處是廣告:Flueky的技術小站