iOS 静态库打包和使用
最近公司准备将项目核心部分sdk化,抽时间看了下打包流程。Mark一下以免忘记。
根据http://www.jianshu.com/p/13bf46df9387整理而来。
1、这里提到静态库和动态库的区别,静态库在每次引用时均被复制,动态库是程序开始时加入到内存中,均可以调用,可以节约内存,但貌似自己的动态库不允许上架AppStroe。
更正:在 iOS8 之前,苹果不允许第三方框架使用动态方式加载,从 iOS8 开始允许开发者有条件地创建和使用动态框架,这种框架叫做 Cocoa Touch Framework。虽然同样是动态框架,但是和系统 framework 不同,app 中的使用的 Cocoa Touch Framework 在打包和提交 app 时会被放到 app bundle 中,运行在沙盒里,而不是系统中。也就是说,不同的 app 就算使用了同样的 framework,但还是会有多份的框架被分别签名,打包和加载。不过 iOS8 上开放了App Extension功能,可以为一个应用创建插件,这样主app和插件之间共享动态库还是可行的。
动态链接是使用了Procedure Linkage Table (PLT)。首先这个PLT列出了程序中每一个函数的调用,当程序开始运行,如果动态库被加载到内存中,PLT会去寻找动态的地址并记录下来,如果函数被调用过的话,下一次调用就可以通过PLT直接跳转了。
2、打包静态库(.a)
(1)新建工程,选择Cocoa touch static library创建。
(2)在targets->Build Phases->Copy Files->"+"中公开头文件。
(3)在project -> buildSeting -> Build Active Architecture Only 设置编译环境(模拟器或者真机)。
(4)模拟器和真机要分开编译,可以使用lipo -create命令进行合并。建议在上线中使用真机(可以减少体积)。
(5)使用lipo -info命令查看打包.a文件支持的架构和环境。
3、打包静态库(.framework)
(1)新建工程,选择Cocoa touch framework创建。
(2)在target-Build Phases - Headers -把需要公开的头文件从project拖入Public。
(3)在target->BuildSetting ->搜索关键字mach->Mach-o Type 设为Static Library(静态库)。
(4)模拟器和真机编译与.a步骤一致。
(5)在工程edit scheme中设置framework的允许环境(debug OR release)
3.1、使用
(1)将framework文件引入与project文件同一级目录下。
(2)添加依赖库。
(3)end