1. 程式人生 > >Android App介面和流暢度優化

Android App介面和流暢度優化

Android App介面和流暢度優化

 

所謂介面和流暢度優化,就是儘可能多地消除使用者可直接感知的、影響使用者操作體驗的bug

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

人為避免一切耗時操作

開啟 StrictMode(嚴苛模式)

在Activity里加入如下程式碼

 
  1. public void onCreate() {

  2. if (DEVELOPER_MODE) {

  3. StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()

  4. .detectDiskReads()

  5. .detectDiskWrites()

  6. .detectNetwork() // or .detectAll() for all detectable problems

  7. .penaltyLog()

  8. .build());

  9. StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()

  10. .detectLeakedSqlLiteObjects()

  11. .detectLeakedClosableObjects()

  12. .penaltyLog()

  13. .penaltyDeath()

  14. .build());

  15. }

  16. super.onCreate();

  17. }

注意:StrictMode只適用於測試版本,千萬不要在上線版本使用 StrictMode

2、佈局Layout過於複雜,無法在16ms內完成渲染
利用drawableXXX屬性來做有圖文的控制元件,特別是類似設定頁面中文字在左右邊有剪頭的View
多用tools的屬性例如tools:text tools:listitem

3、同一時間動畫執行的次數過多,導致CPU或GPU負載過重
人為避免同一時間執行過多動畫

4、View過度繪製,導致某些畫素在同一幀時間內被繪製多次
簡化佈局巢狀
減少不必要的背景顏色填充(用純色圖片代替顏色)

在設定-> 開發者選項->除錯GPU過度繪製中開啟除錯
定位繪製區域
利用Android提供的工具進行位置確認以及修改(HierarchyView,Tracer for OpenGL ES)
定位到具體的檢視(xml檔案或者View)
通過程式碼和xml檔案分析過度繪製原因
結合具體情況進行優化

5、View頻繁觸發onMeasure,onLayout,導致onMeasure,onLayout累計耗時過多及整個View頻繁的重新渲染
使用系統性能分析工具systrace分析measure, layout耗時

6、記憶體頻繁觸發GC過多(同一幀中頻繁建立記憶體),導致暫時阻塞渲染操作
使用記憶體分配跟蹤工具Allocation Tracker工具跟蹤物件的分配

7、冗餘資源及邏輯等導致載入和執行緩慢
lint檢查刪除冗餘
去除重複庫無用庫,使用更小庫
去除無用的語言資源
圖片壓縮webp
開啟ProGuard
開啟shrinkResources

 
  1. buildTypes{

  2. release{

  3. miniyEnabled true

  4. shrinkResources true

  5. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

  6. }

  7. }


8、程式碼效率低
考慮使用ArrayMap代替傳統資料結構HashMap
避免使用enums,推薦使用static

避免在非Constants類中使用static

其他詳見《大話Java效能優化》

9、其他
對於不需要使用硬體加速的activity(沒有動畫效果、視訊播放以及各種多媒體檔案),不要在AndroidManifest.xml檔案宣告activity時新增“android:hardwareAccelerated="true"”關掉硬體加速可節省應用記憶體

對於需要橫豎屏轉換的應用,又不想在橫豎屏切換的時候重新跑onCreate方法,可以在AndroidManifest.xml檔案宣告Activity時新增“android:configChanges="screenSize|orientation"”

為了減輕應用程式主程序的記憶體壓力,對於耗記憶體比較多的介面(多媒體),可以在AndroidManifest.xml檔案宣告Activity時下新增“android:process=".processname"”單開一個程序,退出在退出這個介面的時候一定要在該介面的onDestory方法中呼叫System的kill方法來殺掉該程序;

可以通過為application、activity自定義主題的方式來關掉多點觸控功能,只需要在自定義的主題下新增這兩個標籤:
  <item name="android:windowEnableSplitTouch">false</item>
  <item name="android:splitMotionEvents">false</item>