對iOS安裝包瘦身是很多App都必須要做的事,一般首先會對資源文件下手汁掠,壓縮圖片/音頻,去除不必要的資源集币。這些資源優(yōu)化做完后考阱,我們還可以嘗試對可執(zhí)行文件進行瘦身,項目越大鞠苟,可執(zhí)行文件占用的體積越大乞榨,又因為AppStore會對可執(zhí)行文件加密,導致可執(zhí)行文件的壓縮率低当娱,壓縮后可執(zhí)行文件占整個APP安裝包的體積比例大約有80%~90%吃既,優(yōu)化還是有意義的。
分析ipa文件:iOS可執(zhí)行文件的組成
通過生成LinkMap文件跨细,分析源代碼生成的編譯文件的大小鹦倚。在Build Settings中Write Link Map File設置為Yes (記住release時候不要設置為Yes)。
編譯之后會在build目錄中生成兩個LinkMap文件: XXX-LinkMap-normal-i386和XXX-LinkMap-normal-x86_64冀惭,分別代表在模擬器中32位和64位指令集生成的LinkMap文件震叙。
LinkMap的文件詳細結構解釋
LinkMap會包含每個可執(zhí)行文件的偏移量及大小,所以可以很方便的知道每個可執(zhí)行文件的大小散休。
編譯目錄文件:~/Library/Developer/Xcode/DerivedData/XXX-eumsvrzbvgfofvbfsoqokmjprvuh/Build/Intermediates/XXX.build/Debug-iphoneos/XXX.build/
LinkMap分析工具
App瘦身checkList
編譯選項
1.編譯器優(yōu)化級別
- Optimization Level 使用Fastest, Smalllest
該選項對安裝包大小影響幾無媒楼,但可以提高app的性能。參考wwdc 2013-Session408 Optimize Your Code Using LLVM - Strip Linked Product 設置為YES
需要注意的是Strip Linked Product也受到Deployment Postprocessing設置選項的影響戚丸。
在Build Settings中匣砖,我們可以看到, Strip Linked Product是在Deployment這欄中的,而Deployment Postprocessing相當于是Deployment的總開關猴鲫。記得把Deployment Postprocessing也設置為YES对人, 該選項對安裝包大小的影響非常大。
PS:Deployment Postprocessing這個配置項如果使用xcode打包拂共,xcode會默認把這個變量置為YES牺弄, 如果使用腳本打包,記得設置宜狐。 - Symbols Hidden by Default設置為YES
- Make Strings Read-Only 設置為YES
-
Bitcode
設置為YES( ps:注意項目中的靜態(tài)庫势告,三方庫等是否支持顷链,有一個不支持就用不了臀玄,推不動別人改~~~)
關于bitcode, 知道這些就夠了
iOS framework如何支持bitcode以及bitcode檢測
資源瘦身:
1.清理無用圖片
2.清理重復圖片
3.無損壓縮圖片
代碼瘦身
- 已經(jīng)下線的陳舊代碼,AB試驗已經(jīng)下線的代碼
- 通過轉(zhuǎn)H5奋隶、Hybrid或者RN實現(xiàn)的Native功能俭驮,可以定期清理
- 一些非核心Hybrid或者RN模塊回溺,可以考慮不要打包進入APP,通過動態(tài)下發(fā)的方式獲取
- 代碼的重構混萝,UI組件遗遵、業(yè)務邏輯的重用等等
- 冗余字符串
代碼上定義的所有靜態(tài)字符串都會記錄在在可執(zhí)行文件的__cstring段,如果項目里Log非常多逸嘀,這個空間占用也是可觀的车要,也有幾百K的大小,可以考慮清理所有冗余的字符串崭倘。另外如果有特別長的字符串翼岁,建議抽離保存成靜態(tài)文件,因為AppStore對可執(zhí)行文件加密導致壓縮率低司光,特別長的字符串抽離成靜態(tài)資源文件后壓縮率會比在可執(zhí)行文件里高很多登澜。
資源瘦身
1、刪除無用的圖片文件
LSUnusedResources查找無用的圖片文件
2飘庄、重復的圖片文件
重復資源(主要指圖片)不是指命名重復而是內(nèi)容相同脑蠕。
Duplicate Photo Finder(App Store有免費下載)
fdupes 是Linux下的一個工具,可以在指定的目錄及子目錄中查找重復的文件跪削。
fdupes通過對比文件的MD5簽名谴仙,以及逐字節(jié)比較文件來識別重復內(nèi)容。
項目中圖片目錄碾盐,如 Assets.xcassets
和images
文件夾晃跺,所以:
brew install fdupes
fdupes -r xxx/images xxx/Images.xcassets
3、無損壓縮圖片
ImageOptim進行png文件的無損壓縮
注意:
實際生產(chǎn)的安裝包體積沒有變小毫玖,因為COMPRESS_PNG_FILES
和STRIP_PNG_TEXT
設置成了YES掀虎,Xcode會重新壓縮一次圖片凌盯,但是壓縮之后的圖反而比ImageOptim處理之后的圖更大。改成NO就能讓項目中的PNG保持不變烹玉。如果搜不到驰怎,手動添加一下。
4二打、WebP圖片壓縮
WebP是Google提供的一種圖片編碼格式县忌,通常情況下WebP格式的圖片是原始JPG/PNG圖片的1/3,所以對于重度依賴圖片顯示的應用继效,轉(zhuǎn)換使用WebP可以節(jié)省大量的網(wǎng)絡傳輸數(shù)據(jù)和時間症杏。對于APP瘦身,使用WebP格式可能是一種方式瑞信,可以使用WebP格式的圖片替代現(xiàn)有的圖片資源厉颤,可以一定程度的節(jié)省空間。
注:iOS原生并不支持WebP格式加載凡简,需要引入SDWebImage/WebP
Webp劣勢:(慎用)
- 壓縮時間長逼友,大概是png的8倍左右(不過一般都是在服務端壓縮,客戶端解碼潘鲫,所以服務端可以做個預壓縮)
- 解碼時間比png長翁逞,大概幾十毫秒肋杖。WebP是節(jié)省了流量(圖片懈嚷亍),增加了解碼時間状植,換句話說就是:同樣的圖片浊竟,網(wǎng)絡越快(圖片更小的WebP就沒有明顯優(yōu)勢),圖片越多(WebP要解碼)津畸,WebP比png要慢振定。
- UIWebView,WKWebView都不支持WebP肉拓。(UIWebView可以用NSUrlProtocol來解決后频,但是WKWebView還沒有太完美的辦法,誰知道的請告訴我下)
- 不支持流式解壓縮(即圖片加載的時候會由模糊慢慢變清晰的過程暖途,WebP貌似不支持這種解壓縮方式)
5卑惜、AppThinning
方式一:安裝npm包(需要查看文檔,安裝node環(huán)境)
npm i appthinning -g
方式二:克隆源碼驻售,直接參考文檔
使用:
appthinning -d "/Users/catchzeng/Desktop/test" -t "png|jpg" -s 1000 -m 2000 -c imageOptim
6露久、AssetCatalogTinkerer
AssetCatalogTinkerer 是一款開源的查看和提取 car 文件中的圖片工具。
導出所有圖片后欺栗,就可以根據(jù)大小排序找到大文件毫痕,進行對應的壓縮處理征峦。
代碼瘦身
1、AppCode代碼靜態(tài)檢查
AppCode提供了非常強大的代碼靜態(tài)檢查工具
1.Inspect Code:檢查代碼
2.Code Cleanup:代碼清除
3.Silent Code Cleanup:無聲代碼清理
4.Run Inspection by Name:自動檢查清除冗余資源
5.Configure Current File Analysis:配置當前文件分析
6.View Offline Inspection Results:查看離線檢查結果
7.Infer Nullity:推斷出無效
8.Locate Duplicates:查找重復
9.Show Coverage Data:顯示覆蓋數(shù)據(jù)
10.Analyze Dependencies :分析依賴性
11.Analyze Backward Dependencies :分析落后的依賴關系
12.Analyze Module Dependencies:分析模塊依賴關系
13.Analyze Dependency Matrix:分析從屬矩陣關系
14.Analyze Cyclic Dependencies:分析循環(huán)依賴關系
15.Analyze Data Flow to Here :分析到這里的數(shù)據(jù)流
16.Analyze Data Flow from Here :從這里分析數(shù)據(jù)流
17.Analyze Stack Trace :分析堆棧追蹤
自動檢查清除冗余資源詳細功能Name對應Idea中Preferences—>Editors—>Inspections中所有內(nèi)容
1消请、清理無效類 Run Inspection by Name:Empty Class
2栏笆、查看未使用方法 Run Inspection by Name:Unused declaration
包含了項目里面聲明了沒用使用過的變量
,方法
和類
對于檢測的內(nèi)容,idea提供四種解決方案
3梯啤、查看類中有未使用引用 Run Inspection by Name:Unused import
可以參考AppCode inspections for your code perfection
2竖伯、清除無用代碼
01. AppCode搜索出來的無用的Class,會有誤報需要仔細檢查每一個報錯的代碼因宇。
02. 使用Fui查找發(fā)現(xiàn)無用文件七婴,可以用于查找無用的import,同時也提供xcfui 可以和Xcode集成察滑。
清除無用類
fui find
fui --path=~/source/project/Name --ignore-path=Pods --ignore-path=Libraries find
- 清除無用的Import
fui -g --path=~/source/project/Name --ignore-path=Pods find
fui -l --path=~/source/project/Name --ignore-path=Pods find
03. SMCheckProject使用
由于clang插件檢索出的無用方法沒法確定能夠直接刪除打厘,還需要挨個檢索人工判斷是否可以刪除,這樣每次要清理是需要人工排查一遍是非常耗時耗力的贺辰。這里推薦一個使用Swift3寫的MacOS程序户盯,這個工具可以很方便快捷的找出工程項目下未被調(diào)用的方法可以檢測出objc項目中無用的方法,支持一鍵清理饲化。
注意點:
01:編譯工程:作者的swift版本是3.0 2020.12.12 swift需要支持5.0
01.png
02.png
02:項目中路徑fix
03:語法錯誤莽鸭,根據(jù)提示fix一下
04: 工程路徑需要寫對,不然找不到具體的類吃靠。
05: 一鍵清理的時候語法報錯:改成 URL(fileURLWithPath:mFilePath)
06:清理的方法有可能是子類繼承硫眨,category,base類巢块,potocol礁阁,有的拼接的方法。需要自己再仔細確認一下族奢。
(瘦身收益不大姥闭,還容易出問題,謹慎刪除)
04 . 查找相似的代碼:SameCodeFinder可以查找到相似的代碼越走,最后一位數(shù)字代表兩個文件的海明距離棚品,數(shù)字越小說明兩個文件越類似。
清除無用的Method
xib/stroyboard替換
無用三方庫刪除
-
靜態(tài)庫瘦身
暫時還沒選擇廊敌,可以參考文章iOS APP安裝包瘦身實踐
項目中多少都會引入一些第三方靜態(tài)庫铜跑,通過lipo
工具可以查看支持的指令集,比如:
lipo -info libWeChatSDK.a
i386,x86_64,這不是模擬器的指令集么庭敦?去掉看能不能減少體積疼进?armv7可以兼容armv7s,armv7s也可以刪了秧廉,只保留armv7和arm64lipo libWeChatSDK.a -thin armv7 -output libWeChatSDK-armv7.a lipo libWeChatSDK.a -thin arm64 -output libWeChatSDK-arm64.a lipo create libWeChatSDK-armv7.a libWeChatSDK-arm64.a -output libWeChatSDK-device.a ls -ll -rw-r--r-- 1 Vic staff 5957080 Jan 6 14:40 libWeChatSDK-device.a -rw-r--r-- 1 Vic staff 14410376 Nov 25 11:53 libWeChatSDK.a
ipa優(yōu)化了5M左右伞广。大部分是圖片資源拣帽,和無用的文件。
參考文章
iOS可執(zhí)行文件瘦身
iOS APP瘦身實踐嚼锄,資源優(yōu)化减拭、編譯器配置優(yōu)化、可執(zhí)行文件優(yōu)化
滴滴出行iOS端瘦身實踐, 提供了查找無用圖片的工具区丑、WebP圖片壓縮拧粪、基于clang plugin實現(xiàn)查找無用代碼、查找類似代碼
基于clang插件的一種iOS包大小瘦身方案
檢測出objc項目中無用方法沧侥,然后一鍵全部清理
lipo command(Mac)
iOS APP分析無用代碼
iOS 安裝包瘦身 (上篇)
iOS 安裝包瘦身(下篇)
AppCode使用技巧(一)——Inspections
AppCode使用技巧(二)——Completion
AppCode使用技巧(三)——實時模板
AppCode使用技巧(四)——搜索和導航
優(yōu)化安裝包大小
iOS APP應用包瘦身綜合實踐小結
工具篇——idea的清理無效代碼
今日頭條優(yōu)化實踐: iOS 包大小二進制優(yōu)化可霎,一行代碼減少 60 MB 下載大小