一鍵解決Android專案圖片壓縮煩惱,為apk瘦身!

KingkingDu發表於2019-04-22

ImgCompressPlugin

一款Android端自動化圖片壓縮的gradle外掛,一鍵掃描專案中的資源目錄並進行批量圖片壓縮,提供3種壓縮方式,支援有損及無失真壓縮.同時會記錄已壓縮的檔案,適合個人及團隊協同使用.

github地址:github.com/duking666/I…

解決的場景

  • 需要對apk體積瘦身的應用
  • 解決逐個手動壓縮的繁雜過程,一鍵點選即可解決
  • 專案中曾經不慎引入了沒壓縮過的圖片但沒發現.怎麼破?ImgCompressPlugin幫你解決!
  • UI童鞋給予的設計圖大小感覺像壓縮過,但實際可能沒有,那我究竟是該手動壓縮一下還是偷偷懶直接放專案中呢?ImgCompressPlugin幫你解決!
  • 團隊版本迭代過程中,多人協同開發,如何避免重複壓縮導致的失真,怎麼確定圖片已經被其他童鞋壓縮過呢?ImgCompressPlugin幫你解決!

如何使用

第一步:在Project的build.gradle檔案中:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        ...
        classpath 'com.kingkingdu.plugin:img-compressor:1.1.4'
    }
}
...
...
//圖片壓縮外掛配置,後文有對配置資訊介紹
apply plugin: 'img-compressor'
imgCompressOpt{
    way="pngquant"
    test = false
    whiteFiles=["text_pic1.png","test_pic2.jpg"]
    minSize=5
    tinyKeys=["your key"]
}

複製程式碼

第二步:引入後點選sync now,gradle配置完畢後會顯示下圖imgCompressTask,雙擊即可執行,等待壓縮結果即可

gradle_guide

配置資訊

  • way:設定壓縮的方式,支援3種常見的壓縮,"tinypng","pngquant","zopflip" 3選1,壓縮方式選擇及壓縮效果見下圖
  • test:設定測試模式是否開啟,false表示壓縮後圖片直接覆蓋原圖,true表示會把原圖及壓縮圖輸出到測試目錄(Project/ImageCompressTest)
  • whiteFiles:選填,白名單檔案陣列,不進行壓縮
  • minSize:單位為KB,設定原圖大於某個數值才觸發壓縮,0表示全部都壓縮
  • tinyKeys:選填,僅在way="tinypng"情況下才需要,tinyKeys申請教程入口

壓縮效果

原圖 tinypng pngquant zopflip
壓縮型別 有損 有損 無損
1.3M 445KB 542KB 903KB
原圖
tiny
pngquant
zopflip

如何選擇合適的壓縮方式

  • 如果專案本身原先使用的壓縮方式與3種模式之一相同,則way選擇相同的方式.
  • 如果原先沒有固定的壓縮方式,那麼推薦使用tiny或者pngquant,相對來說,tiny壓縮時間較長,需要去tinyKey官網申請key,教程入口,但效果最好.pngquant壓縮快速,效果也不錯

白名單的意義

  • 當進行圖片壓縮後發現有少量圖片失真,則可以加入白名單,避免被壓縮

測試模式

  • 適合場景:UI設計師可能需要協助對比壓縮後的圖片是否失真,但又沒專案的程式碼許可權,所以把壓縮後的圖片放置在一個目錄整體打包,發給設計師審閱,當然最便捷的方式是Android studio自帶的版本對比工具.
  • 當配置中test=true時,會把原圖及壓縮後的圖輸出到測試目錄(Project/ImageCompressTest),壓縮後的圖片命名為xxxx(test).png
  • 注意:當測試目錄中只存在原圖但不存在壓縮後的圖片時,表示圖片已充分壓縮,無需再壓縮

最佳實踐

  • 引入本外掛,配置測試模式test=false,初次執行imgCompressTask後,檢視log,會列印類似日誌:

    • Task finish, compressed:3 files skip:3 Files before total size: 951.50KB after total size: 309.67KB save size: 641.83KB
    • 通過日誌可得知被壓縮圖片為3個,跳過圖片為3個,圖片壓縮前後的大小比較.圖片跳過的原因為圖片已充分壓縮,無需再壓縮
  • 執行task後會在project目錄下生成image-compressed-info.json檔案,記錄了已壓縮的圖片資訊

  • 通過Android studio自帶的版本控制對比壓縮前後圖片是否失真,將失真圖片(一般很少)加入白名單中,同時revert恢復原圖

  • image-compressed-info.json檔案加入到版本控制,提交修改後的圖片及json檔案

  • 在後續的版本開發中,團隊中的任何人在開發過程中加入任何圖片,或者等版本提測後,執行一次task即可壓縮新版本引入的圖片,舊版本的圖片保持不變,也不會出現團隊成員重複壓縮的情況

  • 建議團隊中一位童鞋專門處理圖片壓縮即可,無需所有人都懂得使用.也避免了json檔案衝突問題.

問題解答

  • Q1:如果在後續版本迭代過程中,已壓縮的圖片替換成新的圖片,會不會忘記壓縮了?
  • 答:不會.外掛本身會通過MD5進行校驗,而不是圖片命名進行校驗,故新圖片也會執行壓縮的
  • Q2:支援的圖片格式有哪些?
  • 答:支援png,jpg格式,webp暫時不支援
  • Q3:對於元件化專案存在多個module,是否會掃描所有的module?
  • 答:會全部掃描,只要是application型別或者Android library型別都會被掃描到

最後

此外掛已在筆者團隊中線上使用,效果不錯. 最後,附上專案開源地址:github.com/duking666/I… 歡迎star和fork,歡迎廣大網友為專案貢獻程式碼或提出issue,謝謝

相關文章