怎樣減少 Android 應用包 60% 的大小?
我要減肥
簡評:應用的大小也是使用者體驗的一個重要方面,而減少 Android 應用安裝包大小其實一點也不復雜。
對於移動應用來說,應用安裝包的大小當然是越小越好。特別是對於一些欠發達地區,你不希望使用者因為手機「儲存空間不足」而解除安裝你的應用。
本文就介紹了幾個小技巧來有效減少 apk 的大小:
首先,我們先用 Android Studio 提供的 APK Analyser 工具來分析下我們的 apk 檔案:
apk
可以看到佔空間最多的主要是三個部分:classes.dex, res 和 resources.arsc。
- classes.dex:包含有 Java 程式碼的位元組碼檔案。
- res:包含了資原始檔,比如圖片、佈局檔案等等。
- resources.arsc:包含所有的值資原始檔,如 strings, dimensions, styles, integers 等等。
classes.dex
classes.dex 檔案的大小完全取決於程式中方法數的多少。在上面展示的例子中,包含了 4392 個類和 29897 個方法。這個結果是預設沒有使用 proguard 的。我們有兩個預設的 proguard 檔案可以使用:
從名字上就可以看出,proguard-android-optimize.txt 是更加激進的 proguard 配置,包括和 proguard-android.txt 相同的 ProGuard 規則,但還包括其他在位元組碼一級(方法內和方法間)執行分析的優化,以進一步減小 APK 大小和幫助提高其執行速度。
可以像這樣來使用:
release {
//Enable the proguard
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), "proguard-rules.pro"
//Other parameters
debuggable false
jniDebuggable false
renderscriptDebuggable false
signingConfig playStoreConfig //Add your own signing config
pseudoLocalesEnabled false
zipAlignEnabled true
}
通過設定 minifyEnabled 屬性為 true,會告訴 proguard 刪除所有未使用的方法和指令,進一步的減少 .dex 檔案的大小。
.dex
方法數從 29897 減少到了 15168,大小從 3.1MB 減少到了 1.98 MB。
res
對於 res 資料夾,通常佔空間最大的就是圖片了。如果你的 Android Studio 為 2.3,並且專案的 minimum version 為 18 或以上,應該使用 webp 而不是 png 圖片。webp 圖片有更小的體積,圖片質量還沒有什麼損失。
我們可以選中 drawable 和 mipmap 資料夾,右鍵後選擇 convert to webp,將圖片轉為 webp 格式。
webp
轉換的結果:
res
我們還可以在 build.gradle 中設定 shrinkResources 屬性為 true,這會在打包時刪除未使用的資源:
release{
//...
//...
shrinkResources true
//...
}
另外如果你的應用不需要支援國際化,那麼可以設定 resConfigs 為 "zh","en",即只支援中英文:
defaultConfig {
//...
//...
//...
resConfigs "zh","en"
}
這麼做是因為對於官方的 support library,預設是支援國際化的,也就是包含了很多不同語言的資原始檔,我們就可以通過這樣設定來移除用不到的語言資原始檔。
通過上面的設定,這個 App 的安裝包大小從 3.19MB 減少到了 1.89MB。當然還有很多其他的減少 apk 大小的技巧,但這裡介紹的技巧是完全可以作為你專案的預設設定。