如何衡量用静态库还是动态库?

这是面试时候碰到的一个问题,当时问的脑子糊糊的........

动态库和静态库的定义

Library是计算机程序使用的非易失性资源集合,包含源代码。iOS、macOS上大部分library都会包含源码,支持一种或多种架构。Library可以被静态链接,称为静态库(static library);也可以被动态链接,称为动态库(dynamic library)。

静态库命名格式通常为lib*.a,动态库命名格式为*.dylib

静态库

• 编译时直接链接到可执行文件,最终的 .ipa 包会包含整个库文件。

• 代码和资源一起打包进 APP,不需要额外加载,运行时不依赖外部库。

动态库(对于动态库,如果是官方的库文件,比如UIKit,SwiftUI等等,ios只会在app中共用一份,全部app都通过动态链接查找,但对于第三方库,由于ios的沙盒机制,所以即使是一样的库,也不能在应用程序之间共享):

• 不直接编译到可执行文件

·ipa打包出来属于单独的模块,在运行时加载

两种链接方式:静态链接和动态链接

静态链接发生在创建App的时候,构建时,静态链接器从库中找API,复制进二进制执行文件中,会影响App的大小

动态链接发生在App启动时候,静态链接器把库运行路径记录在App中,启动时从动态库中去查找,会影响App的启动时间(启动不再只是加载一个程序文件,动态库也需要加载并连接到一起) 

下面从可执行文件大小、对app启动的影响、安全性、独立部署四个方面对比动态库、静态库。

可执行文件大小

  • 静态库的可执行文件大。使用静态库时,链接器会将静态库代码拷贝到可执行文件中,静态库成为可执行文件的一部分。
  • 动态库的可执行文件小。在启动时或运行时,将动态库代码加载到内存,动态库不会成为可执行文件的一部分,因此,使用动态库的可执行文件较小。

启动耗时

  • 静态链接启动速度快。所有符号都在同一个模块内,没有符号绑定的耗时,启动速度快。但二进制文件太大,启动时占用内存也会多,太多的page fault也会增加启动耗时。
  • 动态链接启动慢,尤其在iOS中。Apple在WWDC中推荐iOS app最多使用六个动态库,macOS没有说明。这一推荐值随硬件性能变化而变。

安全性(运行时是否会查找不到符号)

  • 静态链接是安全的。因为编译时会将静态库符号拷贝到可执行文件中,不会出现查找不到符号。
  • 有风险。尽管编译器会进行验证,但可能由于开发忘记嵌入而导致Library not loaded ... Reason: image not found。macOS中app之间可以共享动态库,可能因为动态库版本差异导致找不到符号。

独立部署

  • 静态库不支持独立部署。所有内容都在一个二进制文件中提供,无法仅部署部分依赖。
  • 动态库:
    • iOS禁止部署单独库、框架。
    • 如果模块安装到了共享位置,macOS支持部署单独的库、框架。

总上所述说:动态库对Build影响小,但启动的时候的时候需要加载,会使启动时间变慢(ios有启动缓存机制,即这次启动会缓存动态链接的过程)。静态库太多,二进制文件就会很大,迭代构建/调试周期就会变慢。

对于动态链接的优化,我们还有使用可合并库来进行优化,具体可以看认识可合并库 - WWDC23 - 视频 - Apple Developer

参考:Link fast: Improve build and launch times - WWDC22 - Videos - Apple Developer

https://github.com/pro648/tips/blob/master/sources/%E9%9D%99%E6%80%81%E5%BA%93%E5%92%8C%E5%8A%A8%E6%80%81%E5%BA%93%E5%AF%B9%E6%AF%94.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值