Android App介面和流暢度優化
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>