iOS打包可執(zhí)行MachO文件瘦身

編譯選項


1.編譯器優(yōu)化級別

Build Settings->Optimization Level有幾個編譯優(yōu)化選項茂翔,release版應該選擇Fastest, Smalllest挠蛉,這個選項會開啟那些不增加代碼大小的全部優(yōu)化腊尚,并讓可執(zhí)行文件盡可能小。

2.去除符號信息

Strip Linked Product / Deployment Postprocessing / Symbols Hidden by Default 在release版本應該設為yes腊脱,可以去除不必要的調(diào)試符號祝谚。Symbols Hidden by Default會把所有符號都定義成”private extern”悠瞬,詳細信息見官方文檔

這些選項目前都是XCode里release的默認選項宵睦,但舊版XCode生成的項目可能不是记罚,可以檢查一下。其他優(yōu)化還可以參考官方文檔—CodeFootprint.pdf


第三方庫統(tǒng)計

項目里會引入很多第三方靜態(tài)庫壳嚎,如果能知道這些第三方庫在可執(zhí)行文件里占用的大小桐智,就可以評估是否值得去找替代方案去掉這個第三方庫。我們可以從linkmap中統(tǒng)計出這個信息烟馅,對此寫了個node.js腳本说庭,可以通過linkmap統(tǒng)計每個.o目標文件占用的體積和每個.a靜態(tài)庫占用的體積,詳見這里(需翻墻)郑趁。


無用代碼

在項目里新建一個類刊驴,給它添加幾個方法,但不要在任何地方import它寡润,build完項目后觀察linkmap捆憎,你會發(fā)現(xiàn)這個類還是被編譯進可執(zhí)行文件了。

在C++中沒有被使用到的類和方法編譯器都會優(yōu)化掉梭纹,不會編進最終的可執(zhí)行文件躲惰,但object-c不一樣,因為object-c的動態(tài)特性变抽,它可以通過類和方法名反射獲得這個類和方法進行調(diào)用礁扮,所以就算在代碼里某個類沒被使用到知举,編譯器也沒法保證這個類不會在運行時通過反射去調(diào)用,所以只要是在項目里的文件太伊,無論是否又被使用到都會被編譯進可執(zhí)行文件雇锡。

對此我們可以通過腳本,遍歷整個項目的文件僚焦,找出所有沒有被引用的類文件和沒有被調(diào)用的方法锰提,在保證沒有其他地方動態(tài)調(diào)用的情況下把它們?nèi)サ簟H绻麄€項目歷時很長芳悲,歷時代碼遺留較多立肘,這個清理對可執(zhí)行文件省出的空間還是挺可觀的。


類/方法名長度

觀察linkmap可以發(fā)現(xiàn)每個類和方法名都在__cstring段里都存了相應的字符串值名扛,所以類和方法名的長短也是對可執(zhí)行文件大小是有影響的谅年,原因還是object-c的動態(tài)特性,因為需要通過類/方法名反射找到這個類/方法進行調(diào)用肮韧,object-c對象模型會把類/方法名字符串都保存下來融蹂。

對此我們可以考慮在編譯前把所有類和方法名進行混淆,跟壓縮js一樣弄企,把長名字替換成短名字超燃,這樣做的好處除了縮小體積外,還對安全性有很大提升拘领,別人拿到可執(zhí)行文件對它class-dump出來的結(jié)果都是混淆后的類和方法名意乓,就無法從類和方法名中猜出某個方法是做什么的,就難以掛鉤子進行hack约素。不過這樣做有個缺點届良,就是crash堆棧反解出來的堆棧方法名會是混淆后的,需要再加一層混淆->原名的轉(zhuǎn)換圣猎,實現(xiàn)和使用成本有點高伙窃。

實際上這部分占用的長度比較小,中型項目也就幾百K样漆,對安全性要求高的情況可以試試。


冗余字符串

代碼上定義的所有靜態(tài)字符串都會記錄在在可執(zhí)行文件的__cstring段晦闰,如果項目里Log非常多放祟,這個空間占用也是非常可觀的呻右,也有幾十幾百K的跪妥,可以考慮清理所有冗余的字符串。另外如果有特別長的字符串声滥,建議抽離保存成靜態(tài)文件眉撵,因為AppStore對可執(zhí)行文件加密導致壓縮率低侦香,特別長的字符串抽離成靜態(tài)資源文件后壓縮率會比在可執(zhí)行文件里高很多。

圖示

安裝包瘦身
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纽疟,一起剝皮案震驚了整個濱河市罐韩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌污朽,老刑警劉巖散吵,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蟆肆,居然都是意外死亡矾睦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門炎功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枚冗,“玉大人,你說我怎么就攤上這事蛇损×尬拢” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵州藕,是天一觀的道長束世。 經(jīng)常有香客問我,道長床玻,這世上最難降的妖魔是什么毁涉? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮锈死,結(jié)果婚禮上贫堰,老公的妹妹穿的比我還像新娘。我一直安慰自己待牵,他們只是感情好其屏,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缨该,像睡著了一般偎行。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贰拿,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天蛤袒,我揣著相機與錄音,去河邊找鬼膨更。 笑死妙真,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的荚守。 我是一名探鬼主播珍德,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼练般,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锈候?” 一聲冷哼從身側(cè)響起薄料,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晴及,沒想到半個月后都办,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡虑稼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年琳钉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛛倦。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡歌懒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溯壶,到底是詐尸還是另有隱情及皂,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布且改,位于F島的核電站验烧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏又跛。R本人自食惡果不足惜碍拆,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望慨蓝。 院中可真熱鬧感混,春花似錦、人聲如沸礼烈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽此熬。三九已至庭呜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犀忱,已是汗流浹背募谎。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峡碉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓驮审,卻偏偏與公主長得像鲫寄,于是被迫代替她去往敵國和親吉执。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 王陽明創(chuàng)建心學之后,發(fā)現(xiàn)來學習心學的人都有浮躁之心未斑,所以要他們靜坐以滌蕩內(nèi)心的欲望咕宿,使心保持一個澄凈的狀態(tài)。為了讓...
    娟姐的心語話廊閱讀 794評論 1 1
  • 本期英語小練兵要為大家介紹的內(nèi)容來自電影《Flipped》蜡秽,中文譯名為《怦然心動》府阀。 影片講述少女朱莉和少年布萊斯...
    魔力學院閱讀 653評論 0 0
  • 分析問題,分解問題芽突,將問題安排給每一個人试浙,專職專制,合理解決寞蚌。
    蕭楠身閱讀 187評論 0 0
  • 1 最近回看自己的朋友圈挟秤,內(nèi)容都是很傷感的東西壹哺。一直給人的印象是屬于快樂、無心事艘刚,開心果類型的管宵。但凡消極一點,總是...
    宇宙菲菲閱讀 388評論 0 0