天天看點

簡單好使的操作——将Android apk大小減少 60%

越小越好

作為一個開發者我們總是更關心應用的性能,設計和使用者體驗。但是,大多數開發者都忘了(或低估)一件事:應用體積。如果你希望你的應用能吸引大量使用者,這是非常核心的一點。

市場上大概有 11000 種安卓機型,而其中大部分都是低端機,有限的存儲(1GB 到 8GB),甚至用的還是 2G 或者 3G 網絡。這些裝置在印度,巴其爾等非洲開發中國家占有大量市場,你可以在這些地方獲得大量的使用者。

讓你的應用大小保持最佳變得尤其重要。你的應用體積越小,你的使用者就有更多的空間來存儲他們的視訊和圖檔。說實話,你肯定不希望使用者因為“存儲空間不足”的提示删除你的應用。

簡單好使的操作——将Android apk大小減少 60%

如果使用者的存儲空間不夠的話,他們會解除安裝你的應用。

這些開發中國家使用者使用的依然是速度有限的 2G/3G 網。是以,如果你的應用體積太大,将會需要更多的時間來下載下傳(更可能的情況時使用者根本不會去下載下傳)。同樣的,大多數使用者流量有限,使用者下載下傳的每個位元組都是在花錢。

是以,很明顯了,應用程式界的真理就是:

越小越好

使用 APK Analyser 分解你的 APK

Android Studio 提供了一個有用的工具:APK Analyser。APK Analyser 将會拆解你的應用并讓你知道 .apk 檔案中的那個部分占據了大量空間。讓我們看一下 Anti-Theft 在沒有經過優化之前的截圖。

簡單好使的操作——将Android apk大小減少 60%

從 Apk Analyser 的輸出來看,應用的原大小是 3.1MB。經過 Play 商店的壓縮,大緻是 2.5MB。

從截圖中可以看出主要有 3 個檔案夾占據了應用的大多數空間。

  • classes.dex —— 這是 dex 檔案,包含了所有會運作在你的 DVM 或 ART 裡的位元組碼檔案。
  • res —— 這個檔案夾包含了所有在 res 檔案夾下的檔案。大部分情況下它包含所有圖檔,圖示和源檔案,菜單檔案和布局。
簡單好使的操作——将Android apk大小減少 60%
  • resources.arsc —— 這個檔案包含了所有 value 資源。這個檔案包含了你 value 目錄下的所有資料。包括 strings、dimensions、styles、intergers、ids 等等。
簡單好使的操作——将Android apk大小減少 60%

是以,現在你知道 APK 是怎麼組成的了。讓我們接着看看該怎麼一塊塊的優化它以減小應用體積。

減小 classes.dex

classes.dex 包含了所有 Java 代碼。當你編譯你的應用時,gradle 會将你的所有子產品裡的 .class 檔案轉換成 .dex 檔案并将這些檔案合成一個 classes.dex 檔案。

如果你很好奇,編譯的過程是怎樣的,看我的另一篇部落格:The Jack and Jill: Should you use in your next Android Application?

單個的 classes.dex 檔案可以容納大約 64K 方法。如果你達到了這個限制,你必須要在你的工程中啟用 multidexing。這将會建立另一個 classes1.dex 檔案去存儲剩下的方法。是以 classes.dex 檔案數目由你的方法數而定。

簡單好使的操作——将Android apk大小減少 60%

你可以看到現在的 “Anti-Theft Screen Lock” 包含 4392 個類和 29897 個方法。這個結果是沒有經過混淆的。你有兩個預設的混淆檔案。

  • proguard-android-optimize.txt
  • proguard-android.txt

就像檔案名寫的那樣,“proguard-android-optimize.txt”是更積極的混淆選項。我們将這個作為預設的混淆配置。你可以在 /app 目錄下的 proguard-rules.pro 裡添加自定義的混淆配置。

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,混淆将會移除所有未使用的方法、指令以減小 classes.dex 檔案。

這是啟用了 minify 之後的 APK。

簡單好使的操作——将Android apk大小減少 60%

你可以看到在為每個子產品啟用了混淆之後我們的 classes.dex 大小減小了幾乎 50%。同時你可以看到方法數從 29897 降到了 15168(幾乎 50%)。恭喜……����

體積從 3.1MB 降到了 1.98MB。(縮小約 50%)

減小 res:

下一大塊就是 res 檔案夾,它包括了所有的圖檔,raw 檔案和 XML。你不能添加/删除/修改你的 XML,因為它們包含了你的布局。但是我們可以減小圖檔檔案。

  • “shrinkResources” 屬性将會移除所有在工程中沒有用到的資源。在 build.gradle 中像下面這樣啟用它:
release{
  //...
  //...
  shrinkResources true
  //...
}
           
  • “resConfigs” 屬性将會在建構過程中移除所有本地化資源。app “Anti-Theft Screen Lock” 隻需要支援英語。而很多的支援庫都可能有其它語言的本地化檔案夾。這些是我不需要的。是以,添加下面的這些代碼讓應用隻支援英語。
defaultConfig {
    //...
    //...
    //...

    //strip other than english resources
    resConfigs "en"
}
           
  • 如果你在用 Android Studio 2.3,并且你的應用的最低支援版本大于 18,你可以使用 webp 替代 png。webp 圖檔比 png 體積更小但品質一樣。而且 Android 支援 webp。是以你可以在 ImageView 中像加載其它光栅圖檔一樣加載 webp 圖檔。這不需要改變你的布局。

你可以在工程選擇 drawable 和 mipmap 檔案夾,右擊并選擇 convert to webp。這将會打開下面這樣的配置彈框。

簡單好使的操作——将Android apk大小減少 60%

點選 ok,将會将所有 png 圖檔轉成 webp。如果 webp 圖檔比 png 更大,Android Studio 将會自動跳過這個檔案。

讓我們看下最終效果:

簡單好使的操作——将Android apk大小減少 60%

喔!!!res 檔案夾從 710KB 降到了 597KB。

體積減小了 105KB。(降低了 16%)

你也可以将圖檔轉為矢量圖。但是這樣你需要對它的向後相容性進行一些處理。如果你想了解更多 vector 的相關知識,看看 Chris Banes 的這篇部落格。

TL;DR:

  • 通過在你的 release build type 中加上下面這些代碼啟用混淆。
  • 啟用 shrinkResources。
  • 通過在 “resConfigs” 裡添加需要的資源名移除所有不需要的本地化資源。
  • 将所有圖檔轉為 webp 或者矢量圖。

總結:

通過使用上面這些簡單的技巧我将應用體積從 3.19MB 降至了 1.89MB。

這些隻是最簡單的方式,還有很多減小應用體積的方法。但是,你應該始終使用上面這些簡單的方法來保證已經盡可能的減小了應用體積。

作者:路歌

連結:https://juejin.im/post/58d9b6a1a22b9d0064719f9e

來源:掘金

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。