如何正確理解 Bitcode(轉(zhuǎn)載至糖炒小蝦)
昨天去美團(tuán)吹水,聊到 BitCode 話題傀广,朋友說(shuō)他們發(fā)現(xiàn)美團(tuán)沒(méi)有開(kāi)啟 Bitcode,下載下來(lái)的包還是二進(jìn)制文件只有一個(gè)架構(gòu)的狀態(tài)。我感到非常不可思議蕊梧,晚上就去越獄了我的 iPad mini咆爽,剛好上周 9.1 越獄出了梁棠。結(jié)果發(fā)現(xiàn)果真如此。今天早晨和 SunnyXX 提及此事斗埂,都倍感神奇符糊,研究了一番,SunnyXX 又去查了蘋果文檔呛凶,發(fā)現(xiàn)大家都把 Bitcode 理解錯(cuò)了
BitCode 是什么
我們最近聚會(huì)總說(shuō)男娄,xxx SDK 不求上進(jìn),一年了還不支持 Bitcode漾稀。一旦支持了模闲,ipa 大小能少了不小。然而今天看完文檔發(fā)現(xiàn)并不是這么回事崭捍。
Bitcode尸折,干的事情是指令集優(yōu)化。根據(jù)你設(shè)備的狀態(tài)去做編譯優(yōu)化殷蛇,進(jìn)而提升性能实夹,但這對(duì)包的大小優(yōu)化起不到什么本質(zhì)上的作用
那么美團(tuán)那個(gè)事件是怎么回事呢?
App Thinning in Xcode
在查文檔之前粒梦,我干了這么樣一件事亮航。對(duì)比了一下 iOS 8、iOS 9 上的美團(tuán)占手機(jī)大小匀们。結(jié)果發(fā)現(xiàn)了一個(gè)問(wèn)題缴淋,如圖。
我確定美團(tuán)是 Universial 版本,也確定這兩個(gè)美團(tuán)是同一版本號(hào)宴猾。然而體積差了 40+ MB圆存。直接把 iOS 8 上的二進(jìn)制包拿出來(lái)(需越獄),在命令行下
file imeituan
我們發(fā)現(xiàn)仇哆,他是同時(shí)存在 armv7 和 arm64 兩個(gè)指令集的沦辙。
我又在 iOS 7 上干了同樣的事情,與 iOS 8 結(jié)果一致讹剔。于是我們能得出一個(gè)推論:這個(gè) ipa 變小的事情是 iOS 9 的 feature油讯。
知道是 iOS 9 的問(wèn)題了,就回過(guò)頭來(lái)去看 WWDC 2015 Session 404延欠,App Thinning in Xcode陌兑,我當(dāng)初看這篇睡著了。官方有這么一張 PPT由捎。
說(shuō)明兔综,APP Thining 這件事并不只是 Bitcode,而是由:App Slicing狞玛、On Demand Resources,Bitcode組成
其中软驰,App Slicing干的事情是如下圖這樣,根據(jù)你設(shè)備型號(hào)心肪,生成對(duì)應(yīng)資源的 ipa锭亏,以節(jié)省空間。
并且我們?cè)谖臋n里看到了這么一句話:
In fact, app slicing handles themajorityof the app thinning process. ‘App Slicing’ feature finally switched on in iOS 9.0.2
也就是說(shuō)硬鞍,對(duì)于 ipa 減肥慧瘤,主要是由拆分架構(gòu)、資源文件來(lái)起到絕對(duì)性作用固该。而這個(gè)功能 iOS 9.0.2 之前的用戶都享受不到锅减。
再來(lái)說(shuō)一下On Demand Resource的作用,蘋果的示意圖很清晰伐坏。
作為游戲怔匣,只需要下載公共資源文件、初始關(guān)卡著淆。每過(guò)一關(guān),再下載對(duì)應(yīng)資源文件可以大幅減少包的大小拴疤。這對(duì)安裝包只有 200M 限制的 Apple TV 格外重要永部。
那么,我們知道呐矾。開(kāi)了 Bitcode 后苔埋,會(huì)根據(jù)不同設(shè)備來(lái)分包。會(huì)不會(huì)能起到 iOS 8 縮減體積的作用呢蜒犯?事實(shí)上并不是如此组橄,大家可以去下載一下手機(jī)百度荞膘。會(huì)發(fā)現(xiàn) iOS 8,比 iOS 9 大得多玉工。
所以我們能得出來(lái) 2 個(gè)不大不小的結(jié)論:
1. 如果想給 ipa 減肥羽资,Bitcode 乃至 App Thinning 都對(duì) iOS 9.0.2 以下用戶無(wú)效。
2. 其實(shí)Bitcode 對(duì) ipa 減肥起不到什么作用遵班。