【轉載】張明雲
前言
之前我在微信羣裏面有說到,隨着Android開發越來越成熟,關於Android方面的技術文章越來越多,作爲開發者不缺資源,缺乏的是系統的知識和指導,對於學生和上班族來講,更缺乏篩選信息的時間。從某個角度來講,精心篩選整理網絡上的優質文章,如果需要學習某方面的知識只需要看這一篇文章就夠,那意義會比寫一篇純技術文章會有價值得多。
出於能夠更便捷、高效獲取優質資源的角度考慮,寫一系列專題的想法就誕生了,結合自己閱讀過的技術文章和實際工作經驗,將平時收集的優質技術文章按照某個方面整理成一系列的專題,比如APK瘦身、插件化、程序架構、性能優化、自定義view、增量升級、移動開發各種技術解決方案等。這是我目前能夠想到的除了寫書之外最值得做的一件事情了。
這個系列從APK瘦身專題開始,後面會不定期推出其它專題,發不過的專題也會不斷更新。
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中打包預置數據,做到程序和數據分離,如果是不得不,可以考慮用7zip壓縮工具對該文件進行壓縮,在程序運行時解壓;
- lib庫文件夾:
1.只提供對主流架構的支持,比如arm,對於mips和x86架構可以考慮不支持,這樣可以大大減小APK的體積;
需要用到的工具
Android Studio→Inspect Code…
值得閱讀的文章
SmallerAPK, Part 4: Multi-APK through ABI and density splits
SmallerAPK, Part 7: Image optimization, Shape and VectorDrawables
忠告
APK瘦身要有一定的度,如果對某一方面做大小優化需要很長的時間,並且效果不大,可以考慮不做。