看你的 APK 辣麼胖,也不減減肥 分析“肥胖原因” jniLibs 的取捨 資源優化 png 圖片處理 總結一哈

擼完代碼打包發現應用沒太多複雜功能的應用打包出的 apk 安裝包大小居然達到了感人的 62M 之大!顯然這個這個大小是不能接受的。那麼要瘦身首先要知道胖在哪兒,對症下藥才能出奇效。

分析“肥胖原因”

Android Studio 自帶的 Apk 分析工具就能處理這個問題,Build ->AnalyzeAPK 選中待分析的 APK 即可得到安裝包中各個大類別的體積大小:


從上圖可以看出總共 62M 大小的安裝包 lib 目錄佔了 43M 之大。這些都是應用中使用到的針對不同類型 CPU 的 .so 依賴庫文件,如果能想辦法減少這部分的體積,APK 大小應該會有明顯的縮小。這麼多的 "ABIs" 如果無特殊需要是不用全部支持的,去掉其中的部分則可以壓縮安裝包的體積。

jniLibs 的取捨

ABI 類型 備註
arm64-v8a 第8代、64位ARM處理器 很少設備,三星 Galaxy S6是其中之一
armeabi-v7a 第7代及以上的 ARM 處理器 現在市面上的主流安卓機型 CPU 架構
armeabi 第5代、第6代的ARM處理器 早期設備,v7a 及 v8a 能兼容 armeabi 指令集
x86 平板及模擬器,少部分華碩的機型
x86_64 64 位平板

上表中可以看出,如果不是做的平板應用,也不需要兼容平板及模擬器運行。那麼 X86 的兩個包是可以去掉的。剩下的三個 armeabi 的依賴庫則可以根據需求做取捨。需要注意的是:
如果這三個包都存在時需要每個包類型中都有對應的 .so 文件。因爲向下兼容的原因,高架構版本 CPU 的手機在加載依賴庫時如果無高版本 lib 目錄則會以低版本兼容方式運行,如果有高版本目錄但是資源不完整則會報錯。比如在 arm64-v8a 類型手機上運行應用時,如果 armeabi-v7a 目錄中有 a.so、b.so, arm64-v8a 目錄中只有 a.so 在運行時則會出現 b.so 找不到的問題。如果刪除掉 arm64-v8a 的目錄則應用會以低版本兼容模式運行,不會產生問題,同理 armeabi 也一樣。
從上面的內容來看,保留哪些類型的依賴庫也很明朗了:

  • 需要保留 64 位的優化特性則保留 64位 包
  • 需要兼容 5、6 代 arm 機型的保留 armeabi
  • 其他情況使用 armeabi-v7 包即可

如果應用是專用設備分發安裝,不是應用市場自由下載。使用多渠道打包每種類型打一個包給對應平臺使用纔是最佳解決方式。

最終選擇

摸着石頭過河,咱也可以摸着大佬們過坑。論機型覆蓋,國內的主流應用微信支付寶應該是妥妥的第一梯隊。那我們來看一下大佬們保留了哪些依賴庫:

  • 支付寶
  • 微信


通過 AndroidStudio 分析發現微信和支付寶都是單個 lib armeabi 包。因爲我的應用也沒有特別需求的騷操作,因此也跟兩位大佬一樣最終只保留了armeabi包,此外因爲使用了騰訊 X5 瀏覽服務,根據他的官方文檔,要在 64 位手機上正常運行是需要將應用以 32 0位模式運行的,即只能使用 32 位包。

資源優化

經過前面的 lib 過濾,在只使用 armeabi 包的情況下打包出來的 APK 大小已經從原來的 62M 縮減到了23M 的大小


優化 jni 依賴包後 APK 的大小大幅縮減了,現在安裝包最大的部分變成了 res 目錄,點進去看發現 drawable 目錄下居然有張超過 1M 的大圖,後來找 UI 重新要了張小一些的圖,從而將 APK 大小進一步縮小了。除了給的資源圖片太大會導致沒必要的佔用 APK 體積外,將大量的未使用圖標資源打包進 APK 也會增加體積。解決這個問題的辦法是在 gradle 中配置 shrinkResources=true,在打包時剔除未使用資源。混淆打包也能在一定程度上壓縮安裝包體積,所以不要因爲加固所以就不配置混淆,他還能幫你減小安裝包體積呢。

  • 工具推薦
    大的 png 圖片,本着自己動手豐衣足食的原則。可以通過 TinyPNG這個網站將圖片進行高保真壓縮,傳上去的 1.9M 的 png 圖片幫我壓縮到了 680 kb,這個壓縮效果還是比較明顯的。當然能找到 UI 統一處理一下還是交給 UI 處理方便一些(手動滑稽)

經過上面的這一系列操作,可喜可賀,APK 大小已經來到了20M 的樣子,從 60M 到 20M ,這個大小基本可以接受了

png 圖片處理

圖片資源較多的 APP 中圖片資源是佔有很大的比例的。而且打包時圖片資源不會被壓縮,因此從這點下手,壓縮 UI 圖標資源的體積也能給 APK 瘦身。

處理方式

處理的方式也很簡單,選中 UI 給的 PNG 圖右鍵選擇轉成 webp,還可以根據需要選擇壓縮質量


壓縮完之後再來檢查一下 APK 發現資源目錄的大小已經只有 1.3 M 的大小了,其中放圖片的三個目錄總大小都只有幾百 KB,這大小已經非常的小了

總結一哈

APK 瘦身基本就幹下面幾件事

  • 根據自己的需求確定使用哪些版本的 JNI 庫。不要全都打進去了,三方是全平臺都提供了但是你不一定要全平臺都用啊
  • 檢查資源圖片中是否有太大圖片,試着處理一下再放進去。資源包括 res 和 assets 目錄
  • 配置打包時過濾未使用文件 shrinkResources=true
  • 一定要混淆代碼打包
  • 圖片換成 WEBP 格式,不用 PNG 格式,效果十分驚人。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章