库一般是封装好的代码,便于复用。例如 GitHub 上可以看到的开源库,开箱即用。
下面我们主要说的,是编译成二进制的库。
根据 Link 的方式,分成了 2 种库,静态库和动态库。
静态库,即静态链接库。不同平台的文件格式如下:
系统 | 静态库文件格式 |
---|---|
Windows | .lib |
Linux | .a |
MacOS/iOS | .a |
静态库的特点,在于编译的时候会直接复制到目标程序里。
意味着代码在目标程序中,不会再改变了。如图:
动态库,即动态链接库。 不同平台的文件格式如下:
系统 | 动态库文件格式 |
---|---|
Windows | .dll |
Linux | .so |
MacOS/iOS | .dylib |
动态库的特点,在于编译的时候,并不会被拷贝到目标程序中。
目标程序中,只会存储指向动态库的引用。程序运行时,动态库才真正被加载。
而同一个动态库,可以被多个程序使用。如图:
Framework 实际上是一个 bundle 或者说特殊形式的文件夹,将库的 二进制文件 / 头文件 / 资源文件 打包到一起。
Framework 可以选择创建为动态或者静态。
由于 .a /.dylib 等只能打包库的二进制代码,可以用以下公式区别:
动态库 / 静态库 + .h + 资源文件 = Framework.
制作 Framework 已经有很多教程,可以直接谷歌百度查阅,这里就不纠结具体过程了。可以参考这篇文章 -> 静态库和动态库的制作 (OC、Swift)
真正动态的 Framework ,只有苹果自家的 UIKit.Framework,Foundation.Framework 等。
由于 iOS 的沙盒机制,自己创建的 Framework 和系统 Framework 不同,App 中使用的 Framework 运行在沙盒里,而不是系统中。每个 App 都只能用自己对应签名的动态库,做不到多个 App 使用一个动态库。
如果不同的 App 使用了同样的 Framework,还是会有多份的 Framework 被分别签名,打包和加载。
所以,iOS 上的动态库只能是私有的,我们无法将动态库放置在除了自身沙盒以外的地方。
CocoaPods 是 iOS 项目的依赖管理工具,类似于 Android 的 gradle。不过 gradle 还能负责构建, CocoaPods 只管理依赖。
CocoaPods 目前分别支持了 Framework 动态库和 .a 静态库 2 种方式。
默认使用的是 .a 静态库的方式,主工程依赖 libPods.a,通过脚本,把资源等文件复制到目标目录。
在 Podfile 使用了 use_frameworks! 进行声明, 则使用 Framework 动态库的形式. 主工程对 Pods 的依赖为 Pods.framework。
由于 Xcode9 之前 Swift 项目不支持静态库,如果为 Swift 项目,就必须采用 user_frameworks! 声明。
关于 Xcode9 以后使用 Swift 静态库的,可以参考下面的文章:
来源: https://juejin.im/post/5a33324c6fb9a0450a676383