縮減iOS安裝包大小是很多中大型APP都要做的事,一般首先會對資源文件下手,壓縮圖片/音頻,去除不必要的資源。這些資源優(yōu)化做完后,我們還可以嘗試對可執(zhí)行文件進(jìn)行瘦身,項(xiàng)目越大,可執(zhí)行文件占用的體積越大,又因?yàn)锳ppStore會對可執(zhí)行文件加密,導(dǎo)致可執(zhí)行文件的壓縮率低,壓縮后可執(zhí)行文件占整個(gè)APP安裝包的體積比例大約有80%~90%,還是挺值得優(yōu)化的。下面介紹一下在研究可執(zhí)行文件過程中發(fā)現(xiàn)的可以優(yōu)化的點(diǎn)。研究的過程使用了linkmap,linkmap的介紹跟生成可以參考另一篇文章—iOS可執(zhí)行文件的組成。
編譯器優(yōu)化級別設(shè)置
Build Settings->Optimization Level有幾個(gè)編譯優(yōu)化選項(xiàng),release版應(yīng)該選擇Fastest, Smalllest,這個(gè)選項(xiàng)會開啟那些不增加代碼大小的全部優(yōu)化,并讓可執(zhí)行文件盡可能小。
去除不必要的調(diào)試符號信息
Strip Linked Product , Deployment Postprocessing, Symbols Hidden by Default 在release版本應(yīng)該設(shè)為yes,可以去除不必要的調(diào)試符號。Symbols Hidden by Default會把所有符號都定義成”private extern”,詳細(xì)信息見官方文檔。
這些選項(xiàng)目前都是XCode里release的默認(rèn)選項(xiàng),但舊版XCode生成的項(xiàng)目可能不是,可以檢查一下。
無用的代碼
無用的代碼可能包括包括:類,分類,協(xié)議,方法,實(shí)例變量,局部變量等。我們可以利用工具進(jìn)行查找。
-
開啟編譯器警告來查找無用的方法,實(shí)例變量,局部變量
fAbGw.png
如上圖,開啟Unused Functions, Unused Ivars, Unused Variables。
查找沒有使用的類
Github上有個(gè)工具可以使用:fui
冗余的代碼
如果某些代碼,在工程里反復(fù)出現(xiàn)多次,那么應(yīng)該進(jìn)行提取和封裝。
冗余的字符串
代碼上定義的所有靜態(tài)字符串都會記錄在在可執(zhí)行文件的__cstring段,如果項(xiàng)目里L(fēng)og非常多,這個(gè)空間占用也是可觀的,也有幾百K的大小,可以考慮清理所有冗余的字符串。另外如果有特別長的字符串,建議抽離保存成靜態(tài)文件,因?yàn)锳ppStore對可執(zhí)行文件加密導(dǎo)致壓縮率低,特別長的字符串抽離成靜態(tài)資源文件后壓縮率會比在可執(zhí)行文件里高很多。
將鏈接后的可執(zhí)行文件中的成份,按大小排序,看是否有可以優(yōu)化的項(xiàng)目
項(xiàng)目里會引入很多第三方靜態(tài)庫,如果能知道這些第三方庫在可執(zhí)行文件里占用的大小,就可以評估是否值得去找替代方案去掉這個(gè)第三方庫。我們可以從linkmap中統(tǒng)計(jì)出這個(gè)信息。
首先我們要想辦法得到LinkMap文件,可以通過打開Write Link Map File這個(gè)編譯選項(xiàng)來生成該文件:

生成的位置是在~/Library/Developer/Xcode/DerivedData/XXX-eumsvrzbvgfofvbfsoqokmjprvuh/Build/Intermediates/XXX.build/Debug-iphoneos/XXX.build/,是一個(gè)txt文件,例如:Talking Tyler-LinkMap-normal-arm64.txt
接下來通過工具,對此文件進(jìn)行解析,生成按大小排序的列表。推薦如下兩個(gè)工具:
XCode Linkmap Parser:需要安裝node.js環(huán)境才能使用。
LinkMap解析工具:是一個(gè)圖形界面的MAC應(yīng)用程序。
使用第二個(gè)工具,對上面的LinkMap文件進(jìn)行解析,得到的結(jié)果如下:

有了這樣的清單,我們在優(yōu)化時(shí),就能夠做到有的放矢。
