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瘦身要有一定的度,如果對某一方面做大小優化需要很長的時間,并且效果不大,可以考慮不做。