动态库 / 静态库


事实上,网上已经有挺多讲动态库和静态库的概念和区别的,而且有很多写的很好的博客,本着加深印象的目的与学习的态度,这里简单总结下自己的理解。

什么是库,库存在的意义?

库就是将编译好的二进制代码及其他相关资源的一起打包封装形成的特殊文件夹。

之所以需要库这种东西,大概有两方面的需要:

第一、合作开发时,希望别人使用自己的代码,但是又不希望别人看到源代码,这时候可以通过库只暴露头文件;

第二、对于整个项目来说,项目代码量往往很大,有些不常改动的代码希望先编译成二进制,项目编译的时候直接将其链接(Link)到项目中,减少项目整体编译时间。

以上两点,是库存在的意义,或者说是基本需求。

库的分类,不同分类库之间的区别与联系?

库分为静态库和动态库(显而易见哈),之所以要区分,是虽然他们都是已经编译好的二进制库,但是区别在于Link(链接)处理的方式与时机不同。

静态库:项目编译时链接,被完整复制到二进制文件中,多个app二进制文件中都有同一个静态库的副本;

动态库:项目编译时链接,但不复制,app启动时动态加载,内存中只有一份,多个app可共享(因此动态库也叫共享库)。

那么究竟该什么时候用动态库,什么时候用静态库呢?

第一,考虑库有没有被多个app或者与app扩展共享的需要

如果有被共享的需要,使用动态库比较合适,否则“推荐使用”静态库。

“推荐使用”的原因是,对整个app而言,动态库是它的外部依赖;app启动时,外部依赖动态载入会造成性能损失(一般可以忽略不计)

第二、考虑该库有没有依赖其他库,所依赖的库是动态库还是静态库

项目中使用cocoapods引用组件(私有组件或第三方组件)时,cocoapods默认会将组件编译成动态库;但是如果该库依赖了静态库,会导致编译失败;这时候需要指定编译成静态库(podspec中显式指定spec.static_framework = true)

第三、考虑该库有没有动态更新的需要

正因为动态库在app启动时动态载入,所以可以随时对库进行替换,而不需要重新编译整个app代码,实现动态更新(也叫热更新)。

以上结论是平台无关性的,其他平台也适用。

关于动态库/静态库,iOS 开发中有哪些需要注意的点?

一、关于被阉割的动态库

iOS8之前开发者自定义的动态库是不存在的,iOS 应用都是运行在沙盒当中,不同的程序之间不能共享代码(系统动态库除外);同时动态下载代码又是被苹果明令禁止的,没办法发挥出动态库的优势。

iOS8之后,出现了App Extesion特性,苹果官方允许开发者有限的使用自定义的动态库,这种动态库允许APP和APP Extension共享代码,但是这份动态库的生命被限定在一个APP进程内。因此也被称之为被阉割的动态库。

这种动态库(Embedded Framework) 和系统的 UIKit.Framework 还是有很大区别,传统的动态库是给多个进程用的,而这里的动态库(Embedded Framework)是给单个进程里面多个可执行文件用的。系统的 Framework 不需要拷贝到目标程序中,我们自己做出来的 动态库(Embedded Framework) 哪怕是动态的,最后也还是要拷贝到 App 中(App 和 Extension 的 Bundle 是共享的)。所以苹果没有直接把这种Embedded Framework称作动态库而是叫Embedded Framework。

上面提到跟Swift也有原因,在Swift的项目中如果要在项目中使用外部的代码,可选的方式只有两种,一种是把代码拷贝到工程中,另一种是用动态 Framework。使用静态库是不支持的。这个问题的根本原因主要是 Swift 的运行库没有被包含在 iOS 系统中,而是会打包进 App 中(这也是造成 Swift App 体积大的原因),静态库会导致最终的目标程序中包含重复的运行库(这是苹果自家的解释)。原文如下:

The current runtime doesn’t ship with the OS, so static libs would lead to multiple runtimes in the final executable. A statically linked runtime would be much more difficult to patch for compatibility with newer OS or Swift.

二、关于热更新

虽然理论上可以动态更新动态库来达到热更新的目的,但苹果官方现在还不支持使用热更新,即使使用其他方式达到热更新的目的,也会很难审核通过。

就这么多了,其中部分参考内容其他文章,会在下面注明出处。

iOS动态库、静态库及使用场景、方式

iOS动态库热更新

知识共享许可协议本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,请务必在遵守许可协议的前提下转载。
发布时间:2019-11-16 20:39:00 阅读:51 标签:技术iOS开发