如何正确理解 Bitcode(转载至糖炒小虾)
昨天去美团吹水,聊到 BitCode 话题,朋友说他们发现美团没有开启 Bitcode,下载下来的包还是二进制文件只有一个架构的状态。我感到非常不可思议,晚上就去越狱了我的 iPad mini,刚好上周 9.1 越狱出了。结果发现果真如此。今天早晨和 SunnyXX 提及此事,都倍感神奇,研究了一番,SunnyXX 又去查了苹果文档,发现大家都把 Bitcode 理解错了
BitCode 是什么
我们最近聚会总说,xxx SDK 不求上进,一年了还不支持 Bitcode。一旦支持了,ipa 大小能少了不小。然而今天看完文档发现并不是这么回事。
Bitcode,干的事情是指令集优化。根据你设备的状态去做编译优化,进而提升性能,但这对包的大小优化起不到什么本质上的作用
那么美团那个事件是怎么回事呢?
App Thinning in Xcode
在查文档之前,我干了这么样一件事。对比了一下 iOS 8、iOS 9 上的美团占手机大小。结果发现了一个问题,如图。
我确定美团是 Universial 版本,也确定这两个美团是同一版本号。然而体积差了 40+ MB。直接把 iOS 8 上的二进制包拿出来(需越狱),在命令行下
file imeituan
我们发现,他是同时存在 armv7 和 arm64 两个指令集的。
我又在 iOS 7 上干了同样的事情,与 iOS 8 结果一致。于是我们能得出一个推论:这个 ipa 变小的事情是 iOS 9 的 feature。
知道是 iOS 9 的问题了,就回过头来去看 WWDC 2015 Session 404,App Thinning in Xcode,我当初看这篇睡着了。官方有这么一张 PPT。
说明,APP Thining 这件事并不只是 Bitcode,而是由:App Slicing、On Demand Resources,Bitcode组成
其中,App Slicing干的事情是如下图这样,根据你设备型号,生成对应资源的 ipa,以节省空间。
并且我们在文档里看到了这么一句话:
In fact, app slicing handles themajorityof the app thinning process. ‘App Slicing’ feature finally switched on in iOS 9.0.2
也就是说,对于 ipa 减肥,主要是由拆分架构、资源文件来起到绝对性作用。而这个功能 iOS 9.0.2 之前的用户都享受不到。
再来说一下On Demand Resource的作用,苹果的示意图很清晰。
作为游戏,只需要下载公共资源文件、初始关卡。每过一关,再下载对应资源文件可以大幅减少包的大小。这对安装包只有 200M 限制的 Apple TV 格外重要。
那么,我们知道。开了 Bitcode 后,会根据不同设备来分包。会不会能起到 iOS 8 缩减体积的作用呢?事实上并不是如此,大家可以去下载一下手机百度。会发现 iOS 8,比 iOS 9 大得多。
所以我们能得出来 2 个不大不小的结论:
1. 如果想给 ipa 减肥,Bitcode 乃至 App Thinning 都对 iOS 9.0.2 以下用户无效。
2. 其实Bitcode 对 ipa 减肥起不到什么作用。