iOS 本地圖片優化實踐
缺點: 1. 不能解決模組劃後,業務間的圖片引用,刪除謹慎; 2. 使用 xcassest 管理資源圖片,如果 .imageset 和圖片名命名不統一的話,掃描失敗. 複製程式碼
反其道而行之 (1) 通過 cartool 開啟 Assets.car 中的檔案; (2) 通過 find 檢索出所有資源圖片; (3) 通過指令碼去遍歷,可執行檔案中的 __TEXT,動態庫,jsbundle,xib 等檔案判斷 ipa 中的資源圖片是否存在無用圖片. 複製程式碼
2. 建立公共資源庫,去除各模組中的重複圖片
原理:大小比較 > 部分MD5簽名比較 > 全MD5簽名比較 > 位元組到位元組的比較 $ brew install fdupes $ fdupes -r ~/path# 搜尋重複子檔案在終端展示 $ fdupes -Sr ~/path# 搜尋重複子檔案&顯示每個重複檔案的大小在終端展示 $ fdupes -Sr ~/path > ~/log.txt# log輸出到指定路徑資料夾 複製程式碼
3. 壓縮圖片
無失真壓縮,通過刪除圖片中不必要的元資料,實現優化圖片大小 XCode 在編譯的時候會對 png 圖片進行 recompress,生成蘋果爸爸喜歡的 CgBI 格式,會重新新增刪除掉的元資料,為了優化圖片解碼,減少不必要的 GPU 和 CPU 的開銷; 複製程式碼
可參考: imageoptim Xcode's built-in (de)optimization PNG compression and iOS apps Optimizing App Assets Working with Wide Color
針對 imageoptim Xcode's built-in (de)optimization 中提到: COMPRESS_PNG_FILES = NO; 親測設定為 NO,還是會 recompress.
以下為選取了 10 張大圖做的測試,這個 10 張圖片使用 ImageOptim 壓縮過的,Assets.car 中他圖片是使用 cartool 開啟檢視檔案大小;未經過壓縮的圖片,不會出現這樣的原圖 和 ipa 中圖片大小不一樣的差異。

原理:量化相似的顏色,將 24-bit 的 PNG 圖片轉換成 8-bit 的 PNG 圖片 && 刪除不必要的元資料。 其中包括了 上文提到的刪除不必要元資料 && png24 -> png8 ,由上文可知只有減少顏色資料一個優化點會生效,官網的 70% 壓縮比也會大打折扣。 缺點:圖片降質,壓縮後需要設計師 check. 複製程式碼
可參考: tinypngMac Release 下載 註冊 tingpngMac AppKey
結論: (1)使用 imageoptim 無失真壓縮,放入 Assets.car 中的圖片壓縮後可以 100% recompress 到原圖大小,未放入 Assest.car 中的圖片沒有 100% recompress 到原圖大小; (2)未放入 Assets.car 中的 jpg 不受 recompress 影響會增大; (3)imageoptim 壓縮後的圖片放入 bundle 中,也不會受 recompress 無效,不會增大; (4)有失真壓縮有效,不過效果因為 recompress 效果大打折扣。
4. 分析 ipa 中的圖片大小佔用比例
針對上述的一刪二去三壓,三板斧過後就需要,靜下心來來分析一下目前的 ipa 包中的圖片大小數量組成。 通過對公司的 App 資料取樣分析,其中 4%的圖片數量佔據了 66%空間大小。 將這個 4% 的不放入 Assets.car && 只保留 3x 圖,使用 TestFlight 測試安裝包大小減少了 31 M, 繼續優化將這個 4% 得圖片刪除,或者轉網路下載以後安裝包大小優化更加可觀。 如果沒有類似的問題,可以忽略 複製程式碼
5. 轉網路下載
終極大招 還支援 iOS 8 的話,需要自己開發管理工具
從 iOS9 以後開始支援可以使用 On Demand Resources,網上介紹很多,不再贅述。
6. Build Settings 開啟 ASSETCATALOG_COMPILER_OPTIMIZATION space 空間優化
Build Settings -> ASSETCATALOG_COMPILER_OPTIMIZATION -> 開啟 space 可以優化 30%~40% 可以優化 Assets.car 大小 複製程式碼
7. XCode 10 vs XCode 9 Assets.car 的不同
使用 XCode 10 打包後 Assets.car 大小會比 Xcode 9 的大小大 30% 左右。正常現象,App Thinning 實際分發安裝包大小沒有變,通過測試公司 App Xcode 10 打包後,刪除 App 後重新安裝未使用大小比 AppStore 上下面顯示的安裝大小要小 10%。 "assets.car" size nearly doubled while using Xcode 10 GM seed
8. 針對統一圖片集中顏色,可以使用 Iconfont 字型圖示
優化策略
(1)優先使用網路下載; (2)充分使用 Asset Catalog,儘可能將圖片放入 Asset Catalog 中; (3)完成步驟 2 後,打包生成 ipa 包,分析 Assets.car 中是否存在有大圖,例如 20KB 以上; (4)步驟 3 之後存在大圖,如果使用 alpha 通道使用 tinypng 壓縮後放置 bundle 中只保留 3 倍圖供使用,如果可以只用 2 倍更好,沒有使用 alpha 通道的可以選擇轉 jpg 獲得更大壓縮空間。
工具篇
1. 快速統計工程中圖片數量 && 大小
# 顯示當前路徑的 .png && .jpg 圖片 $ find $PWD | egrep '\.(png|jpg)$' # 統計當前路徑的 .png && .jpg 圖片數量 $ find $PWD | egrep -c '\.(png|jpg)$' # 統計當前路徑的 .png && .jpg 圖片總大小(圖片命名不存在空格) $ find $PWD | egrep '\.(png|jpg)$' | xargs ls -l | awk '{print $5}' | awk '{sum1 += $1}END{print sum1}'. # 因為圖片命名不規範存在有空格,Linux 中預設使用空格分割,所以先輸出 .txt 再改變 $ find $PWD | egrep '\.(png|jpg)$' > OUTPUT_FILE_PATH.txt $ cat OUTPUT_FILE_PATH.txt | tr '\n' '\0' | xargs -0 ls -l | awk '{print $5}' | awk '{sum1 += $1}END{print sum1}'. # 不遞迴遍歷,只檢視當前目錄下圖片(-maxdepth 1 設定查詢深度) $ find $PWD -maxdepth 1 | egrep '\.(png|jpg)$' 複製程式碼
2. 檢視 Assets.car 中的檔案
方法一:cartool 解壓 Assets.car 檔案到指定路徑
# https://github.com/steventroughtonsmith/cartool # output_dir 得先建立 $ ./cartool /path/to/Assets.car /path/to/outputDirectory 複製程式碼
方法二:AssetCatalogTinkerer 可直接檢視 Assets.car 中的圖片
# https://github.com/insidegui/AssetCatalogTinkerer # http://stackoverflow.com/questions/22630418/analysing-assets-car-file-in-ios 複製程式碼
3. 判斷 png 圖片是否使用 Alpha
$ brew install imagemagick $ identify IMAGE_PATH# 檢視圖片資訊 $ identify -format %A IMAGE_PATH# Blend 使用 alpha 通道,Undefined 未使用 alpha 通道 複製程式碼