一、概述
库就是程序代码的集合 是共享程序代码的一种方式;根据公开和不公开可分为:开源库和闭源库;我们经常使用的第三库像MJExtension、MJrefrsh、SDWebImge等都属于开源库;而闭源库是经过编译后的二进制代码,我们无法看到具体实现,比如说经常使用的百度SDk等。闭源库又可分为:静态库、动态库。
二、静态库和动态库的区别
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝。文件后缀:.a或者.framework
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。文件后缀:.dylib或者.framework
注意:如果项目中使用自制的动态库,不能上传到appstore中,因此开发中使用的基本都是静态库。
三、Architectures (架构)
之所以提到CPU架构的问题,其实是因为我们iOS开发使用的静态库与动态库与之紧密相连。每一个开发的App都要运行在模拟器或者真机上,在编译的时候,Xcode需要去分析当前运行平台的CPU架构,然后确定所使用的静态库是否支持这个CPU架构。如果不支持就会报错。
- 1、什么是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也是如此。
-
2 、常见的架构
armv7|armv7s|arm64都是ARM处理器的指令集;
i386|x86_64 是Mac处理器的指令集。
iOS模拟器没有运行ARM指令集,编译运行的是x86指令集(或i386),所以只有在iOS设备上才会执行设备对应ARM指令集。每个设备都有属于自己的CPU架构。
屏幕快照 2018-01-27 下午9.42.52.png
- Architectures
指定工程被编译成可支持哪些指令集类型,而支持的指令集越多,就会编译出包含多个指令集代码的数据包,对应生成二进制包就越大,也就是ipa包会变大。
2.Valid Architectures
限制可能被支持的指令集的范围,也就是Xcode编译出来的二进制包类型最终从这些类型产生,<b>而编译出哪种指令集的包,将由Architectures与Valid Architectures(因此这个不能为空)的交集来确定
- Build Active Architecture Only
指定是否只对当前连接设备所支持的指令集编译
当其值设置为YES,这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本,而设置为no时,会编译所有的版本。 所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。

-
3终端命令查看静态库支持的架构:
lipo -info xxxxxx.a (切换到.a的父文件夹下执行)lipo -info HisignFaceBaseSdk(切换到HignFaceBaseSdk的父文件夹下即HisignFaceBaseSdk.framework文件下,其实framework就是个文件夹)
四、静态库的制作
屏幕快照 2018-01-28 上午10.01.51.png
- 选择Coca Touch stair Libary点击next创建一个工程。
2.新建一个工具类

3.暴漏头文件
TAGETS -> Build Phases ->Copy Files 添加头文件Tool.h

-
支持所有模拟器的cpu架构
屏幕快照 2018-01-28 上午10.55.02.png
-
Command +B编译一下
屏幕快照 2018-01-28 上午10.15.28.png


6.生成支持真机的静态库

连接上iphone设备Command +B编译一下

总结:在编译静态库时,需要编译两个版本 -> 真机iphones版本(arm) | 模拟器和iphonesimulator版本(i386);
终端命令静态库支持的架构:lipo -info liblibstatic.a
五、静态库合并
在开发过程为了让静态库同时支持真机和模拟器方便调试,我们需要将iphones版本和iphonesimulator版本合并成一个静态库,既能支持模拟器,又能支持真机。

lipo -create 静态库1 静态库2 -output 新的静态库
终端命令:
lipo -create Debug-iphoneos/liblibsttt.a Debug-iphonesimulator/liblibsttt.a -output libTools.a
llipo -info libTools.a
Architectures in the fat file: libTools.a are: armv7 i386 x86_64 arm64
合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
静态库Realese版本生成:
Edit Scheme ->Run->Build Configuration->Release


静态库文件的版本(4种)

调试版本会包含完整的符号信息,以方便调试;
调试版本不会对代码进行优化;
发布版本不会包含完整的符号信息;
发布版本的执行代码是进行过优化的;
发布版本的大小会比调试版本的略小;
在执行速度方面,发布版本会更快些,但不意味着会有显著的提升;
网友评论