Apk瘦身實用總結

Apk瘦身

Apk的大小對於用戶是否選擇下載應用起着相當重要的影響
下面是對於減少Apk大小的一些經常使用且實用的方法總結
若有錯誤,歡迎你們踊躍指出javascript


目錄

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

資源佔用分析

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

  1. 簡單分析目錄做用:

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

圖片壓縮

圖片類型

  • JPEG :一種普遍使用的有損壓縮圖像的標準格式,不支持透明通道和多幀動畫。
  • PNG : 一種無損壓縮圖片格式,支持透明通道
  • WebP :支持有損和無損壓縮、支持完整的透明通道、支持多幀動畫,同時大小也獲得很好的限制

壓縮

使用 TinyPNG工具支持對PNG/JPEG圖片類型的壓縮html

PNG替換

根據狀況使用一下資源替換PNGjava

  • 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
相關的注意事項和使用方式在項目地址也有很清晰的說明了~~android

resConfig和lib

android {
  ...
    defaultConfig {
      ...
        resConfigs  "en","fr"

        ndk{
        //設置支持的SO庫架構
        abiFilters 'armeabi','x86','armeabi-v7a','x86_64','arm64-v8a'
        }
    }
    }複製代碼

根據須要指定須要的語言和須要兼容的so庫文件,從而減小沒必要要的文件達到瘦身的目的。git

優化代碼

  • 移除廢棄功能的代碼,反正有 VCS ,刪了代碼隨時能夠找回;
  • 移除重複的代碼,如:已經有了的功能代碼,團隊成員不知道本身又寫了一套,只能靠代碼 Review 解決了;
  • 移除功能重疊的框架,如:項目中有幾套網絡訪問框架 Volley、AsyncHttpClient、Retrofit 等,一樣只能靠代碼 Review 解決;
  • 移除無用的 dependencies 或者 jar 包;
  • 減少對 Support 兼容包的依賴,Support-V4 包很是大,項目引入無疑會增大 dex 文件的大小,Google 已經意識到這個問題,因此 Support-V7 一開始就作了拆分,而且開始對 Support-V4 作拆分,雖然目前成果還不明顯,不過仍是蠻值得期待的,特別是發現你少了 Support-V4 包後,可能就從2個 dex 變成1個 dex 了呢;
  • 插件化,一種懶加載思想的體現,先讓用戶可以安裝宿主包,對於一些功能模塊作插件化,在特定的時機再下載安裝;

綜上所述,就能夠有效的精簡咱們安裝包中的 dex 文件大小,從而達到瘦身目的。github

致謝

《Android高級進階》 - 顧浩鑫
APK瘦身實踐
APK應用瘦身的一些坑
APK應用瘦身
WebP探索web

相關文章
相關標籤/搜索