天天看點

iOS 本地圖檔優化實踐

删除無用圖檔、去重複、壓縮、分析、網絡下載下傳、Xcode 配置

優化方向

1. 删除無用圖檔

LSUnusedResources

缺點:
1. 不能解決子產品劃後,業務間的圖檔引用,删除謹慎; 
2. 使用 xcassest 管理資源圖檔,如果 .imageset 和圖檔名命名不統一的話,掃描失敗.
複制代碼
           
反其道而行之
(1) 通過 cartool 打開 Assets.car 中的檔案;
(2) 通過 find 檢索出所有資源圖檔;
(3) 通過腳本去周遊,可執行檔案中的 __TEXT,動态庫,jsbundle,xib 等檔案判斷 ipa 中的資源圖檔是否存在無用圖檔.
複制代碼
           
2. 建立公共資源庫,去除各子產品中的重複圖檔

fdupes

原理:大小比較 > 部分MD5簽名比較 > 全MD5簽名比較 > 位元組到位元組的比較

$ brew install fdupes    

$ fdupes -r ~/path                # 搜尋重複子檔案在終端展示
$ fdupes -Sr ~/path               # 搜尋重複子檔案&顯示每個重複檔案的大小在終端展示
$ fdupes -Sr ~/path > ~/log.txt   # log輸出到指定路徑檔案夾
複制代碼
           
3. 壓縮圖檔

無損壓縮 ImageOptim

無損壓縮,通過删除圖檔中不必要的中繼資料,實作優化圖檔大小
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 中圖檔大小不一樣的差異。

有損壓縮 tinypng

原理:量化相似的顔色,将 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

圖像處理 imagemagick

$ brew install imagemagick
$ identify IMAGE_PATH               # 檢視圖檔資訊
$ identify -format %A IMAGE_PATH    # Blend 使用 alpha 通道,Undefined 未使用 alpha 通道
複制代碼
           
4. 檢視ipa包的壓縮比
unzip -lv xxx.ipa
複制代碼
           

參考

  1. GMTC 上分享滴滴出行 iOS 端瘦身實踐的 Slides
  2. 幹貨|今日頭條iOS端安裝包大小優化—思路與實踐

轉載于:https://juejin.im/post/5c6826656fb9a049dc02c958