Apk瘦身
Apk的大小對於使用者是否選擇下載應用起著至關重要的影響
下面是對於減小Apk大小的一些常用且實用的方法總結
如有錯誤,歡迎大家踴躍指出
目錄
- 資源佔用分析
- 圖片壓縮
- 圖片型別
- 壓縮
- PNG壓縮
- Webp
- 混淆
- 程式碼混淆
- 資源混淆
- resConfig和lib
- 優化程式碼
- 致謝
資源佔用分析
- 使用AndroidStudio,將APK拖拽到AS裡面就出現如下圖:
- 簡單分析目錄作用:
- 針對大小較大的目錄進行優化
圖片壓縮
圖片型別
- JPEG :一種廣泛使用的有失真壓縮影像的標準格式,不支援透明通道和多幀動畫。
- PNG : 一種無失真壓縮圖片格式,支援透明通道
- WebP :支援有損和無失真壓縮、支援完整的透明通道、支援多幀動畫,同時大小也得到很好的限制
壓縮
使用 TinyPNG工具支援對PNG/JPEG圖片型別的壓縮
PNG替換
根據情況使用一下資源替換PNG
Drawable.xml
: 一些漸變背景圖或者形狀都可以直接通過xml繪製出來,SVG在Android中的應用 也可以給你提供一些繪製的思路NinePatch
: 點9圖,體積小,支援拉伸不變形,實現一圖多用,降低APK體積。AndroidStudio提供PNG轉換成 NinePatch的方法,只需要對著PNG右鍵Create 9-Patch file
JPEG
: 在對透明通道無需求的情況下,使用JPEG代替PNG也可以降低APK 體積
WebP
- 優勢:
- PNG 轉 WebP 的壓縮率要高於 PNG 原圖壓縮率,同樣支援有損與無失真壓縮
- 轉換後的 WebP 體積大幅減少,圖片質量也得到保障(同時肉眼幾乎無法看出差異)
- 轉換後的 WebP 支援 Alpha 透明和 24-bit 顏色數,不存在 PNG8 色彩不夠豐富和在瀏覽器中可能會出現毛邊的問題
- AndroidStudio2.3之後支援對WebP的預覽和直接轉換
- 注意:
- Android 4.0 以後才支援, 4.2.1以後才支援帶透明通道的WebP
- 對於不需要透明度的PNG需要 先轉換成JPEG再轉化成WebP,否則會因為帶有透明通道,而在4.2.1以下的版本中無法顯示
混淆
程式碼混淆
minifyEnable
: 啟動混淆,啟用混淆的同時他會對程式碼壓縮和優化,找出沒有引用的程式碼並 在生成APK之前剔除shrinkResources
: 只有當minifyEnable
開啟,才能起作用。去除無用的resource檔案。 注意 :shrinkResources
不能幫你移除資原始檔, 只會幫你壓縮合並(可能是因為R檔案 生成id索引資訊)。- 使用Lint刪除無用資源 : Refactor -> Remove Unused Resource 。 注意 : 刪除之前最好Preview一下,不然會把一些通過反射或者Uri等方式引用的資源也會被刪除,最終導致
Resources Not Found Exception
資源混淆
關於資源混淆目前比較好的是微信的方案:AndResGuard
相關的注意事項和使用方式在專案地址也有很清晰的說明了~~
resConfig和lib
android {
...
defaultConfig {
...
resConfigs "en","fr"
ndk{
//設定支援的SO庫架構
abiFilters 'armeabi','x86','armeabi-v7a','x86_64','arm64-v8a'
}
}
}複製程式碼
根據需要指定需要的語言和需要相容的so庫檔案,從而減少不必要的檔案達到瘦身的目的。
優化程式碼
- 移除廢棄功能的程式碼,反正有 VCS ,刪了程式碼隨時可以找回;
- 移除重複的程式碼,如:已經有了的功能程式碼,團隊成員不知道自己又寫了一套,只能靠程式碼 Review 解決了;
- 移除功能重疊的框架,如:專案中有幾套網路訪問框架 Volley、AsyncHttpClient、Retrofit 等,同樣只能靠程式碼 Review 解決;
- 移除無用的 dependencies 或者 jar 包;
- 減小對 Support 相容包的依賴,Support-V4 包非常大,專案引入無疑會增大 dex 檔案的大小,Google 已經意識到這個問題,所以 Support-V7 一開始就做了拆分,並且開始對 Support-V4 做拆分,雖然目前成果還不明顯,不過還是蠻值得期待的,特別是發現你少了 Support-V4 包後,可能就從2個 dex 變成1個 dex 了呢;
- 外掛化,一種懶載入思想的體現,先讓使用者能夠安裝宿主包,對於一些功能模組做外掛化,在特定的時機再下載安裝;
綜上所述,就可以有效的精簡我們安裝包中的 dex 檔案大小,從而達到瘦身目的。
致謝
《Android高階進階》 - 顧浩鑫
APK瘦身實踐
APK應用瘦身的一些坑
APK應用瘦身
WebP探索