iOS開發中Mach-O的體積優化2
這是我參與11月更文挑戰的第11天,活動詳情檢視:2021最後一次更文挑戰。
Code Generation Options
程式碼生成約定的選項:
1. None[-00]
不優化:
在這種設定下, 編譯器的目標是降低編譯消耗,保證除錯時輸出期望的結果。程式的語句之間是獨立的:如果在程式的停在某一行的斷點出,我們可以給任何變數賦新值抑或是將程式計數器指向方法中的任何一個語句,並且能得到一個和原始碼完全一致的執行結果。
2. Fast[-01]
大函式所需的編譯時間和記憶體消耗都會稍微增加:
在這種設定下,編譯器會嘗試減小程式碼檔案的大小,減少執行時間,但並不執行需要大量編譯時間的優化。在蘋果的編譯器中,在優化過程中,嚴格別名,塊重排和塊間的排程都會被預設禁止掉。此優化級別提供了良好的除錯體驗,堆疊使用率也提高,並且程式碼質量優於None[-O0]。
3. Faster[-02]
編譯器執行所有不涉及時間空間交換的所有的支援的優化選項:
是更高的效能優化Fast[-O1]。
在這種設定下,編譯器不會進行迴圈展開、函式內聯或暫存器重新命名。和Fast[-O1]項相比,此設定會增加編譯時間,降低除錯體驗,並可能導致程式碼大小增加,但是會提高生成程式碼的效能。
4. Fastest[-03]
在開啟Fast[-01]
項支援的所有優化項的同時,開啟函式內聯和暫存器重新命名選項:
是更高的效能優化Faster[-O2],指示編譯器優化所生成程式碼的效能,而忽略所生成程式碼的大小,有可能會導致二進位制檔案變大。還會降低除錯體驗。
5. Fastest, Smallest[-Os]
在不顯著增加程式碼大小的情況下儘量提供高效能:
這個設定開啟了Fast[-O1]項中的所有不增加程式碼大小的優化選項,並會進一步的執行可以減小程式碼大小的優化。增加的程式碼大小小於Fastest[-O3]。與Fast[-O1]相比,它還會降低除錯體驗。
6. Fastest, Aggressive, Optimizations[-Ofast]
與Fastest, Smallest[-Os]
相比該級別還執行其他更激進的優化:
這個設定開啟了Fastest[-O3]中的所有優化選項,同時也開啟了可能會打破嚴格編譯標準的積極優化,但並不會影響執行良好的程式碼。該級別會降低除錯體驗,並可能導致程式碼大小增加。
7. Smallest, Aggressive Size Optimizations [-Oz]
不使用LTO
的情況下減小程式碼大小:
與-Os相似,指示編譯器僅針對程式碼大小進行優化,而忽略效能優化,這可能會導致程式碼變慢。
總結:
strip
strip
:移除指定符號。在Xcode
中預設strip
是在Archive
的時候才會生效,移除對應符號。 \
strip -x
:除了全域性符號都可以移除 (動態庫使用)\
strip -S
:移除除錯符號(靜態庫使用) \
strip
:除了間接符號表中使用的符號,其他符號都移除(上架App使用)
- Deployment Postprocessing
的英文原意是:
If enabled, indicates that binaries should be stripped and file mode, owner, and group information should be set to standard values.
也就是開啟後,在編譯階段就會執行strip
。
- Strip Debug Symbols During Copy
的英文原意是:
Specifies whether binary files that are copied during the build, such as in a Copy Bundle Resources or Copy Files build phase, should be stripped of debugging symbols. It does not cause the linked product of a target to be stripped。
通俗來講,就是當你的應用在編譯階段copy
了某些二進位制檔案時,開啟該選項會脫掉該二進位制的除錯符號。但是不會脫去連結的最終產物(可執行檔案\動態庫)的符號資訊。要脫去連結的產物(App的可執行檔案)的符號資訊。
Strip Linked Product
的英文原意是:
If enabled, the linked product of the build will be stripped of symbols when performing deployment postprocessing.
如果沒有開啟Deployment Postprocessing
,則會在Archive
處理連結的最終產物(可執行檔案)的符號資訊。否則,在連結完成之後就會處理符號資訊。
檢視App Size報告
- 方式一:通過App Store Connect提供準確的App大小;
- 方式二:通過Xcode內建報告工具,建立App尺寸報告
- Archive App
- 通過
Ad Hoc
、Development
或者Enterprise
等分發方式匯出Archive App
; - 在設定開發分發選項的列表中,選擇
All compatible device variants
以進行應用程式精簡,然後啟用Rebuild from Bitcode
; - 簽名並且匯出。 此過程將建立一個包含App的資料夾,裡面有:
- 一個
Universal IPA
,包含多個平臺的資原始檔和二進位制程式; - 一個
Thinned IPA
,指定平臺的資原始檔和二進位制程式。 同時還包含一個App Thinning Size Report.txt
,裡面詳細記錄了App
的體積佔用情況:
``` App Thinning Size Report for All Variants of ExampleApp
Variant: ExampleApp.ipa Supported variant descriptors: [device: iPhone11,4, os-version: 12.0], [device: iPhone9,4, os-version: 12.0], [device: iPhone10,3, os-version: 12.0], [device: iPhone11,6, os-version: 12.0], [device: iPhone10,6, os-version: 12.0], [device: iPhone9,2, os-version: 12.0], [device: iPhone10,5, os-version: 12.0], [device: iPhone11,2, os-version: 12.0], and [device: iPhone10,2, os-version: 12.0] App + On Demand Resources size: 6.7 MB compressed, 18.6 MB uncompressed App size: 6.7 MB compressed, 18.6 MB uncompressed On Demand Resources size: Zero KB compressed, Zero KB uncompressed
// Other Variants of Your App. ``` - 方式三:通過指令碼的方式指定輸出App Size報告:
xcodebuild -exportArchive -archivePath iOSApp.xcarchive -exportPath Release/MyApp -exportOptionsPlist OptionsPlist.plist
- iOS之資料結構與演算法面試題2
- iOS之字串拷貝
- iOS之動態庫與靜態庫的實戰配置
- iOS之Dispatch Semaphore與NSThread runloop實現常駐執行緒
- iOS之xcconfig編寫指南
- iOS之OC與JS的互動(iOS與H5混編)
- iOS之認識Shell2-常用的命令參考1
- iOS之認識Shell-1
- iOS開發中Mach-O的體積優化2
- iOS開發中Mach-O的體積優化
- iOS中runtime如何實現weak變數的自動置nil和SideTable是什麼?
- iOS中的迴圈引用
- iOS之網路相關4:TCP和UDP
- iOS之網路相關3:HTTPS
- iOS之網路相關2:HTTP的通訊過程
- iOS之網路相關1:HTTP協議
- iOS逆向探究3:狀態暫存器
- iOS逆向探究2:彙編初探2
- iOS逆向探究1:彙編初探1
- iOS小知識之底層問題探索