关于Framework的一点看法

由于简书经常打不开,或者打开慢,不靠谱,还是把文章迁移到CSDN吧。

最近的工作是制作SDK,而在公司的SDK内部需要用到第三方的SDK,这就出现了Framework内部包含Framework的的情况。就把自己的一点看法记录下来。

什么是静态库 (Static Library)

所谓静态库,或者说 .a 文件,就是一系列从源码编译的目标文件的集合。它是你的源码的实现所对应的二进制。配合上公共的 .h 文件,我们可以获取到 .a 中暴露的方法或者成员等。在最后编译 app 的时候.a 将被链接到最终的可执行文件中,之后每次都随着app的可执行二进制文件一同加载,你不能控制加载的方式和时机,所以称为静态库。
Framework也分为静态库和动态库。其中动态库又区分为系统的真正的动态库,自己制作的只能在APP内部使用的动态库(Cocoa Touch Framework)。

在 iOS 8 之前,iOS 只支持以静态库的方式来使用第三方的代码。

什么是动态库 (Dynamic Framework)

与静态相对应的当然是动态。我们每天使用的 iOS 系统的框架是以 .framework 结尾的,它们就是动态库。

Framework 其实是一个 bundle,或者说是一个特殊的文件夹。系统的 framework 是存在于系统内部,而不会打包进 app 中。app 的启动的时候会检查所需要的动态框架是否已经加载。像 UIKit 之类的常用系统框架一般已经在内存中,就不需要再次加载,这可以保证 app 启动速度。相比静态库,framework 是自包含的,你不需要关心头文件位置等,使用起来很方便。

Cocoa Touch Framework

Apple 从 iOS 8 开始允许开发者有条件地创建和使用动态框架,这种框架叫做 Cocoa Touch Framework。
虽然同样是动态框架,但是和系统 framework 不同,app 中的使用的 Cocoa Touch Framework 在打包和提交 app 时会被放到 app bundle 中,运行在沙盒里,而不是系统中。也就是说,不同的 app 就算使用了同样的 framework,但还是会有多份的框架被分别签名,打包和加载。

动态库、静态库的相互包含(Add to targets 也就是 Link Binary With Libraries)

.a静态库:
1 .a静态库内部可以包含.a静态库内部
2 .a静态库内部不可以包含.framework静态库
3 .a静态库内部不可以包含.framework动态库

.framework静态库
1 .framework静态库内部可以包含.a静态库
2 .framework静态库内部不可以包含.framework静态库
3 .framework静态库内部不可以包含.framework动态库

.framework动态库
1 .framework动态库内部可以包含.a静态库
2 .framework动态库内部可以包含.framework静态库
3 .framework动态库内部不可以包含.framework动态库

动态库、静态库的相互引用(Add to targets 不添加)

以上不能包含的都可以使用引用来解决。

动态库、静态库相互包含或引用的解决方案

如果需要对外提供一个SDK D,D内部还需要用到A、B、C三个库,则可以这样设计。
第一种:
A、B、C都是静态库.a D是静态库.framework
第二种:
A、B、C都是静态库.framework D是动态库.framework
第三种:
A是静态库.a B是静态库.framework C是静态库.framework D是动态库.framework

如果要求B是动态库.framework,则:
A:静态库.a
B:动态库.framework
C:静态库.framework
D:动态库.framework

B包含A,C引用B,D包含C,最终只需要对外提供D,B这两个动态库就行了。
注意:A、B、C、D之间的关系。包含也就是Add to targets,引用也就是不Add to targets。

如果静态库多次被copy,则会出现提示库使用重复的警告,而且无法通过xcodebuild打包成功。这个时候就需要检查 add to target的使用是否正确。

可以通过file命令检查当前库是动态库还是静态库:
cd /Users/leo/Desktop/TXLiteAVSDK_TRTC.framework
file TXLiteAVSDK_TRTC

知道当前库为静态库(current ar archive)

TXLiteAVSDK_TRTC: Mach-O universal binary with 4 architectures: [arm_v7:current ar archive] [i386] [x86_64] [arm64]
TXLiteAVSDK_TRTC (for architecture armv7):	current ar archive
TXLiteAVSDK_TRTC (for architecture i386):	current ar archive
TXLiteAVSDK_TRTC (for architecture x86_64):	current ar archive
TXLiteAVSDK_TRTC (for architecture arm64):	current ar archive

如果是动态库(Mach-O dynamically),显示如下:

ImSDK: Mach-O universal binary with 3 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm_v7] [arm64]
ImSDK (for architecture x86_64):	Mach-O 64-bit dynamically linked shared library x86_64
ImSDK (for architecture armv7):	Mach-O dynamically linked shared library arm_v7
ImSDK (for architecture arm64):	Mach-O 64-bit dynamically linked shared library arm64

WechatIMG1.jpeg

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值