成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS可執行文件瘦身方法

移動開發 iOS
縮減iOS安裝包大小是很多中大型APP都要做的事,一般首先會對資源文件下手,壓縮圖片/音頻,去除不必要的資源。這些資源優化做完后,我們還可以嘗試對可執行文件進行瘦身,項目越大,可執行文件占用的體積越大,又因為AppStore會對可執行文件加密,導致可執行文件的壓縮率低,壓縮后可執行文件占整個APP安裝包的體積比例大約有80%~90%,還是挺值得優化的。

縮減iOS安裝包大小是很多中大型APP都要做的事,一般首先會對資源文件下手,壓縮圖片/音頻,去除不必要的資源。這些資源優化做完后,我們還可以嘗試對可執行文件進行瘦身,項目越大,可執行文件占用的體積越大,又因為AppStore會對可執行文件加密,導致可執行文件的壓縮率低,壓縮后可執行文件占整個APP安裝包的體積比例大約有80%~90%,還是挺值得優化的。下面介紹一下在研究可執行文件過程中發現的可以優化的點。研究的過程使用了linkmap,linkmap的介紹跟生成可以參考另一篇文章—iOS可執行文件的組成。
編譯選項

1.編譯器優化級別

Build Settings->Optimization Level有幾個編譯優化選項,release版應該選擇Fastest, Smalllest,這個選項會開啟那些不增加代碼大小的全部優化,并讓可執行文件盡可能小。

2.去除符號信息

Strip Debug Symbols During Copy 和 Symbols Hidden by Default 在release版本應該設為yes,可以去除不必要的調試符號。Symbols Hidden by Default會把所有符號都定義成”private extern”,具體意思和作用我還不清楚,有待研究,但設了后會減小體積。這些選項目前都是XCode默認選項,但舊版XCode生成的項目可能不是,可以檢查一下。

其他優化還可以參考蘋果的官方文檔—CodeFootprint.pdf
第三方庫統計

項目里會引入很多第三方靜態庫,如果能知道這些第三方庫在可執行文件里占用的大小,就可以評估是否值得去找替代方案去掉這個第三方庫。我們可以從linkmap中統計出這個信息,我寫了個node.js腳本,可以通過linkmap統計每個.o目標文件占用的體積和每個.a靜態庫占用的體積,并進行排序。詳見這里(需翻墻)。
ARC->MRC

有人提出用ARC寫的代碼編譯出來的可執行文件是會比用MRC大的,原因大致是ARC代碼會在某些情況多出一些retain和release的指令,例如調用一個方法,它返回的對象會被retain,退出作用域后會被release,MRC就不需要,匯編指令變多,機器碼變多,可執行文件就變大了。還有其他細節實現的區別,先不糾結了。

那用ARC究竟會增大多少體積?我覺得從匯編指令的增多減少去算是很難算準確的,這東西涉及細節太多,還是得從統計的角度計算。做了幾個對比試驗,統計了幾個同時支持ARC/MRC的開源項目在開啟/關閉ARC的情況下__TEXT代碼段的大小對比。只對比__TEXT代碼段是因為:

ARC對可執行文件大小的影響幾乎都是在代碼段

可執行文件會進行某種對齊,例如有些段在不足32K的時候填充0直到對齊32K,若用可執行文件大小對比結果可能是對齊后的,不準確。

實驗數據:

 

結果是ARC大概會使代碼段增加10%的size,考慮代碼段占可執行文件大約有80%,估計對整個可執行文件的影響會是8%。

可以評估一下8%的體積下降是不是值得把項目里某些模塊改成MRC,這樣程序的維護成本上升了,一般不到特殊情況不建議這么做。
無用代碼

在項目里新建一個類,給它添加幾個方法,但不要在任何地方import它,build完項目后觀察linkmap,你會發現這個類還是被編譯進可執行文件了。

按C++的經驗,沒有被使用到的類和方法編譯器都會優化掉,不會編進最終的可執行文件,但object-c不一樣,因為object-c的動態特性,它可以通過類和方法名反射獲得這個類和方法進行調用,所以就算在代碼里某個類沒被使用到,編譯器也沒法保證這個類不會在運行時通過反射去調用,所以只要是在項目里的文件,無論是否又被使用到都會被編譯進可執行文件。

