Appstore安裝包是由資源和可執(zhí)行文件兩部分組成搓逾,安裝包瘦身也是從這兩部分進(jìn)行霞篡。
第一彈:引用資源“減肥”
資源瘦身主要是去掉無用資源和壓縮資源污淋,資源包括圖片寸爆、音視頻文件赁豆、配置文件以及多語言wording。無用資源是指資源在工程文件里节预,但沒有被代碼引用安拟。檢查方法是糠赦,用資源關(guān)鍵字(通常是文件名唆铐,圖片資源需要去掉@2x @3x)顺少,搜索代碼梅猿,搜不到就是沒有被引用。當(dāng)然喇潘,有些資源在使用過程中是拼接而成的(如loading_xxx.png)弧烤,需要手工過濾暇昂。
資源壓縮主要對png進(jìn)行無損壓縮从铲,用的是ImageOptim工具和compress命令(需要安裝XQuartz-2.7.5.dm插件)。不建議對資源做有損壓縮赏寇,有損壓縮需要設(shè)計一個個檢查,通常壓縮后效果不盡人意自娩。
1找出無用的selector
‘
以往C++在鏈接時脐彩,沒有被用到的類和方法是不會編進(jìn)可執(zhí)行文件里惠奸。但Objctive-C不同,由于它的動態(tài)性嵌言,它可以通過類名和方法名獲取這個類和方法進(jìn)行調(diào)用绵载,所以編譯器會把項目里所有OC源文件編進(jìn)可執(zhí)行文件里苛白,哪怕該類和方法沒有被使用到培愁。
結(jié)合LinkMap文件的__TEXT.__text定续,通過正則表達(dá)式([+|-][.+\s(.+)])私股,我們可以提取當(dāng)前可執(zhí)行文件里所有objc類方法和實例方法(SelectorsAll)。再使用otool命令otool -v -s __DATA __objc_selrefs逆向__DATA.__objc_selrefs段峭状,提取可執(zhí)行文件里引用到的方法名(UsedSelectorsAll)优床,我們可以大致分析出SelectorsAll里哪些方法是沒有被引用的(SelectorsAll-UsedSelectorsAll)胆敞。注意仍翰,系統(tǒng)API的Protocol可能被列入無用方法名單里予借,如UITableViewDelegate的方法蕾羊,我們只需要對這些Protocol里的方法加入白名單過濾即可书闸。
另外第三方庫的無用selector也可以這樣掃出來的嫌术。
2找出無用Objective-C類
查找無用oc類有兩種方式,一種是類似于查找無用資源磷籍,通過搜索"[ClassName alloc/new"够吩、"ClassName *"饮怯、"[ClassName class]"等關(guān)鍵字在代碼里是否出現(xiàn)。另一種是通過otool命令逆向__DATA.__objc_classlist段和__DATA.__objc_classrefs段來獲取當(dāng)前所有oc類和被引用的oc類于樟,兩個集合相減就是無用oc類。
選擇合理的編譯設(shè)置
Strip Link Product設(shè)成YES,WeChatWatch可執(zhí)行文件減少0.3M
Make Strings Read-Only設(shè)為YES,也許是因為微信工程從低版本Xcode升級過來,這個編譯選項之前一直為NO,設(shè)為YES后可執(zhí)行文件減少了3M
去掉異常支持系忙,Enable C++ Exceptions和Enable Objective-C Exceptions設(shè)為NO,并且Other C Flags添加-fno-exceptions,可執(zhí)行文件減少了27M苍苞,其中__gcc_except_tab段減少了17.3M冈欢,__text減少了9.7M太示,效果特別明顯邻吭。可以對某些文件單獨支持異常,編譯選項加上-fexceptions即可剧董。但有個問題真慢,假如ABC三個文件皂林,AC文件支持了異常,B不支持忆家,如果C拋了異常卸例,在模擬器下A還是能捕獲異常不至于Crash筷转,但真機下捕獲不了(有知道原因可以在下面留言:)阴绢。去掉異常后,Appstore后續(xù)幾個版本Crash率沒有明顯上升篓足。個人認(rèn)為關(guān)鍵路徑支持異常處理就好涩哟,像啟動時NSCoder讀取setting配置文件得要支持捕獲異常,等等
5其他可能的優(yōu)化
iOS8 Embed-Framework:提取WeChatWatch融涣、ShareExtention和微信主工程的公共代碼杂拨,可執(zhí)行文件可以減少5M+弹沽,不過這特性需要最低版本iOS8才能用,iOS7設(shè)備啟動會crash
iOS9 App Thinning:嚴(yán)格來說App Thinning不會讓安裝包變小娜亿,但用戶安裝應(yīng)用時蚌堵,蘋果會根據(jù)用戶的機型自動選擇合適的資源和對應(yīng)CPU架構(gòu)的二進(jìn)制執(zhí)行文件(也就是說用戶本地可執(zhí)行文件不會同時存在armv7和arm64)吼畏,安裝后空間占用更小
6建立版本增量日志
通過對LinkMap文件的分析躲舌,可以得知每個模塊可執(zhí)行文件占用大小性雄。再對比兩個版本秒旋,就知道業(yè)務(wù)模塊的增量大小酒甸。參考如下: