1. 程式人生 > >Android面試題-與效能優化相關面試題四

Android面試題-與效能優化相關面試題四

本文配套視訊

原始碼分析相關面試題

與XMPP相關面試題

與效能優化相關面試題

與登入相關面試題

與開發相關面試題

與人事相關面試題

文字部分如看得太累,下面有配套視訊,視訊內容和文字部分內容一致。

12-如何對android應用進行記憶體效能分析

Android應用UI效能分析

在使用App時會發現有些介面啟動卡頓、動畫不流暢、列表等滑動時也會卡頓出現這種情況,可以考慮對UI效能分析。

首先要清楚卡頓的原因,有以下幾種情況:

 人為在UI執行緒中做輕微耗時操作,導致UI執行緒卡頓;

 佈局Layout過於複雜,無法在16ms內完成渲染;

 同一時間動畫執行的次數過多,導致CPU或GPU負載過重;

 View過度繪製,導致某些畫素在同一幀時間內被繪製多次,從而使CPU或GPU負載過重;

 View頻繁的觸發measure、layout,導致measure、layout累計耗時過多及整個View頻繁的重新渲染;

 記憶體頻繁觸發GC過多(同一幀中頻繁建立記憶體),導致暫時阻塞渲染操作;

 冗餘資源及邏輯等導致載入和執行緩慢;

 臭名昭著的ANR;

如何分析?

分析UI卡頓我們一般都藉助工具,通過工具一般都可以直觀的分析出問題原因,從而反推尋求優化方案,具體如下細說各種強大的工具

使用HierarchyViewer分析UI效能

我們可以通過SDK提供的工具HierarchyViewer來進行UI佈局複雜程度及冗餘等分析
通過命令啟動HierarchyViewer

接下來Hierarchy window視窗開啟:

一個Activity的View樹,通過這個樹可以分析出View巢狀的冗餘層級,以及每個View在繪製的使用時長也有表示。

使用Lint進行資源及冗餘UI佈局等優化

冗餘資源及邏輯等也可能會導致載入和執行緩慢,這可以使用Link工具,來發現優化這些問題的

在Android Studio 1.4版本中使用Lint最簡單的辦法:
就是將滑鼠放在程式碼區點選右鍵->Analyze->Inspect Code–>介面選擇你要檢測的模組->點選確認開始檢測,等待一下後會發現如下結果:

如果存在冗餘的UI層級巢狀,會進行高亮顯示, 我們根據提示可以點選跳進去進行優化處理掉的。

使用Memory監測及GC列印與Allocation Tracker進行UI卡頓分析

由於Android系統會依據記憶體中不同的記憶體資料型別分別執行不同的GC操作,常見應用開發中導致GC頻繁執行的原因主要可能是因為短時間內有大量頻繁的物件建立與釋放操作,也就是俗稱的記憶體抖動現象,或者短時間內已經存在大量記憶體暫用介於閾值邊緣,接著每當有新物件建立時都會導致超越閾值觸發GC操作

如何檢視?

Android Studio 工具提供記憶體檢視器:

根據記憶體抖動現象,檢視log日誌進行分析:

如何看到,這種不停的大面積列印GC導致所有執行緒暫停的操作必定會導致UI視覺的卡頓,所以我們要避免此類問題的出現,具體的常見優化方式如下:

 檢查程式碼,儘量避免有些頻繁觸發的邏輯方法中存在大量物件分配;
 儘量避免在多次for迴圈中頻繁分配物件;
 避免在自定義View的onDraw()方法中執行復雜的操作及建立物件(譬如Paint的例項化操作不要寫在onDraw()方法中等);
 對於併發下載等類似邏輯的實現儘量避免多次建立執行緒物件,而是交給執行緒池處理。

有了上面說明GC導致的效能後我們就該定位分析問題了,
我們可以通過執行DDMS->Allocation Tracker標籤開啟一個新視窗,然後點選Start Tracing按鈕,接著執行你想分析的程式碼,執行完畢後點擊Get Allocations按鈕就能夠看見一個已分配物件的列表,如下:

根據記憶體分配情況,進行優化。

寫篇文章和錄製視訊從選題,思考,組織,寫作,編輯至少需要一個多小時,而您點贊和轉發只需要0.1秒,就可以帶給我更大的動力,何樂而不為呢?

  • 歡迎關注微信公眾號,長期推薦技術文章和技術視訊