幹這個事的主要起始緣由是公司網太慢,內測包經過蒲公英分發給測試小夥伴們,而後因爲上傳到蒲公英的包不像appstore那樣按機型分發的,是包含全部資源文件的包,最終大小106.5M,公司網太慢致使測試小夥伴崩潰,強烈要求瘦身。最終呢,這個任務老大交給了我。git
開搞
先給你們看個人效果github
如今的ipa大小:106.5M算法
- 刪除不用的圖標後:95.3M
- 刪除不用的代碼後:95M
- 再次刪除刪完代碼後無用圖片:89.8M
- 壓縮圖片資源後:89.5M
- Optimization改成space後:89.1M
- 刪除flutter中未使用的的我的信息部分後:84.6M
- 刪除flutter中未使用的的文章落地頁部分後:84.4M
- 刪除我的信息頁本地的默認背景圖後:74.9M
- 經過otool工具對比__DATA,__objc_classlist(全部類)和 __DATA,__objc_classrefs (使用中的類),而後取差值再次篩選無用類刪除後:74.6M
完事從新覆盤下個人作法,以爲操做的順序不合適,有重複部分。xcode
建議的順序
刪代碼
我以前是先刪的無用圖片,可是刪除代碼後又會出來一批新的無用圖片,因此先刪代碼app
- 從項目遠嗎中查找未使用類
fui工具檢測沒用到的 import
代碼文件工具
由於運行時的緣由,還有爲了保險起見查找出來的類必定要逐個查找確認未使用才能刪除。測試
刪除了三百多個文件後ipa少了0.3M優化
- 從ipa二進制文件中查找未使用類
- 拿到.ipa文件後修改後綴爲.zip
- 解壓.zip
- 打開Payload文件夾下的.app後綴文件右鍵顯示包內容就能看到要操做的二進制文件
- 而後用otool -o 你的二進制文件路徑 > ~/Desktop/all.txt 就能將內容輸出到all.txt文件
打開all.txt就能看到一望無邊的類信息和方法信息等,想要靠手動將__DATA,__objc_classlist(全部類)和 __DATA,__objc_classrefs (使用中的類)的差集取出來是不可能的,而後想着上網上找個腳本作這件事,沒找到合適的,只找到了個應該是曾經能幹活可是如今不幹活的腳本,打開源碼看了下,應該是因爲如今的二進制文件格式變了致使的。ui
找到緣由就好弄了,我copy了一份,而後改了改,地址在這裏,而後就又獲得一部分未使用的類,而後在項目中查找確認未使用後,刪除。spa
此次找到了將近三百個文件,刪除後依然只減小了0.3M
刪圖片
代碼刪完了,能夠刪圖片了
檢測未使用的圖片
使用開源項目LSUnusedResources,能找出一大堆未使用圖片,保險起見仍是挨個搜索確認無用後再刪除(這一步比較累,由於圖片太多,不知道有沒有高效的方法)
刪完後在Assets.xcassets中將全部的1x圖所有刪掉,由於如今基本都用不上了
刪圖片資源效果就比較明顯,直接少了25.9M
壓縮圖片
使用的工具是imageoptim
壓縮的時候效果超級明顯,全部的圖片都有效果,可是打包後ipa只少了0.3M,很費解,後來查了查在頭條的文章中找到了這一段(在查閱了一些文檔後,咱們瞭解到,Xcode在構建的過程當中,有一個步驟叫作compile asset catalog。在這個步驟中,Xcode會自行對png圖片做壓縮,而且會壓縮成可以快速讀取渲染的格式。若是咱們對工程中的圖片進行了ImageOptim的壓縮,在compile asset catalog的過程當中,Xcode會用本身的算法從新壓縮,而這個」從新壓縮「的過程,至關於將ImageOptim的壓縮「回滾「了,極可能反而增大了圖片。),而後爲啥個人還有0.3M的效果呢,想一想應該是項目中有部分圖片不在Assets.xcassets中吧(猜想)。
修改xcode配置
- Optional Level-->Fastest,Smallest[-OS]
- Link-Time Optimization: 它是LLVM編譯器的一個特性,用於在 link 中間代碼時,對全局代碼進行優化。這個優化是自動完成的,所以不須要修改現有的代碼。蘋果使用了新的優化方式 Incremental,大大減小了連接的時間。
- Deployment Postprocessing、Strip Linked Product、Strip Debug Symbols During Copy、Symbols hidden by default四者設置爲YES後能夠去掉沒必要要的符號信息,減小可執行文件大小。但去除了符號信息以後咱們就只能使用dSYM來進行符號化了,因此須要將 Debug Information Format 修改成DWARF with dSYM file。
- Dead Code Stripping(僅對靜態語言有效):刪除靜態連接的可執行文件中未引用的代碼。Debug設置爲NO, Release設置爲YES可減小可執行文件大小。Xcode默認會開啓此選項,C/C++/Swift等靜態語言編譯器會在 link的時候移除未使用的代碼,可是對於Objective-C等動態語言是無效的。由於Objective-C是創建在運行時上面的,底層暴露給編譯器的都是Runtime源碼編譯結果,全部的部分應該都是會被判別爲有效代碼。
- Generate Debug Symbols(有做用但不建議修改): 當Generate Debug Symbols選項設置爲YES時,每一個源文件在編譯成.o文件時,編譯參數多了-g和-gmodules兩項。打包會生成symbols文件。設置爲NO則ipa中不會生成symbol文件,能夠減小ipa大小。但會影響到崩潰的定位。保持默認的開啓,不作修改。
- Optimization修改成space
這個試了不少,只有Optimization修改成space明顯少了0.4M
其餘
- LinkMap能夠得出每一個類或者庫所佔用的空間大小(代碼段+數據段),方便開發者快速定位須要優化的類或靜態庫 (用這個我找到了一個很是大的背景圖,2x的2M,3x的將近4M)刪除後效果很是明顯
- 還有就是能夠用LinkMap及otool找出未使用的方法,這個我沒作,後面有時間在改改腳本
綜上,其實瘦掉的大部分是廢棄的圖片資源佔得空間,因此我以爲團隊應該養成良好的習慣,廢棄代碼及圖片資源應該及時刪除,按期檢測清理垃圾文件,要否則日積月累,每一個版本一點點,最終就很大了。