對此我們可以通過腳本,遍歷整個項目的文件,找出所有沒有被引用的類文件和沒有被調用的方法,在保證沒有其他地方動態調用的情況下把它們去掉。如果整個項目歷時很長,歷時代碼遺留較多,這個清理對可執行文件省出的空間還是挺可觀的。
類/方法名長度

觀察linkmap可以發現每個類和方法名都在__cstring段里都存了相應的字符串值,所以類和方法名的長短也是對可執行文件大小是有影響的,原因還是object-c的動態特性,因為需要通過類/方法名反射找到這個類/方法進行調用,object-c對象模型會把類名,方法名列表都保存下來。

可以考慮在編譯前把所有類和方法名進行混淆,把長名字替換成短名字,這樣做的好處除了縮小體積外,還對安全性有很大提升,別人拿到可執行文件對它class-dump出來的結果都是混淆后的類和方法名,就無法從類和方法名中猜出某個方法是做什么的,就難以掛鉤子進行hack。不過這樣有個缺點就是crash堆棧反解出來的堆棧方法名會是混淆后的,需要再加一層混淆->原名的轉換,實現和使用成本有點高。

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

代碼上定義的所有靜態字符串都會記錄在在可執行文件的__cstring段,如果項目里Log非常多,這個空間占用也是可觀的,也有幾百K的大小,可以考慮清理所有冗余的字符串。另外如果有特別長的字符串,建議抽離保存成靜態文件,因為AppStore對可執行文件加密導致壓縮率低,特別長的字符串抽離成靜態資源文件后壓縮率會比在可執行文件里高很多。
CheckList

最后簡單把縮減iOS安裝包大小的各種方法列出來作為CheckList:

本文鏈接:http://www.cocoachina.com/ios/20150202/11084.html

責任編輯:chenqingxiang 來源: bang的博客
相關推薦

2024-05-06 00:00:00

Go文件瘦身代碼

2012-01-05 10:37:40

Java

2010-02-22 18:04:27

CentOS mpla

2017-02-07 10:22:53

2011-08-09 10:24:19

可執行文件病毒病毒

2021-01-12 10:10:41

shell腳本Linux命令

2021-01-08 08:06:19

腳本Shell文件

2022-05-11 14:50:34

Python解包執行文件

2009-04-16 10:37:17

Javaexejar

2023-03-31 23:31:06

.go文本文件

2009-06-20 09:21:37

UNIXLINUX

2024-08-12 16:42:50

二進制工具系統

2021-01-06 05:29:57

虛擬內存文件

2024-05-21 12:01:39

.NET 6開發

2023-09-04 07:14:36

2022-05-20 08:55:02

py文件exepython

2021-01-14 22:17:09

PythonLinux工具

2023-12-18 09:21:22

開發靜態編譯Linux

2021-07-02 05:23:10

微軟Edge瀏覽器

2009-10-28 13:03:54

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色在线免费播放 | 精品国产一区二区三区免费 | 久草网站 | 国产精品一区二区久久久久 | 精品91久久 | 日韩不卡一区二区 | 欧美在线观看一区 | av免费网站在线 | 99久久婷婷国产综合精品 | 欧美日韩成人 | 99精品免费久久久久久日本 | 国产免费一区二区 | 一级黄色片在线免费观看 | 日本成人午夜影院 | 久久精品毛片 | 91精品国产91久久综合桃花 | 亚洲a视频 | 一区二区三区四区免费视频 | 中文字幕亚洲一区二区三区 | 一区二区不卡视频 | 久久专区| 午夜国产精品视频 | 国产成人久久精品一区二区三区 | 日韩精品视频在线 | 免费精品 | 一本岛道一二三不卡区 | 久久久国产精品 | 国产成人精品一区二区三区网站观看 | 国产高清视频在线观看 | 日韩理论电影在线观看 | 99精品国产一区二区三区 | 国产精品久久久久久久久久三级 | 高清视频一区二区三区 | 国产精品久久 | 天天干,夜夜操 | 欧美另类视频 | 中文字幕在线观看视频一区 | 色吧综合网 | 黄色一级网 | 成人精品国产免费网站 | 国产一区2区 |