动态库打包

强调:使用动态库,要求应用最低支持系统为IOS8

1:静态库和动态库区别

静态库:
存在 .a.framework 两种形式。 .a 是一个纯二进制文件,.framework 中除了有二进制文件之外还有资源文件。.a 要有 .h 文件以及资源文件配合,
.framework 文件可以直接使用。总的来说,.a + .h + sourceFile = .framework。所以创建静态库最好还是用.framework的形式。
对于静态库而言,类似于一个编译好的 .o 的集合。
在build的过程中,只会参与链接的操作,
链接器会将静态库中被使用的部分合并到可执行文件中去,
用函数的实际地址来代替函数引用。链接流程如下图:

tmp1ee9ce8c.png

动态库:
存在.framework和.tbd两种形式。
在 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直接跳转了。另外,sandbox会验证动态库的签名,所以如果是动态从服务器更新的动态库,是签名不了的,因此应用插件化、软件版本实时模块升级等功能在iOS上无法实现。

2:优劣

静态库,在链接时会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝。
好处很明显,编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。当然其缺点也很明显,就是会使用目标程序的体积增大。

动态库,与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。
系统的动态库不需要拷贝到目标程序中,自建的动态库可以由工程内的多个库共享,因此可以减小目标程序的体积。但是,由于其把静态链接做的事情都搬到运行时来做,程序的启动会变慢。

3:使用情况

由于未使用过动态库,网上也有很多关于能否使用并且通过Apple审核的争论,下载了几款主流的应用进行的解压分析,以支付宝,微信和环信SDK为例:

支付宝:使用了动态库
微信:使用了动态库
环信SDK: 明确说明使用了动态库,并且让开发者提交苹果审核 链接地址:http://docs.easemob.com/im/300iosclientintegration/20iossdkimport
通过上述几个分析,自己创建的动态库应该是使用并且通过苹果审核,上架App Store。

4动态库打包流程

tmp6787a264.png

你可能感兴趣的:(动态库打包)