动态库 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 --------... --------...