Android App界面和流暢度優化

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

1、人爲在UI線程中做輕微耗時操作,導致UI線程卡頓

人爲避免一切耗時操作

開啓 StrictMode(嚴苛模式)

在Activity里加入如下代碼

public void onCreate() {
     if (DEVELOPER_MODE) {
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectDiskReads()
                 .detectDiskWrites()
                 .detectNetwork()   // or .detectAll() for all detectable problems
                 .penaltyLog()
                 .build());
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                 .detectLeakedSqlLiteObjects()
                 .detectLeakedClosableObjects()
                 .penaltyLog()
                 .penaltyDeath()
                 .build());
     }
     super.onCreate();
 }
注意: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
buildTypes{
	release{
		miniyEnabled true
		shrinkResources true
		proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
	}
} 

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>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章