iOS 静态库、动态库、Framework、mach-O Ty
一、库格式:
库格式决定库独立性、库内文件类型、库内外文件依赖关系
- Static Library:(
静态
性质 或动态非共享
性质 或动态共享
性质) - Framework(
静态
性质 或动态非共享
性质 或动态共享
性质) - Metal Library
二、库性质(由mach -O Type决定):简单总结为
库性质决定库加载到运行时内存的时机、加载的库范围、库的共享权限
静态库
动态非共享库
动态共享库
mach -O Type:一种文件格式,Mach Object文件格式,是Mac上的可执行文件类型 或者 目标文件(.o)。
以开发者制作三方库的场景为例解释:
Executable: `静态库`,输出二进制
Dynamic Library:`动态非共享库`,输出动态链接库非共享库,程序`运行`时链接到`内存,大部分场景下不可共享;app extension、部分macOS场景下可以共享
Bundle:`动态非共享库`,和Dynamic Library相近,不过需要手动调用函数加载
Static Library: `静态库`,输出静态链接库,程序`编译`时拷贝到`内存`
Relocatable Object File:`静态库`,和Static Library类似,但体积更小
三、从结构上看,Framework格式的库
只是比Static Library格式的库
多出一个文件夹,拥有一个独立的工作区
四、Framework格式的库
中嵌入的依赖库可以和app环境的依赖库相同,并且不会产生duplicate symbol,因为Framework有独立的运行环境
五、Static Library格式的库
中的依赖库和app环境依赖库相同时会有依赖冲突
六、Static Library格式的库
的依赖的方法可以不实现,但Framework格式的库
依赖的方法必须实现(objc)
七、Static Library格式的库
不可包含图片等资源文件
八、Static Library格式的库
的库在打包时会直接编译进app的二进制执行文件,Framework格式的库
被打包进沙盒;如果观察过Product包内容时会发现使用<Static Library格式的库
>或者<Framework格式的库且(mach -O Type = Static Library)
>不会出现在Frameworks文件夹中,是因为编译进了app的二进制执行文件
九、开发者签名的Dynamic Library
性质的库时在app extension中共享或者在macOS部分场景下共享;苹果官方的动态库
有共享权限
十、制作三方库在考虑Static Library格式的库
库或者Framework格式的库
时:依赖图片资源,使用Framework格式的库
;想要拥有完整的依赖关系,使用Framework格式的库
,此时外界可能需要剔除Framework格式的库
之外的依赖库,而采用Framework格式的库
内的依赖库,否则虽然不会产生依赖冲突,但会增加包大小
十一、制作三方库时,建议选择:
- 库格式:
Framework
, - 库性质(mach -O Type ):
Static Library(mach -O Type)
或者Relocatable Object File
,会天然处理嵌套等问题
十二、Framework图标
Framework内不嵌套Framework时: image.pngFramework中嵌套Framework时:
image.png