美文网首页
关于Framework的一点看法

关于Framework的一点看法

作者: Leoeoo | 来源:发表于2019-08-16 14:20 被阅读0次

    最近的工作是制作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

    相关文章

      网友评论

          本文标题:关于Framework的一点看法

          本文链接:https://www.haomeiwen.com/subject/gzifsctx.html