App/Framework/Static Library开启BitCode

1. App工程开启BitCode

在App的Target->Build Settings->Build Options中找到Enable BitCode,设置为YES,然后顶栏菜单Product->Archive。

第一次使用BitCode编译很可能出现链接错误,ld时提示有文件编译时未开启bit code。比如下面这条错误:

ld: ‘FooFile(FooFile.o)’ does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target.

ld会提示什么framework或.a文件编译时未开启BitCode,这些framework或.a文件需要开启BitCode重新编译后再添加到工程,然后再次尝试编译。

如果编译成功,上传到iTunes Connect后却提示如下错误:

则可能由于App不是用Archive编译的,或者在Custom Compiler Flags中未加入-fembed-bitcode。

2. 关于-fembed-bitcode

BitCode是编译期的feature,而非链接期的feature,也就是编译过程中每个.o文件都会有一个叫做__bitcode的段落生成。

在Build Options中启用BitCode,且使用Build而非Archive编译时,Xcode会自动添加编译选项-fembed-bitcode-marker,这个选项的意思大概就是说:如果BitCode开启的话,这里本来应当是放bitcode的,实际上没放。

在Build Options中启用BitCode,且使用Archive编译时,Xcode会自动添加编译选项-fembed-bitcode,此时才是真正开启了BitCode。

如果编译选项设置-fembed-bitcode-marker,编译成功后上传iTunes Connect,就会出现1.中图片的错误。当然这里iTunes Connect的体验是非常差的,报个错还不告诉原因:“开发者你有本事猜猜看呀?”

如果使用Build编译想强制开启-fembed-bitcode,只需在Target->Build Settings->Custom Compiler Flags中加入-fembed-bitcode即可。

相关讨论可以参考 How do I xcodebuild a static library with Bitcode enabled?

3. 创建支持 BitCode 的 Framework/Static Library

创建支持BitCode,并同时支持模拟器和真机的Framework/Static Library,和之前并无太大区别。

Xcode6开始,在创建新工程时,增加了选项iOS->Framework and Library->Cocoa Touch Framework。假设想创建framework,可以首先选择这个选项,新建一个iOS framework project。如果想创建static library,则选择”Cocoa Touch Static Library”。

创建完project,第一件事是在Target->Build Settings->Build Options中开启Enable BitCode,然后去Target->Build Settings->Custom Compiler Flags中加入-fembed-bitcode。因为一般来说,创建framework或static library,都是需要同时兼容模拟器和真机的,而Xcode并未提供便利的一键生成同时兼容模拟器和真机的executable binary的方式,而是要自己手动合并模拟器和真机的framework/static library。而在编译到模拟器时,是不支持Archive的,所以只有加上-fembed-bitcode选项才能支持BitCode。

然后,在Build Settings->Architectures添加额外的真机指令集支持,在当前(2016.01.15)来说,就是再加上个armv7s。

编译选项设置好之后,和以往一样,添加好各种代码文件和资源文件,将build configuration 设为 release,然后分别编译到模拟器和真机。之后手动合并fat executable file:

合并framework的话

lipo -info 后,对于常规的framework往往应该是如下显示:

合并static library的话:

lipo -info 后,对于常规的static library往往应该是如下显示:

然后将 Framework 或(static library 和 public headers)加入到App工程中,开启App Target的BitCode,Archive编译,上传iTunes Connect测试是否能正常处理。如果是Framework的话,还需在App Target->General->Embedded Binaries中加入此Framework,否则会出现error。

4. 包的体积变化

花了这么大力气,总算成功上传Test Flight了,但在TestFlight中,原本31.7M的包体积变成了64.1M:

关闭BitCode,TestFlight中显示如下:

开启BitCode,TestFlight中显示如下:

一口老血差点喷了出来。但是检查了可执行文件的大小,发现实际上用户下载的文件尺寸变小了。

关闭BitCode,可执行文件尺寸为 20,741,664 Bytes:

开启BitCode,可执行文件尺寸为 9,374,768 Bytes:

占用硬盘空间小了不少。但是根据苹果的说法,随着尺寸的减小,可执行文件载入进内存的耗时也会减小,对于启动速度是会有提升的,但实际测试中,开启与不开启BitCode,从点击Icon到显示主界面,时间均在0.7秒左右,对于我的App提升不明显,或者说完全看不出来。

理论上代码越多、工程越大,启用BitCode的优势越明显。

结论是BitCode还是值得一用的,只是苹果在开启BitCode的路上留了不少坑,如果决定使用这个新feature,请做好充分的心理准备。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,689评论 0 3
  • 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别...
    吃瓜群众呀阅读 11,880评论 3 42
  • 如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件。然而,这种方法并不是很优雅。它会暴露所有的实现细节...
    小热狗阅读 3,464评论 3 9
  • 点绛唇.桥楚 文/竹兰答水 点绛唇红,明珠青睐酸眉楚。 画桥作路。涉水濒江墅。 镜摆柳腰,褃节关情处。兜不住。 花...
    竹兰答水阅读 357评论 0 0
  • 2016年还剩33天,翻开通信录,微信,很多人,曾经关系那么好,这一年渐渐不再联系了~ 好朋友之间的关系是怎么变淡...
    后文艺_marble阅读 873评论 0 1