[譯] 怎樣減少 Android 應用包 60% 的大小?

Aurora_極光開發者發表於2019-02-28

簡評:應用的大小也是使用者體驗的一個重要方面,而減少 Android 應用安裝包大小其實一點也不復雜。

對於移動應用來說,應用安裝包的大小當然是越小越好。特別是對於一些欠發達地區,你不希望使用者因為手機「儲存空間不足」而解除安裝你的應用。

本文就介紹了幾個小技巧來有效減少 apk 的大小:

首先,我們先用 Android Studio 提供的 APK Analyser 工具來分析下我們的 apk 檔案:

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
.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
webp

轉換的結果:
res
res

我們還可以在 build.gradle 中設定 shrinkResources 屬性為 true,這會在打包時刪除未使用的資源:

release{
  //...
  //...
  shrinkResources true
  //...
}複製程式碼

另外如果你的應用不需要支援國際化,那麼可以設定 resConfigs 為 "zh","en",即只支援中英文:

defaultConfig {
    //...
    //...
    //...

    resConfigs "zh","en"
}複製程式碼

這麼做是因為對於官方的 support library,預設是支援國際化的,也就是包含了很多不同語言的資原始檔,我們就可以通過這樣設定來移除用不到的語言資原始檔。

通過上面的設定,這個 App 的安裝包大小從 3.19MB 減少到了 1.89MB。當然還有很多其他的減少 apk 大小的技巧,但這裡介紹的技巧是完全可以作為你專案的預設設定。


知乎專欄:極光日報

原文連結:How you can decrease application size by 60% (In only 5 minutes)?

極光日報,極光開發者 的 Side Project,每天導讀三篇國外技術類文章,歡迎關注。

相關文章