談談 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

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

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