动态库
Dynamic Libraries ,或 Shared Library, Shared object, 动
态链接库
MacOS/iOS: .tbd, .dylib 或封装成 .framework
Linux: .so
Windows: .DLL
动态库是在程序冷启动时候被链接到手机内存或者 App 内存里
面
后缀是
.tbd或者.framework,.dylib,.xcframework
动态库类别
动态链接库
iOS 是启动时加载【dyld链接它】
在启动 app 时立刻将动态库进行加载 (随程序启动而启动)
链接时间: app 启动前阶段
动态加载库
一般是Mac OS 系统支持,iOS不支持
当需要的时候再使用 dlopen 等通过代码或者命令的方式来加载 (在程序启动之
后)
加载时间: 启动后加载
动态链接
和app打包到一起,但是并不像静态库一样编译进去,而是等到启动的时候去链
接,这一步也叫做 动态链接
动态链接器
(Dynamic linker, macOS 称 dyld)
完成动态库链接过程的工具就是动态链接器
优点-文件共享:
因为动态库不需要在编译时置入 app 中, 因此理论上体积会更
小, 而且可以做到动态库内容改变所有结果文件不需要重新编译
即可获得最新功能,相同的库大家可以共享,节约空间
iOS 平台动态库缺点:
1. 动态库会在编译时全部置入 app
2. iOS用户动态库不能与他人app共享,只有系统动态库可以
对于 iOS 开发来说, 因为我们只能使用 Embedding Frameworks 来使用动态库,
这样的动态库并不是真正的动态库, 其会在编译时全部置入 app, 然后在 app 启
动时全部加载, 这样的话会导致体积大, 加载速度慢.
iOS开发可以使用动态库,但是也只能自己使用,并不能对外共享
静态库是.o文件的合集, 但是动态库是.o文件链接过后的产物
静态库可以合并,动态库已经是链接后产物(最终产物),不可以修改,合并
静态库可以通过链接过程生成动态库,但是在iOS上可以编译成
功,却不可以运行(加载时报错)
结构
动态库 .framework = 链接最终产物 + 头文件 + 资源
Headers
包含了 Framework 对外公开的 C & Obj-C headers, Swift 并不会用到这些
Headers, 如果你的 framework 是用 Swift 写的, Xcode 会自动帮你创建这个文
件夹以提供互用性.
怎么区分Framework动态还是静态?
借助MachOView查看
在项目中选中库,在 Xcode 的 Targets -> build setting 中查找 mach-o type
选项: 如果显示Dynamic Librarie 说明是动态库,Static Librarie 就是静态库
iOS支持启动结束后加载动态库吗?
不能!
iOS 可能是出于安全考虑, 在加载可执行代码前, 需要校验签名. load 方法的内部
实现是调用了 dlopen, 而真机的 dlopen 内部还会调用 dlopen_preflight 先校
验签名.
如果库不是事先打包进 app(打包进 app 的话会与 app 有相同签名), 就会报签名
错误, 从而加载不成功.
因为校验签名原因,iOS的动态库都是先打包到app里的
系统的动态库不受签名校验限制, 可以动态加载
Mac OS支持启动后加载动态库吗?
支持
xcframework
区别于.framework,xcframework 同时包含多个架构,模拟器和真机 同时包
含,链接时会选择对应 的架构
xcframework 动态库结构示例
DynamicFramework.xcframework
----info.plist
----ios-arm64 (真机)
--------DynamicFramework.framework
------------DynamicFramework
------------Headers(头文件夹)
------------info.plist
------------Mudules
----------------DynamicFramework.swiftmodule
--------------------arm64-apple-ios.swiftdoc
--------------------arm64-apple-ios.swiftinterface
--------------------arm64.swiftdoc
--------------------arm64.swiftinterface
----ios-x86_64-simulator(模拟器)
--------DynamicFramework.framework
--------...
--------...