隨著功能的迭代,我們的APP體積也越來越大,因此在保證功能正常的情況下盡可能的降低包體積是一個必須要面對的問題。
APK的組成結(jié)構(gòu)

通過上圖可以看出APK體積包主要包含:dex字節(jié)碼文件、META-INF簽名信息文件、manifest文件、res資源文件、lib包文件、resources.arsc 記錄資源文件和資源 ID 之間的映射關(guān)系的文件和assets 資源文件(圖片中未包含)。其中可以直接或者間接修改的是dex文件、res文件、assets 資源文件以及l(fā)ib包中的文件。
降低包體積的方案
1.使用Lint去除無用的資源文件,操作步驟是Analyze -> Run Inspection by Name -> 輸入框輸入 Unused resources 就可以掃描工程找到未使用的資源了



2.gradle配置去除無用的資源文件或者開啟混淆去除無用的代碼
buildTypes {
release {
//去除無用資源
shrinkResources true
/開啟混淆
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
注意:反射方式調(diào)用的資源會有問題。
3.資源方面手寫的xml資源替代UI給的套資源,從而減少資源占用大小。
4.資源重用,比如倒三角圖片,當我們需要正三角圖片時可以使用動畫等方式實現(xiàn),這樣一來就減少了一套資源。
5.針對png jpeg等資源進行壓縮,使用Tinypng等在線工具無損壓縮圖片,降低資源大小。
6.使用webp圖片,webp圖片提供有損壓縮,資源占用較小。使用Android Studio自帶的方式將圖片轉(zhuǎn)換成webp格式。

7.使用AndResGuard工具對資源進行混淆,不僅提高資源安全性,也能配合7z壓縮,降低資源大小。
8.國內(nèi)應(yīng)用只保留中英語音,降低資源占用
android {
...
defaultConfig {
....
resConfigs "en", "zh-rCN"
}
}
9.去除非必要的so資源,目前市面上絕大部分的CPU架構(gòu)都是 ARMv7/ARMv8,所以可以在gradle中加入配置,只保留v7,v8。
defaultConfig {
...
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
10.按需加載so文件,使用System.load()方式動態(tài)加載so文件,這樣就可以將so文件掛載在服務(wù)器上,按需下載,從而達到降低包體積效果。
11.插件化架構(gòu),將功能模塊apk掛載到服務(wù)器上,使用到再去下載。