一. 修改lib配置:
參考資料
so文件的優化:通常我們在使用NDK開發的時候,我們經常會有如下這麼一段代碼:
ndk {
//設置支持的so庫架構
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi"
}
最後我的修改代碼如下:
ndk {
//設置支持的so庫架構
abiFilters "armeabi-v7a"
}
接下來說明這麼做的依據:
看上面圖分析,armeabi-v7主要不支持ARMv5(1998年誕生)和ARMv6(2001年誕生).目前這兩款處理器的手機設備基本不在我公司的適配範圍(市場佔比太少)。
而許多基於 x86 的設備也可運行 armeabi-v7a 和 armeabi NDK 二進制文件。對於這些設備,主要 ABI 將是 x86,輔助 ABI 是 armeabi-v7a。
最後總結一點:如果適配版本高於4.1版本,可以直接像我上面這樣寫,當然,如果armeabi-v7a不是設備主要ABI,那麼會在性能上造成一定的影響。
二. 重新編譯so文件,用更小的庫代替
相信很多開發者都有這種苦惱,很多第三方我們導入進來只用到其中很小一部分功能,大部分功能都是我們用不上的。這時候我們找到源代碼,將我們需要的那部分代碼提取出來,重新編譯成新的so文件,再導入到我們項目中。當然,如果之前沒有編譯過so文件,這部分建議做最後的優化去處理。不然你會遇到很多問題。
這裏說下,因爲項目中有使用到ffmpeg庫,之前導入的第三方的放在assets文件夾下,重寫編寫後的so庫文件放在lib文件夾下,所以lib文件夾反而大了。從51.9M到35.6M,效果還是蠻不錯的。
對了,別問我爲什麼assets文件夾下爲什麼還有12.6M資源,因爲很多.mp3都是第三方的人臉識別必備配置文件,我也很無奈。
三、 優化res,assets文件大小
1. 手動lint檢查,手動刪除無用資源
在Android Studio中打開“Analyze” 然後選擇”Inspect Code…”,範圍選擇整個項目,然後點擊”OK”。
2. 使用tinypng等圖片壓縮工具對圖片進行壓縮。
打開網址,將大圖片導入到tinypng,替換之前的圖片資源。
3. 大部分圖片使用Webp格式代替。
可以給UI提要求,讓他們將圖片資源設置爲Webp格式,這樣的話圖片資源會小很多。如果想了解更多關於webp,請點擊這裏wabp,當然,如果對圖片顏色通道要求不高,可以考慮轉jpg,最好用webp,因爲效果更佳。
4. 儘量不要在項目中使用幀動畫
一個幀動畫幾十張圖片,再怎麼壓縮都還是佔很大內存比重的。所以建議是讓UI去搞,這裏可以參考使用lottie-android,如果項目中動畫效果多的話效果更加明顯。當然這就要辛苦我們UI設計師大大了。
5. 使用gradle開啓shrinkResources
移除無用資源文件,下面是我的配置:
buildTypes {
release {
// 不顯示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//混淆
minifyEnabled true
// 移除無用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
四. 減少chasses.dex大小
classes.dex中包含了所有的java代碼,當你打包時,gradle會將所有模板力的.class文件轉換成classes.dex文件,當然,如果方法數超過64K,將要新增其他文件進行存儲。可以通過multidexing分多個文件,比如我這裏的chasses2.dex。換句話說,就是減少代碼量。我們可以通過以下方法來實現:
1. 儘量減少第三方庫的引用,這個在上面我們已經做過優化了。
2. 避免使用枚舉,這裏特別去網上查了一下,具體可以參考下這篇文章Android 中的 Enum 到底佔多少內存?該如何用?,得出的結論是,可能幾十個枚舉的內存佔有量才相當一張圖片這樣子,優化效果也不會特別明顯。當然,如果你是個追求極致的人,我不反對你用靜態常量替代枚舉。
3. 如果你的dex文件太大,檢查是否引入了重複功能的第三方庫(圖片加載庫,glide,picasso,fresco,image_loader,如果不是你一個人單獨開發完成的很容易出現這種情況),儘量做到一個功能點一個庫解決。
關於classes.dex文件大小分析可以參考這篇譯文使用 APK Analyzer 分析你的 APK
五、 其他
-
刪除無用的語7zip代替
-
刪除翻譯資源,只保留中英文
-
嘗試將andorid support庫徹底踢出你的項目。
-
嘗試使用動態加載so庫文件,插件化開發。
-
將大資源文件放到服務端,啓動後自動下載使用。