Google的Android性能模式
Google開發者油Tube頻道發布了探討Android性能模式的16個視頻, 列出了開發者在創建應用時容易出現的一些性能問題,同時提供了很多處理建議。本文是對這些問題和建議的總結。
渲染性能101。 這一系列視頻的講師是Colt McAnlis,據他介紹,不當的渲染是Android上大部分性能問題的根源。如果一個Activity需要16毫秒以上的時間來準備在屏幕上渲染下一 幀,系統將放棄這一幀。應用的用戶會感覺滑動不流暢,或者變換有延遲,從而導致體驗不好。McAnlis推薦了很多用于檢查此類問題的工具:Hierarchy Viewer、Traceview、Profile GPU Rendering、Debug GPU Overdraw和GPU View Updates。
建議盡量減少失效(invalidation)和布局(layout)的數量。前者可以用Developer Option Show GPU View Updates可視化地觀察,而后者可以使用Hierarchy Viewer來分析。
過度繪制。過度繪制衡量的是一個特定的像素在一幀中被繪制的次數。當然這個值最好是1, 但有時候并不是這樣。Debug GPU Overdraw這款工具可以顯示重繪最多的區域,所以開發者就知道要優化什么了。
VSYNC。開發者應該注意幀率變化,尤其是當幀率從高于屏幕刷新率突然掉到低于屏幕刷新率時。這會導致動畫出現延遲,用戶很容易感知到。
Profile GPU Rendering。 從Developer Options設置可以訪問這個工具,它能夠從屏幕上活動的所有Android Activity生成性能圖,這些Activity通常包括通知和導航條,再就是活動的應用。一幀的時間在16毫秒以下為宜。性能圖會包含所有和渲染相關 的主要活動的計時信息,這些活動包括更新顯示列表、執行顯示列表和處理glSwapBuffers。
60 fps。要讓人眼對復雜動畫有不錯的感受,幀率最少要達到60 fps。保持60 fps的幀率并避免變化很重要。
定制視圖。 有些過度繪制優化,比如不去繪制完全被遮蓋的組件,但是當為了創建定制的視圖而覆蓋onDraw()方法時,渲染過程可能會缺少這樣的優化。為盡量減少過 度繪制,建議使用canvas.clipRect()來指定定制繪制的精確區域。此外,應該使用quickReject()來確定某個區域是不是在剪掉的 矩形之外,如果沒有必要,應該避免浪費時間繪制這個區域。
內存攪動。 為大量很快就會被丟棄掉的小型對象重復分配內存,會致使垃圾收集器多次介入,如果這些時間正是在16毫秒的窗口繪制時間內,可能會導致丟幀。借助 Android Studio Memory Monitor,開發者可以將垃圾收集活動以可視化方式顯示出來,并確定是否有過多的垃圾收集。之后可以利用Allocation Tracker來確定這些內存對象從何而來。然后修復可能導致問題的相關代碼,從而避免某些內存分配,或者是把這些分配移到循環之外。此外,對象不應該在 onDraw()內分配,因為這個方法1秒會調用很多次。如果應用確實需要大量很快就要丟棄的對象,建議使用對象池,一次創建,多次復用,從而避免垃圾收 集。
內存泄漏。 內存泄漏使垃圾收集消耗的時間變長,這又會影響幀率。為確保在用戶離開某個Android Activity之后,不會出現內存泄漏,McAnlis建議創建一個不需要消耗內存,或者只需要消耗極少內存的空Activity,轉到這個空的 Activity并強制執行一次垃圾收集。建議在轉移之前和之后,使用Android Studio中的堆和分配跟蹤工具來確定這個Activity是否有內存泄漏。
電量消耗。根據普渡大學和微軟的一篇研究論文(PDF), 大約70%的電量是被第三方廣告模塊消耗的,它們會執行數據分析、位置發現和廣告下載等操作。只有30%的電量是應用中實際活動消耗的。Google建議 開發者仔細處理電量消耗問題,因為這是用戶最關心的。最重要的建議是,除非絕對必要,不要將設備從睡眠中喚醒。如果必須喚醒,建議使用 WakeLock,并設置一個超時時間,以確保如果應用出現問題,設備可以回到睡眠狀態。另一個思路是使用AlarmManager.setInexactRepeating() ,將喚醒操作和另一個活動結合起來,從而節省電量。
可以將某些CPU密集型操作推遲到連上充電器并連接到WiFi時,或者將多個工作組合到一次喚醒操作中。這可以借助JobScheduler API,它支持將某些工作延遲一段時間。還有一個建議,要小心地使用網絡連接,因為在發送完一個網絡請求和接收到一個響應之后,設備要保持至少5秒鐘的喚醒狀態,以備從服務器傳過來的另一個數據包。
McAnlis還建議利用Settings|Battery和Battery Historian 工具提供的電量消耗詳情來監控應用隨時間變化的耗電情況。
查看英文原文:Google’s Android Performance Patterns
來自: