iOS bitcode实战
2016-02-02 20:38
435 查看
关于bitcode的介绍,直接看下边两篇:
理解Bitcode:一种中间代码
Xcode 7 Bitcode的工作流程及安全性评估
大牛们已经把bitcode说的很清楚了,我结合自己的实践梳理出以下流程:
主工程引用静态库有两种形式(参考:在iOS中创建静态库)
①:代码依赖
②:引用.a
对应的,让静态库支持bitcode也有不同的地方。
先来看第一种:直接上图配置
注意代码依赖的工程配置
![](https://img-blog.csdn.net/20160202195019060?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
主工程的头文件搜索路径配置
![](https://img-blog.csdn.net/20160202195114832?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
打开子工程的bitcode
![](https://img-blog.csdn.net/20160202195154046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
看到第三张图片,就能看出来,代码依赖可以在主工程中动态修改。
再来看第二种:
打开.a工程的bitcode
![](https://img-blog.csdn.net/20160202200322187?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
添加到主工程中
![](https://img-blog.csdn.net/20160202200401094?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
配置主工程头文件
![](https://img-blog.csdn.net/20160202200433823?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这个时候,build一下没发现什么问题,但是如果archive就会报错:
ld: bitcode bundle could not be generated because '/Users/xxx/work/test-demo/bitcode/BitcodeTest/BitcodeTest/TestLibA/libTestLibA.a(TestLibA.o)' was built without full bitcode. All object files and libraries for bitcode must be
generated from Xcode Archive or Install build for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决这个错误就需要在生成的.a工程中添加一下配置:
other c flags 添加-fembed-bitcode,之后在run一下生成新的.a,然后替换主工程中的.a即可
![](https://img-blog.csdn.net/20160202200943403?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
然后在对主工程archive,即可:
![](https://img-blog.csdn.net/20160202203324006?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
现在系统的总结下:
一、代码依赖
方便控制,但是每次build花费的时间就长了。
如果碰到静态库有分类,报错unregistered selector ....,只需要在主工程other link flags 添加 -all_load即可。
二、.a引用
.a稍微复杂了点,不过一般引用的.a都是第三方的,也无需考虑太多。如果是自己制作,就参考上边。
对于.a引用衍生出另一个问题,如何判断.a支持bitcode?
①
进入到.a所在的目录,
使用以下命令:
otool -arch armv7 -l xxxx.a | grep bitcode
otool -arch arm64 -l xxxx.a | grep bitcode
能看到bitcode字样,至少有支持bitcode的可能,为什么说可能呢,最后要看archive
实践:
![](https://img-blog.csdn.net/20160202202659879?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
②
lipo -info xxxx.a
lipo -thin arm64 xxxx.a -output xxxx-arm64.a
ar -x xxxx-arm64.a //这一步完成会得到一个.o文件,共下部使用
otool -l xxxx.o | grep bitcode
![](https://img-blog.csdn.net/20160202202849801?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
通过这两种方法,能方便的查看.a是否支持bitcode.
最能直接检验的方法就是archive。在最后打包的时候能看到如下就说明完全没有问题了。
理解Bitcode:一种中间代码
Xcode 7 Bitcode的工作流程及安全性评估
大牛们已经把bitcode说的很清楚了,我结合自己的实践梳理出以下流程:
主工程引用静态库有两种形式(参考:在iOS中创建静态库)
①:代码依赖
②:引用.a
对应的,让静态库支持bitcode也有不同的地方。
先来看第一种:直接上图配置
注意代码依赖的工程配置
主工程的头文件搜索路径配置
打开子工程的bitcode
看到第三张图片,就能看出来,代码依赖可以在主工程中动态修改。
再来看第二种:
打开.a工程的bitcode
添加到主工程中
配置主工程头文件
这个时候,build一下没发现什么问题,但是如果archive就会报错:
ld: bitcode bundle could not be generated because '/Users/xxx/work/test-demo/bitcode/BitcodeTest/BitcodeTest/TestLibA/libTestLibA.a(TestLibA.o)' was built without full bitcode. All object files and libraries for bitcode must be
generated from Xcode Archive or Install build for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决这个错误就需要在生成的.a工程中添加一下配置:
other c flags 添加-fembed-bitcode,之后在run一下生成新的.a,然后替换主工程中的.a即可
然后在对主工程archive,即可:
现在系统的总结下:
一、代码依赖
方便控制,但是每次build花费的时间就长了。
如果碰到静态库有分类,报错unregistered selector ....,只需要在主工程other link flags 添加 -all_load即可。
二、.a引用
.a稍微复杂了点,不过一般引用的.a都是第三方的,也无需考虑太多。如果是自己制作,就参考上边。
对于.a引用衍生出另一个问题,如何判断.a支持bitcode?
①
进入到.a所在的目录,
使用以下命令:
otool -arch armv7 -l xxxx.a | grep bitcode
otool -arch arm64 -l xxxx.a | grep bitcode
能看到bitcode字样,至少有支持bitcode的可能,为什么说可能呢,最后要看archive
实践:
②
lipo -info xxxx.a
lipo -thin arm64 xxxx.a -output xxxx-arm64.a
ar -x xxxx-arm64.a //这一步完成会得到一个.o文件,共下部使用
otool -l xxxx.o | grep bitcode
通过这两种方法,能方便的查看.a是否支持bitcode.
最能直接检验的方法就是archive。在最后打包的时候能看到如下就说明完全没有问题了。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- 分享一个iOS下实现基本绘画板功能的简单方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器