1.
使用开发模式导出ipa
选择出包的方式,生成针对具体机型的包
App Thinning:All compatible device variants
http://www.cocoachina.com/articles/14432
2.
其中 libdemo.a 就是我们要检查的文件。一般第三方库都会发布 fat library 以支持各个 CPU 架构。
接着,如果是 fat library,需要将某个 CPU 架构的 slice 提取出来:
lipo -thin arm64 libdemo.a -output libdemo-arm64.a
这样,我们就将 arm64 这个 slice 提取出来了。接下来我们需要将这个 slice 里面的目标文件解压出来,可以用 ar 命令:
ar -x libdemo-arm64.a
假设我们解压了 libdemo_la-util.o 这个目标文件。最后,我们检查目标文件中,是否包含 __bicode 这个段(segment):
otool -l libdemo_la-util.o | grep bitcode
https://www.jianshu.com/p/a8feea7b2834
用Clang编译成 ARM64 格式且带bitcode的目标文件test.o demo.o:
wuqiong:~ apple$ xcrun -sdk iphoneos clang -arch arm64 -fembed-bitcode -c test.m demo.m
然后把两个目标文件打包为一个静态库文件:
wuqiong:~ apple$ xcrun -sdk iphoneos ar -r libTest.a test.o demo.o
ar: creating archive libTest.a
用Shell命令otool查看目标文件中是否包含bitcode段:
wuqiong:~ apple$ otool -l test.o |grep bitcode
sectname __bitcode
sectname __bitcode
很意外,这一次,只有一行sectname __bitcode
输出,这就说明这两个目标文件,有一个不带有bitcode段,哪怕我们在编译的时候指定了参数-fembed-bitcode
也没有用.至于具体是哪一个不带bitcode段,我们肯定知道就是那个从ARM64汇编语言编译过来的目标文件不带.
那么就得出一个结论,bitcode的生成,是由汇编语言以上的上层语言编译而来,和最前面所说的那样,他是上层语言与汇编语言(机器语言)之间的一个中间码.
目前我们日常的iOS应用开发中,一般不会需要用到汇编层面去优化的代码.所以我们主要关注第三方(开源)C代码,尤其是音视频编码解码这些计算密集型项目代码,关键计算的代码针对特定平台都有对应平台的汇编版本实现,当然也有C的实现,但是默认编译一般都是用的汇编版本,这样就会导致我们在编译这个开源代码的时候哪怕你带了-fembed-bitcode
参数也仅仅只是让项目中的部分C代码的目标文件带了bitcode段,而那小数的汇编代码的目标文件一样不带bitcode段,这样编译出这个库交给上层开发者使用的时候,就会出现在打包上传或者真机调试的时候因为Xcode默认开了bitcode功能而链接失败,导致不能真机调试或者不能上传应用到AppStore.
https://www.jianshu.com/p/f42a33f5eb61