基本概念
- ARM:
ARM
是微处理器行业的一家知名企业,arm处理器以体积小和高性能的优势在嵌入式设备中广泛使用,几乎所有手机都是使用它。 - 什么是CPU架构?
- CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。目前市面上的CPU分类主要分有两大阵营,
- 一个是intel、AMD为首的复杂指令集CPU,
- 另一个是以IBM、ARM为首的精简指令集CPU。
- 两个不同品牌的CPU,其产品的架构也不相同,例如,Intel、AMD的CPU是X86架构的,而IBM公司的CPU是PowerPC架构,ARM公司是ARM架构”(摘自百度)
- 通常,我们知道电脑的CPU架构有X86和X64等,但是手机的主流CPU架构是ARM架构,因为采用ARM架构的CPU是一种微处理器,这种处理器功耗低,体积小,更适合手机使用,iPhone的CPU也是如此。
- CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。目前市面上的CPU分类主要分有两大阵营,
iPhone移动设备默认指令集
这里有一张更全面的图例(由于图片比较大,建议下载到本地查看):
ARM需要注意点
- 1.上述arm处理器指令集,在原则上它们都是向下兼容的。比如iPhone6s的CPU默认指令集是arm64,但是也同时支持armv7s等以前版本的指令集,只是效率变低了而已,无法充分发挥其性能,从而导致程序的执行效率没那么高。
- 2.Xcode模拟器其实是在电脑上的,所以iOS模拟器并没有使用arm指令集。它编译运行使用的是x86指令集(或者i386)。而在真机上使用的才是arm类型的指令集。
- 3.在Xcode中设置二进制包所支持的指令集,对于编译后的二进制包的大小影响显著,设置支持的指令集个数越少,安装包也越小。
Xcode中的设置
通过设置Build Settings
下的Architectures
选项设置相关指令达到控制Xcode生成二进制包的指令集。
-
1.Architectures:
- 作用:设置工程被编译后将支持哪些指令集,支持指令集是通过编译生成对应的二进制数据包实现的。
- 特点:设置支持的指令集数据越多,编译出的二进制包包含的指令集代码越多,这样就会使最后编译的包很大。
-
2.valid Architectures:
- 作用:设置可能支持的指令集,**这里的指令集选项和Architectures列表中指令集选项的交集,将决定最后Xcode生成二进制包所支持的指令集。 **
- 举例:Architectures支持armv7, Valid Architecture支持armv7、armv7s、armv64,那么Xcode只会生成一个armv7指令集的二进制包。也就是说直接改变
Architectures
就可以达到支持多架构的目的。
-
3.build Active Architecture only
- 作用:设置是否只编译当前使用设备所对应的arm指令集。也就是说当该项设置为YES的时候,上述规则(Architectures和valid Architectures交集决定二进制包所支持指令集)将被打破。
举列:设置该选项是YES,并且连接一个armv7指令集设备,无论前面两项如何设置,Xcode最终生成armv7指令集的二进制包。不过设置为YES生效有个前提条件就是,Xcode必须成功连接了调试的设备。 - 注意:一般的情况下,
build Active Architecture only
选项默认在Debug
模式下是YES, Release
模式下是NO,但是我们在开发的时候,有时候也会遇到一些第三方文件找不到路径的问题,这时要求我们设置Debug模式下也为NO。比如使用CocoaPods管理第三方的时候,遇到了“library not found for -lXXX”的错误,其实这是因为CocoaPods在引入第三方类库的时候,默认build Active Architecture only
在Debug模式下是YES导致的,修改为NO就可以了。顺便提一下这也是为什么在制作动态库的时候需要把这个选项设置为NO的原因
- 作用:设置是否只编译当前使用设备所对应的arm指令集。也就是说当该项设置为YES的时候,上述规则(Architectures和valid Architectures交集决定二进制包所支持指令集)将被打破。
shell脚本
大家平时做动态库的时候估计都是打完各个架构的包以后然后合成。这里分享一个通用的脚本。以后只需要
- 1.将脚本保存为shell脚本,
- 2.更改里面的项目名称及需要的架构,
- 3.在终端cd到项目根目录。
- 4.执行脚本
就可以了。
#change your project name here
project_name="你的项目名称"
#archs,include iphone (armv7, arm64) and iphone simulator (i386, x86_64)
archs="armv7 armv7s arm64"#选择你需要支持的脚骨
for arch in $archs
do
echo "building $arch..."
if [ "$arch" = "i386" -o "$arch" = "x86_64" ]
then
xcrun_sdk="iphonesimulator"
export cflags_config="-fembed-bitcode-marker"
else
xcrun_sdk="iphoneos"
export cflags_config="-fembed-bitcode -Qunused-arguments"
fi
xcodebuild clean build ARCHS=$arch -sdk $xcrun_sdk TARGET_BUILD_DIR="./build-$arch" BUILT_PRODUCTS_DIR="./build-$arch" OTHER_CFLAGS="$OTHER_CFLAGS $cflags_config"
done
cp -rf ./build-arm64/$project_name.framework $project_name.framework
echo "generate product..."
lipo -create `find ./build-* -name $project_name` -output $project_name.framework/$project_name
echo "clean cache..."
rm -rf ./build ./build-*
echo "done!"