Apk瘦身實用總結

Rayhahah發表於2017-05-30

Apk瘦身

Apk的大小對於使用者是否選擇下載應用起著至關重要的影響
下面是對於減小Apk大小的一些常用且實用的方法總結
如有錯誤,歡迎大家踴躍指出


目錄

  • 資源佔用分析
  • 圖片壓縮
    • 圖片型別
    • 壓縮
    • PNG壓縮
    • Webp
  • 混淆
    • 程式碼混淆
    • 資源混淆
  • resConfig和lib
  • 優化程式碼
  • 致謝

資源佔用分析

  1. 使用AndroidStudio,將APK拖拽到AS裡面就出現如下圖:

Apk瘦身實用總結

  1. 簡單分析目錄作用:

Apk瘦身實用總結

  1. 針對大小較大的目錄進行優化

圖片壓縮

圖片型別

  • 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探索

相關文章