Android性能優化大綱(自我總結)


Android性能優化是開發者必須掌握的知識,因為已經有很多文章寫Android性能優化的方方面面,因此,本文只做綱領性的闡述,指出Android哪些方面可以優化,限於筆者經驗有限,如有不足請留言指出。

一. Android性能優化的目標

說一千,道一萬,Android性能優化無非跟下面4個方面有關,而前4個因素或多或少和電量優化聯系起來。

  • 提升響應速度
  • 提升UI運行(渲染)速度
  • 減少內存占用
  • 使用更少的網絡流量
  • 消耗更少的電量

二. 提升響應速度

對於App開發者來說,系統層面的事我們很難插手,因此只能從APP的編寫入手提升性能。

Android系統中規定了,Activity在5S之內沒有響應,就會ANR,而在實際工程中,5s已經是一個很長的時間了,以下是相關研究機構調查得出的響應時間標准。正常的響應時間應當在0~2000ms以內。

image

從大多數意義上來說,響應速度慢就是做了耗時操作,因此解決方法有3個:

  • 其一是給出一個“偽” 響應,做一些耗時操作后,立即給出一個響應,比如一個轉動的圓圈;或者是假裝該操作已經完成,其實在后台慢慢干。這種方法比較多,仁者見仁,智者見智了。

  • 其二,在異步線程中做耗時操作(這個在Android中基本上是必須的)。

  • 其三,通過好的數據結構、算法將耗時操作簡化。

常見的有可能發生“ANR”操作有哪些呢?

  • 網絡訪問

  • 大量數據讀寫

  • 數據庫操作

  • 硬件操作(比如camera,打開攝像頭的時間可能會很長,勿在主線程直接打開,否則會有概率出ANR)

  • 調用thread的join()方法、sleep()方法、wait()方法或者等待線程鎖,導致主線程等待超時,總之,多線程之間的操作要小心。

二、提升UI渲染速度

人眼對於屏幕的渲染速度是有要求的,Android中把達到這種流暢的幀率規定為60fps。這個速度換算一下約等於 16.67ms/每幀,意味着,繪制一幀圖像最多耗費 16ms,如果超過這個數,則會掉幀,從而用戶感到程序不流暢。

那么,哪些原因會導致UI不流暢呢?

  • 人為在UI線程中做輕微耗時操作(沒有ANR),導致UI線程卡頓;

  • 布局Layout過於復雜,無法在16ms內完成渲染;

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

  • View反復繪制,導致某些像素在同一幀時間內被繪制多次,從而使CPU或GPU負載過重;

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

  • 內存頻繁觸發GC過多(同一幀中頻繁創建內存,GC會暫停其他線程),導致暫時阻塞渲染操作;

開發者可以做的從兩方面入手,其一還是不要做耗時操作,其二是做布局優化,布局優化從以下幾點着手:

  • 減少布局的嵌套層數,通過Android Studio的layot Inspector工具隨便檢查任意一個界面,可以發現Android 默認在你的布局之外包了好幾層。因此,不要輕易在布局中嵌套很多層次。布局嵌套層數過多,在某些機型上甚至會造成StackOverflowError。

  • 合理使用merge

  • 合理使用ViewStub

  • 盡量用自定義Drawble代替圖片做背景,比如一些純色、圓角效果就不要用圖片了。

  • 去掉不必要的背景色定義。

  • ListView的優化,主要有View的復用和局部更新技巧。

  • 對於自定義View,不要在它的onDraw()方法中做耗時操作。

  • 使用Android SDK自帶的工具hierarchyviewer檢查UI渲染性能,它位於SDK目錄的這個路徑/tools/hierarchyviewer.bat 。通過它可以檢測到當前界面中哪些性能較低。

  • 還可以通過開發者選項中的GPU過度繪制工具來進行分析。在設置->開發者選項->調試GPU過度繪制,開啟后在我們想要調試的應用界面中可以看到各種顏色的區域,具體含義如下:

    顏色 含義
    無色 WebView等的渲染區域
    藍色 1x過度繪制
    綠色 2x過度繪制
    淡紅色 3x過度繪制
    紅色 4x(+)過度繪制

對於UI布局優化,可以參看這一篇博客 Android UI性能調優

三、 減少內存占用

這個方面,概括來說只有兩點:1. 減少內存的分配 2. 防止內存泄漏。

一些常見的優化技巧有:

  • 如可能,類的成員變量,尤其是靜態成員變量,盡量轉化為局部變量。
  • 選用更好的數據結構,比如使用SparseArray代替HashMap。
  • 需要才創建(分配)策略。
  • 在Android組件的OnLowMemory和OnTrimMemory方法中釋放無用的內存
  • 防止內存泄漏,比如隱蔽的handler和不當的context持有導致的內存泄漏。
  • 對於圖像的內存管理,比如inJustDecodeBounds屬性的使用,使用圖片緩存池等技巧。 此外,可以使用一些開源框架來進行圖片管理,比如Fresco。

四、 減少網絡訪問

對於很多Android用戶來說,流量的消耗是他們頗為在意的一個指標。減少流量消耗的方向有兩個:1.減少單次網絡訪問傳遞的數據。 2.減少網絡訪問的次數。

更多詳細的的網絡優化技巧,請看這一篇 Android 網絡優化技巧

五、耗電量優化

首先問一個問題,手機哪些操作會顯著消耗電量? 根據相關研究,手機電量主要被消耗在:屏幕、處理器、移動蜂窩網絡、WIFI

因此,減少使用上述元器件的操作就可以使APP更省電。

基本上,對電量優化的建議是:

  • 沒事不要喚醒手機

  • 盡量不要使用后台Service,當一個安靜的美男子

  • 把網絡請求合並、或者說是在幾種集中性的時段訪問網絡。

  • 把一些超級耗時的數據處理邏輯,轉移到后台開發那去(少用點CPU)。

  • 少搞一些花哨華而不實的動畫效果(別噴我)。

以上 就是鄙人對於Android優化了一點自我總結,限於有限的經驗,所說的不一定是對的,如有錯漏請不吝指出,謝謝。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



性能優化之大綱 Android性能優化總結 Android性能優化總結 Android性能優化總結 Android 性能優化總結 Android性能優化總結 Android性能優化總結 Android性能優化總結 Android性能優化總結 android性能優化總結
 
粤ICP备14056181号  © 2014-2021 ITdaan.com