天天看點

Android應用瘦身

APK瘦身的價值

APK瘦身嚴格來講不算是對應用性能的優化,應該算是對程式體驗的優化。APK瘦身的價值主要有幾點:

  • 省流量:特别是在4G網絡下,更多的移動流量表示需要花費更多的錢(别指望着使用者一個月1、2G的流量專門給你騰出幾十M來用于下載下傳安裝包);
  • 給使用者一個好印象,試想使用者在安裝你的程式需要很長的時間時,不僅會影響到他的心情,更是在浪費他的生命;
  • 如果你的APK是預置到裝置中,更大的APK表示需要占用更多的存儲空間,也會增加燒錄的時間。

從哪些方面入手

一個APK實際上就是一個壓縮檔案,解壓後可以看到通常包含如下幾種類型的檔案或檔案夾:

  • classes.dex源碼;
  • 編譯生成的二進制資源檔案resources.arsc;
  • res資源檔案夾;
  • assets檔案夾;
  • lib庫檔案夾;
  • AndroidManifest.xml清單檔案;
  • 依賴關系配置檔案project.properties;
  • 代碼混淆配置檔案proguard.cfg;
  • 簽名資訊檔案META-INF等。

除了AndroidManifest.xml、proguard.cfg、project.properties、META-INF這些本身很小沒有必要做進一步壓縮的檔案外,其它檔案或者檔案夾都可以進一步優化,進而減小APK的體積。下面分别就每一個檔案或者檔案夾該如何減小其大小做介紹:

  • classes.dex源碼:

1.代碼混淆可以減小該檔案的大小,因為混淆後的代碼将較長的檔案名、執行個體、變量、方法名等等做了簡化,進而實作位元組長度上的優化,但代碼混淆會存在一些問題,比如比較耗時間,因為需要找到不能做混淆的代碼并在配置檔案中注明,其次是調試起來不太友善;

2.删掉沒有用到的代碼,可以借助Android Studio→Inspect Code...對工程做靜态代碼檢查,删掉無用的代碼;

  • resources.arsc:

1.這個檔案主要涉及到資源的ID這些,優化的空間不大,可以借助Android Studio→Inspect Code...删掉不必要的資源ID;

  • res資源檔案夾:這是APK瘦身過程中優化的大頭,一個APK裡面最占用空間的就是多媒體資源,圖檔、音頻、視訊主要放在res和assets檔案夾下;

1.通過Android Studio→Inspect Code...對工程做靜态代碼檢查,删掉沒有用到的資源;

2.一個APK盡量隻用一套圖檔,從記憶體占用和适配的角度考慮,這一套圖建議放在xhdpi檔案夾下;

3.使用tinypng等圖檔壓縮工具對圖檔進行壓縮;

4.如果對壓縮的圖檔品質不滿意,可以考慮使用其它圖檔格式,比如不帶alpha值的jpg圖檔、同等品質下檔案更小的webP圖檔格式;

5.借助微信提供的資源檔案混淆工具對資源檔案做混淆,進一步壓縮資源檔案所占用的空間;

6.如果raw檔案夾下有音頻檔案,盡量不要使用無損的音頻格式,比如wav。可以考慮相比于mp3同等品質但檔案更小的opus音頻格式;

7.能不用圖檔的就不用圖檔(用代碼實作),如果要用圖檔則優先使用9圖;

8.考慮引進VectorDrawable和svg。

  • assets檔案夾:assets檔案夾相比于res檔案夾,還有可能放字型檔案、預置資料和web頁面等

1.使用文中提供的字型壓縮工具對字型檔案進行壓縮;

2.如果有web頁面,可以考慮使用7zip壓縮工具對該檔案夾進行壓縮,在正式使用的時候解壓;

3.盡量不要在APK中打包預置資料,做到程式和資料分離,如果是不得不,可以考慮用7z壓縮工具對該檔案進行壓縮,在程式運作時解壓;

  • lib庫檔案夾:

1.隻提供對主流架構的支援,比如arm,對于mips和x86架構可以考慮不支援,這樣可以大大減小APK的體積;

需要用到的工具

  • png、jpg圖檔壓縮神器tinypng
  • png壓縮工具pngquant
  • 圖檔格式轉換工具iSparta
  • Android Studio→Inspect Code...
  • Android應用增量更新開源項目
  • Android資源混淆工具
  • 主流開源項目的混淆規則清單
  • 字型資源檔案壓縮神器FontZip
  • 統計APK檔案中class、method、field、string數量
  • 7z壓縮檔案解壓庫AndroidUn7zip

值得閱讀的文章

  • Android APP終極瘦身指南
  • Putting Your APKs on Diet
  • Facebook工程師是如何改進他們Android用戶端的
  • Shrink Your Code and Resources
  • 安裝包立減1M--微信Android資源混淆打包工具
  • 美團Android資源混淆保護實踐
  • APK瘦身實踐
  • 讓你的APK瘦成一道閃電
  • 關于APK瘦身值得分享的一些經驗
  • Android APK安裝包瘦身
  • WebP 探尋之路
  • SmallerAPK, Part 1: Anatomy of an APK
  • SmallerAPK, Part 2: Minifying code
  • SmallerAPK, Part 3: Removing unused resources
  • SmallerAPK, Part 4: Multi-APK through ABI and density splits
  • SmallerAPK, Part 5: Multi-APK through product flavors
  • SmallerAPK, Part 6: Image optimization, Zopfli & WebP
  • SmallerAPK, Part 7: Image optimization, Shape and VectorDrawables
  • SmallerAPK, Part 8: Native libraries, open from APK

忠告

APK瘦身要有一定的度,如果對某一方面做大小優化需要很長的時間,并且效果不大,可以考慮不做。

繼續閱讀