談談 iOS 包瘦身方案
theme: smartblue
「這是我參與2022首次更文挑戰的第21天,活動詳情檢視:2022首次更文挑戰」。
包瘦身方案
相信大家都會遇到隨著專案需求的變化,工程中的程式碼和資原始檔會伴隨著增長,很多時候,我們都不會輕易的去刪除某些程式碼,或者資原始檔。但是這樣帶來的代價就是包的體積越來越大。
當包的體積超過 200MB
時,那麼就引起了資料部門的注意,資料部門分析新使用者的減少可能跟應用商店包大小超限,使用者流量無法下載的問題所致。那麼此時再去做包大小優化意味著我們就會流失很多新使用者,並且也會拉高我們的新使用者成本。所以包大小優化不能在問題發生後再去做,應該及時去做,當下就該做,我們也應該把 200MB
看成“紅線”。
接下來我們看看包大小優化有哪些方案:
首先,就是資原始檔優化
,這種方案在瘦包上最容易看到成效,如果你的包大小急需要瘦身,不妨先試試這個。資原始檔優化你可以從圖片資源壓縮
、無用資源檢查
、資原始檔上傳
中入手,或者使用官方提供的App Thinning
。
其次,是程式碼檔案優化
, 程式碼檔案優化 投入時間可能要比資原始檔優化的時間長很多,而且成效沒有那麼明顯。但是程式碼檔案優化可以檢查很多無用程式碼,以及刪除很多不必要檔案,清理專案結構,使專案可持續性維護。
資原始檔優化
相比較而言,資源優化的時間是最快的,成果是最好的,我們只需要做好平時的資源壓縮處理,定期清理無用資源,做好資原始檔合理分配,那麼包體積大小就不會太大。
圖片資源壓縮
圖片壓縮我們可以選擇的工具其實有很多,重點就是要注意檢查壓縮的圖片資源會不會在顯示上有問題。工具推薦: ImageOptim 、圖壓 。
圖片資源壓縮也有很多公司使用webp
格式圖片,這種格式對比png
、jpg
要小很多,但客戶端效能對解碼webp
圖片會有一定的影響。在一些老的機型上,表現不是很好。所以需要做一些取捨。這裡有webp
和png
格式轉換的工具 isparta
其實我覺得這兩種方案可以共存,團隊內部設定一個資原始檔的最大值,比如超過 100KB
就選擇使用 webp
格式的圖片,小於 100KB
就使用壓縮工具。這樣就可以極大的減少資原始檔的大小,同時減少包的體積。
無用資源檢查
無用資源檢查可以通過工具 LSUnusedResources。
刪除無用圖片的過程,可以概括為下面幾步操作。
- 通過
find
命令獲取 App 安裝包中的所有資原始檔,比如find /Users/daiming/Project/ -name
。 - 設定用到的資源的型別,比如
jpg、gif、png、webp
。 - 使用正則匹配在原始碼中找出使用到的資源名,比如 pattern = @"@"(.+?)""。
- 使用
find
命令找到的所有資原始檔,再去掉程式碼中使用到的資原始檔,剩下的就是無用資源了。 - 對於按照規則設定的資源名,我們需要在匹配使用資源的正則表示式裡新增相應的規則,比如 @“image_%d”。
- 確認無用資源後,就可以對這些無用資源執行刪除操作了。這個刪除操作,你可以使用
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 Slicing
、Bitcode
、On-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
如果在專案中使用很多第三方庫,你還需要檢查是否匯入了相同的功能的庫,避免匯入過多的庫而造成資源過大。
有時候有些第三方庫大小佔比很高的時候,你也需要去思考是否要替換掉它。
- LeetCode 初級演算法之陣列(上),看看你都學會了嗎?
- LeetCode 初級演算法之連結串列,看看你都學會了嗎?
- LeetCode 初級演算法之字串(上),看看你都學會了嗎?
- 純程式碼佈局,也可以一樣的簡潔
- UIStackView之一問一答
- 使用UIStackView來簡化iOS的介面佈局
- 夏天來了,iOS開發者們該如何減少App耗電?(上)
- 夏天來了,App開發者們如何看待手機發燙問題?
- 聊聊iOS中UITableView複用的那些事
- 曾經經典的微信打飛機遊戲還有人記得嗎?
- iOS 原生渲染與 Flutter 有什麼區別 (上)
- 瞭解 Mach-O檔案
- CocoaPods中podsepc檔案設定詳解
- iOS 原生渲染與 Flutter 有什麼區別 (下)
- 簡單瞭解 iOS CVPixelBuffer (上)
- 談談 iOS 包瘦身方案
- 播放器重構的探索之路
- 如何使用CocoaPods製作私有庫
- iOS 元件化方案