ios安裝包優(yōu)化

對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分析工具

image.png
LinkMap使用說明.png

App瘦身checkList

image.png
參考圖片.png
編譯選項

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.無損壓縮圖片

代碼瘦身
  1. 已經(jīng)下線的陳舊代碼,AB試驗已經(jīng)下線的代碼
  2. 通過轉(zhuǎn)H5奋隶、Hybrid或者RN實現(xiàn)的Native功能俭驮,可以定期清理
  3. 一些非核心Hybrid或者RN模塊回溺,可以考慮不要打包進入APP,通過動態(tài)下發(fā)的方式獲取
  4. 代碼的重構混萝,UI組件遗遵、業(yè)務邏輯的重用等等
  5. 冗余字符串
    代碼上定義的所有靜態(tài)字符串都會記錄在在可執(zhí)行文件的__cstring段,如果項目里Log非常多逸嘀,這個空間占用也是可觀的车要,也有幾百K的大小,可以考慮清理所有冗余的字符串崭倘。另外如果有特別長的字符串翼岁,建議抽離保存成靜態(tài)文件,因為AppStore對可執(zhí)行文件加密導致壓縮率低司光,特別長的字符串抽離成靜態(tài)資源文件后壓縮率會比在可執(zhí)行文件里高很多登澜。

資源瘦身

1、刪除無用的圖片文件

LSUnusedResources查找無用的圖片文件

image.png
2飘庄、重復的圖片文件

重復資源(主要指圖片)不是指命名重復而是內(nèi)容相同脑蠕。
Duplicate Photo Finder(App Store有免費下載)

image.png

fdupes 是Linux下的一個工具,可以在指定的目錄及子目錄中查找重復的文件跪削。
fdupes通過對比文件的MD5簽名谴仙,以及逐字節(jié)比較文件來識別重復內(nèi)容。

項目中圖片目錄碾盐,如 Assets.xcassetsimages文件夾晃跺,所以:

brew install fdupes
fdupes -r xxx/images xxx/Images.xcassets
3、無損壓縮圖片

ImageOptim進行png文件的無損壓縮
注意:
實際生產(chǎn)的安裝包體積沒有變小毫玖,因為COMPRESS_PNG_FILESSTRIP_PNG_TEXT設置成了YES掀虎,Xcode會重新壓縮一次圖片凌盯,但是壓縮之后的圖反而比ImageOptim處理之后的圖更大。改成NO就能讓項目中的PNG保持不變烹玉。如果搜不到驰怎,手動添加一下。

image.png

image.png

image.png
4二打、WebP圖片壓縮

WebP轉(zhuǎn)換工具 | iOS性能之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
image.png
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

image

2栏笆、查看未使用方法 Run Inspection by Name:Unused declaration
包含了項目里面聲明了沒用使用過的變量,方法
對于檢測的內(nèi)容,idea提供四種解決方案

image

3梯啤、查看類中有未使用引用 Run Inspection by Name:Unused import

image

可以參考AppCode inspections for your code perfection

2竖伯、清除無用代碼
01. AppCode搜索出來的無用的Class,會有誤報需要仔細檢查每一個報錯的代碼因宇。
02. 使用Fui查找發(fā)現(xiàn)無用文件七婴,可以用于查找無用的import,同時也提供xcfui 可以和Xcode集成察滑。

fui使用

清除無用類
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項目中無用的方法,支持一鍵清理饲化。

image.png

注意點:

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和arm64

    lipo 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
    
eg.png
image.png
image.png

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 下載大小

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宴杀,隨后出現(xiàn)的幾起案子癣朗,更是在濱河造成了極大的恐慌,老刑警劉巖旺罢,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旷余,死亡現(xiàn)場離奇詭異,居然都是意外死亡扁达,警方通過查閱死者的電腦和手機正卧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跪解,“玉大人炉旷,你說我怎么就攤上這事』荻簦” “怎么了砾跃?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵骏啰,是天一觀的道長节吮。 經(jīng)常有香客問我,道長判耕,這世上最難降的妖魔是什么透绩? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮壁熄,結果婚禮上帚豪,老公的妹妹穿的比我還像新娘。我一直安慰自己草丧,他們只是感情好狸臣,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昌执,像睡著了一般烛亦。 火紅的嫁衣襯著肌膚如雪诈泼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天煤禽,我揣著相機與錄音铐达,去河邊找鬼。 笑死檬果,一個胖子當著我的面吹牛瓮孙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播选脊,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼杭抠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恳啥?” 一聲冷哼從身側響起祈争,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎角寸,沒想到半個月后菩混,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡扁藕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年沮峡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亿柑。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡邢疙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出望薄,到底是詐尸還是另有隱情疟游,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布痕支,位于F島的核電站颁虐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏卧须。R本人自食惡果不足惜另绩,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望花嘶。 院中可真熱鬧笋籽,春花似錦、人聲如沸椭员。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隘击。三九已至侍芝,卻和暖如春喘沿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竭贩。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工蚜印, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人留量。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓窄赋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親楼熄。 傳聞我的和親對象是個殘疾皇子忆绰,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359