第44月第7天 bitcode 生成各机型的包

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
 
 
3.
 

用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
 
posted @ 2020-05-07 16:19  lianhuaren  阅读(148)  评论(0编辑  收藏  举报