所謂界面和流暢度優化,就是儘量多地消除用戶可直接感知的、影響用戶操做體驗的bugjava
一、人爲在UI線程中作輕微耗時操做,致使UI線程卡頓android
人爲避免一切耗時操做web
開啓 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
二、佈局Layout過於複雜,沒法在16ms內完成渲染
利用drawableXXX屬性來作有圖文的控件,特別是相似設置頁面中文字在左右邊有剪頭的View
多用tools的屬性例如tools:text tools:listitem
三、同一時間動畫執行的次數過多,致使CPU或GPU負載太重
人爲避免同一時間執行過多動畫
四、View過分繪製,致使某些像素在同一幀時間內被繪製屢次
簡化佈局嵌套
減小沒必要要的背景顏色填充(用純色圖片代替顏色)
在設置-> 開發者選項->調試GPU過分繪製中打開調試
定位繪製區域
利用Android提供的工具進行位置確認以及修改(HierarchyView,Tracer for OpenGL ES)
定位到具體的視圖(xml文件或者View)
經過代碼和xml文件分析過分繪製緣由
結合具體狀況進行優化
五、View頻繁觸發onMeasure,onLayout,致使onMeasure,onLayout累計耗時過多及整個View頻繁的從新渲染
使用系統性能分析工具systrace分析measure, layout耗時
六、內存頻繁觸發GC過多(同一幀中頻繁建立內存),致使暫時阻塞渲染操做
使用內存分配跟蹤工具Allocation Tracker工具跟蹤對象的分配
七、冗餘資源及邏輯等致使加載和執行緩慢
lint檢查刪除冗餘
去除重複庫無用庫,使用更小庫
去除無用的語言資源
圖片壓縮webp
開啓ProGuard
開啓shrinkResourcesapp
[java] view plain copy 工具
buildTypes{ release{ miniyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
八、代碼效率低
考慮使用ArrayMap代替傳統數據結構HashMap
避免使用enums,推薦使用static佈局
避免在非Constants類中使用static性能
其餘詳見《大話Java性能優化》
九、其餘
對於不須要使用硬件加速的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>