前言
做Android開發五年,開發工具從最初的eclipse+ADT
外掛到AndroidStduio
。Google更是在新版的AndroidStudio
中整合了Android
應用效能分析利器——Profiler
。
本文基於AndroidStudio 3.2.1
正式版進行分析並定位問題原因。附上下載地址:
概覽
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/a5639c13313f3dcef9f07c3c58d3fd60b2326b32993277274da4b83cec937973.png)
在AndroidStudio
中run
專案,即可在底部選項卡中找到Profiler
,開啟後會預設顯示當前run
的應用的資訊。可以點選Profiler
頁面右上加號選擇連線的裝置以及其他可以除錯的應用程式。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/c338fbba7588681f07479d11a1077c00fc50d9a624d67e688f296addf6f601f4.png)
圖中可以看出,Profiler
可以監控選擇的應用的 CPU、記憶體、網路、電量使用情況並通過波形圖、柱形圖、折線圖實時的展示出來。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/0a1b096e25ff39050a7a52add7d76721e77964f8f884a57cbe997589cd6889e5.png)
點選左上角的紅色方形或者在監控的會話中右鍵彈出選項框結束當前應用的監控或刪除監控會話。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/75ce1b112dc8290a3586b3848f2fb3b747c1d3192ddaec1d6da7d6167e6cbaa0.png)
頂部工具欄依次是:
- 新增需要監控的程式。
- 結束當前監控會話。
- 顯示/隱藏側邊欄。
- 縮小監控檢視。
- 放大監控檢視。
- 重置監控檢視。
- 顯示採集區間。
CPU分析
在概覽圖中,點選CPU模組,進入CPU使用分析頁面。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/9504d1cfbe3a57687f51173914233a6fdfe35f470118741d22eadb8378d90a7b.png)
圖中三個選單依次是:
- 可切換至記憶體、網路、電量監控。
- 切換不同監控目標。分別是
Sampled Java
、Instrumented Java
、Sampled Java
、System Trace
。 - Record 按鍵,點選開始採集CPU使用資訊。
點選Record
按鈕開始採集CPU使用資料,點選Stop
按鈕停止採集資料。採集完成之後的樣子如圖,
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/948f550ce313918916240c264eff1db482c547f04b9b0e39d79b7391e89cb4c5.png)
圖中深色部分表示採集區間,可以放大監控檢視,然後縮小記錄區間,選擇一個執行緒,可以詳細看見執行緒中執行的方法。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/0c9546b43655078269b475dddbd4defdb1e1491671892227119ad5159e071871.png)
Profiler
支援四種方式顯示執行的方法。
- Call Chart:通過執行的順序顯示,見上圖。
- Flame Chart:通過火焰圖顯示。
- Top Down:自頂向下呼叫顯示。
- Bottom Up:自底向上呼叫顯示。
通過分析CPU使用的檢視,可以大致定位下面的問題。
- 採集五六分鐘的CPU使用資訊,縮放檢視至最小,全域性觀察CPU在監控過程中的使用情況。
Profiler
會同步記錄使用者的觸控事件及頁面跳轉等事件。對比CPU的瞬時使用情況找出問題程式碼。- 選擇記錄一段時間片,重點分析這段時間片中各執行緒中的方法執行情況。
上圖展示了ImageLoader
載入圖片所使用的CPU資源。能夠得出的結論是,ImageLoader
相關的程式碼被反覆執行,本身就是一件異常的情況。
巨集觀分析觀察CPU使用情況的波形圖,發現存在週期性的CPU使用峰值。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/34b7effaa8591ed09790b988824c9cec3ecdc6d57429c001cd5680a45edc2138.png)
再附上優化後的CPU使用情況波形圖,已消除CPU使用峰值。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/8230d3fd18ca97351e01952ec920f050f67d671f546b9ad4907b6cc1c87ac632.png)
出現峰值的原因,單憑監控執行緒的方法呼叫不容易定位問題,除非在特別熟悉程式碼的情況下。通常還需要結合記憶體使用和網路使用情況綜合分析,進而定位問題。
記憶體分析
切換至記憶體分析頁面。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/1c2c663d2c65596e191a4d9276b8aaaa65f67b99c0d0a457fec3b0d1c897b6b0.png)
圖中三個選單依次是:
- 可切換至CPU、網路、電量監控。
- 手動執行GC,釋放記憶體。
- dump記憶體使用資料,可儲存至文字資料。
記憶體使用,同樣可以從巨集觀和微觀的角度分析。Profiler
將不同型別的資料佔用的記憶體用不同顏色表示。有:Java
、Native
、Graphics
、Stack
、Code
、Others
。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/7a226a112e4f3bbdf1867d7e9bb52f07a276e28a30dd7e5f792654176bf080ea.png)
如圖,記憶體持續增長,直至系統釋放記憶體資源,因此巨集觀記憶體波形圖呈鋸齒狀。而且可以看出主要是Native空間佔用的記憶體持續增加。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/1873265dc59e9feb3be2103926d197b6b2de031e531b3e0d5256289b7f9cebb4.png)
從微觀上看,放大顯示區間,點選dump按鍵開始記錄,選擇分析區間,檢視記憶體中,各型別資料所佔用的空間。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/7334ed89b5cd286afc2c2af0327504ef622e883a9cb9fe0995c416b3f6514f19.png)
- 區分兩種記憶體分配。
Live Allocation
和Heap Dump
。 - 支援檢視四種heap的記憶體分配。
image heap
、zygote heap
、app heap
、JNI heap
。 - 支援三種類的例項檢視排序:
Arrange by class
、Arrange by package
、Arrange by callstack
。
圖中是優化後的記憶體監控圖,記憶體佔用已經趨於平穩。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/ec306ec547904bc58cabd2fcf2a9329a820acd8e7de473f2c3853c08b53c657b.png)
網路分析
網路分析工具比較簡單,圖中折線圖一個峰值表示一次網路連線。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/164ccbfa458d3748e25860f491c35c067ced4f1e7fab9de388c61ee4f08fc922.png)
通過選中一次網路連線可以檢視到連線請求地址以及傳送和接收的資料。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/6ef1ec940e99910c67a4cfeced5786cfffb83c8b3e6f57171aaacadfbb5d967e.png)
最後附上優化後的網路監控。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/8780396876b18faedd70deecac7cf38604cc626f9313c92e8c8bffe33a4138ea.png)
耗電監控
耗電監控,通常檢測不到任何問題,一般只是用來衡量應用的耗電情況。遇到耗電異常的應用,在CPU、記憶體、網路監控中都能發現問題。如:網路連線過程傳送和接收資料需要使用網路卡模組、推送功能需要保持的長連線、GC記憶體、定位功能都需要電量支援。附上圖中優化前後的對比,注意看Light基線中電量使用的柱形圖。應用耗電問題得到明顯改善。
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/587e989867afeb67f0a4841f212369a0c6d145872fa39355b8553028a699e758.png)
![使用Android Profile做效能分析及優化](https://i.iter01.com/images/7eb6e2b630745c5140c6d959d6207a29947c820bc1cd41d1d25c5c4c9d6d74bd.png)
總結
上面只是大概介紹了記憶體分析工具四個模組的簡單使用。可能讀者對優化前後的對比處於懵懂的狀態。下面解讀下,筆者待測試應用中存在的問題。
應用詳情:
- 測試應用中使用了圖片輪播模組,每2~3s顯示一張圖片。
- 使用ImageLoader載入圖片。
正常情況下,ImageLoader支援三級快取,根據LRU演算法,輪播圖片應該會儲存在記憶體中,並且複用。不會出髮網路連線以及記憶體的持續增長。
問題詳情:
- 輪播圖一共兩張圖片,其中一張圖片資源是空。因此ImageLoader每次都會嘗試發起網路連線下載此圖片。
- ImageLoader初始化時,使用了禁止記憶體快取的配置以及全域性記憶體快取空間只有2M。而後管配置的圖片載入在記憶體中需要3M的空間,致使記憶體快取失效。
綜上,被測試應用總會發起網路請求以及記憶體資源佔用持續增長導致出發系統GC。間接的導致了應用耗電。有興趣的童鞋可以驗證下,耗電峰值、網路連線、記憶體GC和CPU使用峰值之間的關聯。他們四者之間的關係很微妙喲。
考慮到篇幅,暫時介紹至這裡。後續可能會針對四個模組精講。敬請期待。
覺得有用?那打賞一個唄。我要打賞
此處是廣告:Flueky的技術小站