在项目开发中,或多或少的都会使用第三方库,有时候也会将自己项目中独立于业务的相关代码打包成库以供别人使用。在Android开发中,一般打包为aar或者jar文件以供第三方使用。iOS开发中,则可以直接打包为.a文件,iOS内置了Static Library的模板,所以使用上也是十分的方便。
在正式讲解打包.a静态库之前,首先来看一些概念:
什么是库?
所谓库就是程序代码的集合,是共享程序代码的一种方式。
库的分类
根据程序代码的开源情况,库可以分为两类:
开源库
源代码是公开的,第三方开发者可以看到具体实现。比如GitHub上比较出名的第三方框架AFNetworking、SDWebImage。
闭源库
不公开源代码,只公开调用的接口,看不到具体的实现,是一个编译后的二进制文件。这种常见于一些公司的SDK包,比如高德地图SDK、环信即时通讯SDK等等。而闭源库又分为两类:静态库和动态库。本篇重点要讲的便是其中的静态库。
静态库和动态库的区别
静态库
以”.a”或者“.framework”为文件后缀名。
动态库
以”.dylib”或者“.framework”为文件后缀名。
区别
静态库链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。形如:
动态库链接时不复制,程序运行时由系统动态加载到内存,供程序调用。而且系统只加载一次,多个程序共用,节省内存。
苹果芯片架构
armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)
armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2
armv7s: iPhone 5、iPhone 5c (静态库只要支持了armv7,就可以在armv7s的架构上运行)
**arm64:**iPhone7、iPhone7 Plus iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Air、iPad Air2、iPad mini2、iPad mini3
打包静态库
1,打开Xcode创建一个新的工程,这里以Xcode8.3为例。新建Static Library静态库工程。
2,创建工程完毕后,再创建一个工具类StaticLibTool,添加一个方法用于测试。
然后在.h文件中声明一个方法,并在.m文件中实现该方法,在方法内容输出一段日志。
3,运行工程进行打包,运行完毕后,会看到工程中Products文件夹下的StaticLib.a文件由红色变成了黑色。这就是我们打包好的.a静态文件了。
4,公开接口头文件和相关需要暴露的方法。依次选择targets->Build Phases->Copy Files->”+”->需要公开的头文件
或者
添加完成后, 需要手动将StaticLib文件拖入Public一栏中进行公开。
5,设置Scheme。即运行的环境,因为正是环境和debug环境所需要的库还不一样,需要分别打包。
选择Product->Scheme t-> Edit Scheme。再次运行即可。
如果需要合并模拟版本和真机版本的静态库。当debug环境和relase环境.a文件都打包好以后,选择libStaticLib.a,右键选择Show in Finder,进入Finder后,可以看到编译后的模拟器和真机版本的.a静态库。
合并终端命令如下:
lipo -create "真机版本.a静态库路径" "模拟器版本.a静态库路径" -output "合并后的.a静态库路径"
注意中间要有空格。
5,测试。新建一个可运行的工程,libStaticLib.a和StaticLib.h文件拖入工程即可。