Podfile 中 use_frameworks! 的作用

在执行pod init之后, podfile中就会自动生成 use_frameworks! 配置。use_frameworks 一共有4种配置方式:

  • use_frameworks! :linkage => :static
  • use_frameworks! :linkage => :dynamic
  • use_frameworks!
  • # use_frameworks! # 不使用

不同的配置方式有不同的效果,先放结论

配置方式

链接类型

文件形式

Swift 支持

启动速度

动态加载支持

use_frameworks! :linkage => :static

静态

静态框架(.framework

⚡️ 快

use_frameworks! :linkage => :dynamic

动态

动态框架(.framework

use_frameworks!

动态

动态框架(.framework

不使用 use_frameworks!

静态

静态库(.a

⚡️ 快

各个配置的作用

1.使用 use_frameworks! :linkage => :static

  • 作用:强制所有依赖库以 静态框架(Static Framework) 形式集成。
  • 特点:
    • 静态链接:代码直接编译到主二进制文件中,不生成动态库(.dylib)。
    • 文件形式:依赖库会被编译为 .framework,但内部是静态库(.a)。
  • 优点:
    • 减少应用启动时的动态库加载时间。
    • 避免动态库数量过多导致的 IPA 体积膨胀。
  • 缺点:
    • 无法通过运行时动态加载(如插件化场景)。
    • 所有依赖库必须支持静态编译(某些库可能不支持)。
    • 适用场景:需要 Swift 模块化支持,同时追求启动性能优化的项目。

2. use_frameworks! :linkage => :dynamic

  • 作用:强制所有依赖库以 动态框架(Dynamic Framework) 形式集成。
  • 特点:
    • 动态链接:依赖库以独立的 .framework(含 .dylib)形式存在。
    • 文件形式:每个依赖库生成独立的动态框架。
  • 优点:
    • 支持模块热更新(需特殊处理)。
    • 减少主二进制文件体积(动态库按需加载)。
  • 缺点:
    • 启动时需加载大量动态库,影响启动时间。
    • 动态库需要签名,可能增加打包复杂度。
    • 适用场景:需要动态加载模块的插件化架构(如企业内部分发)。

3. use_frameworks!(默认动态链接)

  • 作用:所有依赖库以 动态框架 形式集成(等同于 :linkage => :dynamic)。
  • 特点:默认行为:与 use_frameworks! :linkage => :dynamic 一致。
  • 注意事项:如果项目中存在 Objective-C 和 Swift 混编 或者 纯Swift pod,必须使用use_frameworks!。但是可以选择 dynamic 或者 Static

4. 不使用 use_frameworks!

  • 作用:所有依赖库以 静态库(Static Library) 形式集成。
  • 特点:
    • 静态链接:代码直接编译到主二进制文件(生成 .a 文件)。
    • 文件形式:依赖库以 .a 文件形式嵌入。
  • 优点:
    • 启动速度快(无需加载动态库)。
    • 兼容性高(几乎所有库支持静态编译)。
  • 缺点:
    • 不支持 Swift:Swift 项目无法使用此模式。
    • 主二进制文件体积较大。
  • 适用场景:纯 Objective-C 项目,且无需动态库支持。

use_frameworks!生效的条件

  1. use_frameworks! 只有在第三方库的podspec文件中没有设置s.static_framework = true/falue时有效,如果第三方库的podspec文件中设置了s.static_framework = true/false, 那么依podspec中的设置为准。
  2. 第三方库必须是源代码,否则也不生效。比如:原来是.a,.framework静态库,那么不管Podfile中是否添加use_frameworks!都不会影响原来的结果。

podspec中s.static_framework与Podfile中use_frameworks!的优先级

podspec static_framework 的优先级大于 Podfile中的use_framework! :linkage的优先级。

也就是说以podspec中的为准。Podfile 只是改变,在podspec中没有用static_framework指定的为true或false情况下的集成方式。

如果podspec中源代码的pod库s.static_framework = true,则Podfile中用 use_frameworks! :linkage => :dynamic 也不会改变动态库的方式。

如果在podspec中既有 静态库,又有动态库:

s.dependency 'xxx' //是一个动态库

s.dependency 'Bugly' //是静态库

 那么在Podfile中:

1、不使用:use_frameworks!

或者使用:

use_frameworks! :linkage => :static

按照静态库进行编译,则可以编译通过.

2、使用:use_frameworks!

或者

使用 use_frameworks! :linkage => :dynamic

进行动态库进行编译时,就会pod install报错:

所谓的库就是一段编译好的二进制文件+头文件+相关的资源文件,然后提供给别人使用。

静态库(.a):在编译时会将库copy一份到目标程序中进行合并,编译完成之后,目标程序不依赖外部的库进行运行,缺点是会使应用程序变大

动态库(.dylib):编译时只存储了指向动态库的引用。可以多个程序指向这个库,在运行时才加载然后动态链接,优点不会使体积变大。

Framework:实际上是一种打包方式,打出来的包可以是动态库也可以是静态库。它是将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。

参考文章:

Podfile 中 use_frameworks! 的作用

https://www.jianshu.com/p/8059330a61cd

https://juejin.cn/post/6974224632983322655

你可能感兴趣的:(ssh,运维)