1. 程式人生 > >Android Apk體積優化

Android Apk體積優化

Android Apk體積優化


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

看到這個標題,你可能很感興趣,當我看到這個標題的時候,我也很感興趣。其實也就是減小應用體積的一些技巧,網路上也有不少體積優化的相關文章,這裡的這些技巧簡單易用,可能你會用到。

1. 越小越好


當App應用做得比較大的時候,應用大小這個事情大家都會關注,畢竟移動裝置的資源有限,有限的儲存,有限的記憶體…

你希望你的應用能吸引大量使用者,你會考慮應用的效能、設計和使用者體驗。市場上大概上萬種安卓機型,而其中大部分都是低端機,有限的儲存(1GB 到 8GB),甚至用的還是 2G 或者 3G 網路。這些裝置在印度,巴其爾等非洲發展中國家佔有大量市場,你可以在這些地方獲得大量的使用者。

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

2. 使用APK Analyser 分解你的 APK


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

這裡寫圖片描述

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

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

  • lib — 用來存放一些用到第三方的jar包和so檔案
  • classes.dex — 這是 dex 檔案,包含了所有會執行在你的 DVM 或 ART 裡的位元組碼檔案。
  • res — 這個資料夾包含了所有在 res 資料夾下的檔案。大部分情況下它包含所有圖片,圖示和原始檔,選單檔案和佈局。

這裡寫圖片描述

3. 減小 classes.dex


classes.dex 包含了所有 Java 程式碼。當你編譯你的應用時,gradle 會將你的所有模組裡的 .class 檔案轉換成 .dex 檔案並將這些檔案合成一個 classes.dex 檔案。

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

這裡寫圖片描述

你可以看到現在的我的應用包含 7548 個類和 52763 個方法。這個結果是沒有經過混淆的。你有兩個預設的混淆檔案。

  • proguard-android.txt
  • proguard-rules.pro
release {
    //Enable the proguard
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro"

    //...
}

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

proguard-android.txt這個預設混淆配置位置是在:sdk目錄下 ~sdk\tools\proguard\proguard-android.txt

通過設定 minifyEnabled 為 true,混淆將會移除所有未使用的方法、指令以減小 classes.dex 檔案。

這是啟用了 minify 之後的 APK:
這裡寫圖片描述

可以看到混淆之後的classes.dex的方法數從52763降低到了44895;體積從3.4M降低到了2.3M;

4. 減小 res


下一大塊就是 res 資料夾,它包括了所有的圖片,raw 檔案和 XML。你不能新增/刪除/修改你的 XML,因為它們包含了你的佈局。但是我們可以減小圖片檔案。

  • “shrinkResources” 屬性將會移除所有在工程中沒有用到的資源。在 build.gradle 中像下面這樣啟用它:
release{
  //...
  //...
  shrinkResources true
  //...
}
  • “resConfigs” 屬性將會在構建過程中移除所有本地化資源。新增下面的這些程式碼讓應用只支援中文。

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

    //strip other than english resources
    resConfigs "zh"
}
  • 你可以使用 webp 替代 png

如果你在用 Android Studio 2.3,並且你的應用的最低支援版本大於 18,你可以使用 webp 替代 png。webp 圖片比 png 體積更小但質量一樣。而且 Android 支援 webp。所以你可以在 ImageView 中像載入其它光柵圖片一樣載入 webp 圖片。這不需要改變你的佈局。

你可以在工程選擇 drawable 和 mipmap 資料夾,右擊並選擇 convert to webp。這將會開啟下面這樣的配置彈框。

這裡寫圖片描述

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

這裡寫圖片描述

最終res體積大小從4.3M降低到了3.8

總結


  • 通過在你的 release build type 中加上下面這些程式碼啟用混淆。
  • 啟用 shrinkResources。
  • 通過在 “resConfigs” 裡新增需要的資源名移除所有不需要的本地化資源。
  • 將所有圖片轉為 webp 或者向量圖

最終應用從24.4M降低到了22.5M。看上去想過不明顯,主要是使用了環信sdk,我這裡沒有做libs的優化和沒有png轉webp。這些只是最簡單的方式,還有很多減小應用體積的方法。但是,你應該始終使用上面這些簡單的方法來保證已經儘可能的減小了應用體積。