談談 iOS 包瘦身方案

語言: CN / TW / HK

theme: smartblue

「這是我參與2022首次更文挑戰的第21天,活動詳情查看:2022首次更文挑戰」。

包瘦身方案

相信大家都會遇到隨着項目需求的變化,工程中的代碼和資源文件會伴隨着增長,很多時候,我們都不會輕易的去刪除某些代碼,或者資源文件。但是這樣帶來的代價就是包的體積越來越大。

當包的體積超過 200MB 時,那麼就引起了數據部門的注意,數據部門分析新用户的減少可能跟應用商店包大小超限,用户流量無法下載的問題所致。那麼此時再去做包大小優化意味着我們就會流失很多新用户,並且也會拉高我們的新用户成本。所以包大小優化不能在問題發生後再去做,應該及時去做,當下就該做,我們也應該把 200MB 看成“紅線”。

接下來我們看看包大小優化有哪些方案:

首先,就是資源文件優化,這種方案在瘦包上最容易看到成效,如果你的包大小急需要瘦身,不妨先試試這個。資源文件優化你可以從圖片資源壓縮無用資源檢查資源文件上傳中入手,或者使用官方提供的App Thinning

其次,是代碼文件優化, 代碼文件優化 投入時間可能要比資源文件優化的時間長很多,而且成效沒有那麼明顯。但是代碼文件優化可以檢查很多無用代碼,以及刪除很多不必要文件,清理項目結構,使項目可持續性維護。

資源文件優化

相比較而言,資源優化的時間是最快的,成果是最好的,我們只需要做好平時的資源壓縮處理,定期清理無用資源,做好資源文件合理分配,那麼包體積大小就不會太大。

圖片資源壓縮

圖片壓縮我們可以選擇的工具其實有很多,重點就是要注意檢查壓縮的圖片資源會不會在顯示上有問題。工具推薦: ImageOptim圖壓

圖片資源壓縮也有很多公司使用webp格式圖片,這種格式對比pngjpg要小很多,但客户端性能對解碼webp圖片會有一定的影響。在一些老的機型上,表現不是很好。所以需要做一些取捨。這裏有webppng格式轉換的工具 isparta

其實我覺得這兩種方案可以共存,團隊內部設定一個資源文件的最大值,比如超過 100KB 就選擇使用 webp格式的圖片,小於 100KB 就使用壓縮工具。這樣就可以極大的減少資源文件的大小,同時減少包的體積。

無用資源檢查

無用資源檢查可以通過工具 LSUnusedResources

刪除無用圖片的過程,可以概括為下面幾步操作。

  1. 通過 find 命令獲取 App 安裝包中的所有資源文件,比如 find /Users/daiming/Project/ -name
  2. 設置用到的資源的類型,比如 jpg、gif、png、webp
  3. 使用正則匹配在源碼中找出使用到的資源名,比如 pattern = @"@"(.+?)""。
  4. 使用 find 命令找到的所有資源文件,再去掉代碼中使用到的資源文件,剩下的就是無用資源了。
  5. 對於按照規則設置的資源名,我們需要在匹配使用資源的正則表達式裏添加相應的規則,比如 @“image_%d”。
  6. 確認無用資源後,就可以對這些無用資源執行刪除操作了。這個刪除操作,你可以使用 NSFileManger 系統類提供的功能來完成。

需要注意的是:在使用的過程中,你需要檢查有些資源文件後綴是否有拼接上的,如“home_btn_normal”,“home_btn_select” 或者 “bg_1”,“bg_2” 就按照第5步去添加相關正則表達式來檢查這種資源文件。

資源文件上傳

如果涉及到的資源文件還是有很多的時候,那麼我們可以考慮合理的將某些資源文件上傳至服務器,有服務器下發至移動端。這種方案通常需要多個端來統一制定方案,從而達到最大化的利用。

App Thinning

蘋果公司推出 App Thinning 是為了解決用户下載 App 耗費過高流量的問題,同時還可以節省用户 iOS 設備的存儲空間。

App Thinning 會專門針對不同的設備來選擇只適用於當前設備的內容以供下載。比如,iPhone 8 只會下載 2x 分辨率的圖片資源,iPhone 8plus 則只會下載 3x 分辨率的圖片資源。

App Thinning 有三種方式,包括:App SlicingBitcodeOn-Demand Resources

  • App Slicing,會在你向 iTunes Connect 上傳 App 後,對 App 做切割,創建不同的變體,這樣就可以適用到不同的設備。

  • Bitcode ,是針對特定設備進行包大小優化,優化不明顯。

  • On-Demand Resources,主要是為遊戲多關卡場景服務的。它會根據用户的關卡進度下載隨後幾個關卡的資源,並且已經過關的資源也會被刪掉,這樣就可以減少初裝 App 的包大小。

那麼,如何在你項目裏使用 App Thinning 呢?其實,這裏的大部分工作都是由 Xcode 和 App Store 來幫你完成的,你只需要通過 Xcode 添加 xcassets 目錄,然後將圖片添加進來即可。

代碼文件優化

代碼文件優化其實也可以看成是對可執行文件 Mach-O 的優化,其大小是由代碼量來決定的。所以對 Mach-O 瘦身 其實就是查找並減少無用的代碼。

無用代碼檢查

使用 AppCode 分析

無用代碼一般也可以使用簡單的工具來檢查,如 AppCode,當然如果代碼量過大,可能這個會分析不過來。據説百萬行代碼可能會吃不消。

AppCode 做分析的方法很簡單,直接在 AppCode 裏選擇 Code -> Inspect Code 就可以進行靜態分析。靜態分析完以後,我們可以在 Unused code 裏看到所有的無用代碼。

雖然可以檢測出很多無用代碼,但這些並不準確,所以還需要人工二次確認才能夠安全刪除掉。

分析 Mach-O 文件

還有一種就是分析 Mach-O文件,使用MachOView 這個軟件來查看Mach-O 文件裏的信息,然後依據 Mach-O 文件的 __objc_selrefs__objc_classrefs__objc_superrefs 來查看使用過的類和子類。

這種查看方法也不是完美的,原因在於, Objective-C 是門動態語言,方法調用可以寫成在運行時動態調用,這樣就無法收集全所有調用的方法和類。所以,我們通過這種方法找出的無用方法和類就只能作為參考,還需要二次確認。

減少第三方SDK

如果在項目中使用很多第三方庫,你還需要檢查是否導入了相同的功能的庫,避免導入過多的庫而造成資源過大。

有時候有些第三方庫大小佔比很高的時候,你也需要去思考是否要替換掉它。