Swift 5 ABI稳定性

ABI的稳定性使操作系统供应商能够在与使用Swift 5或更高版本构建的应用程序兼容的操作系统中嵌入Swift标准库和运行时。

ABI代表应用程序二进制接口。 在运行时,Swift程序二进制文件通过ABI与其他库进行交互。 它为二进制实体定义了许多底层细节,例如如何调用函数,如何在内存中表示其数据,元数据在哪里以及如何访问它。

ABI稳定性意味着将ABI锁定到某种程度,以便将来的编译器版本可以生成符合稳定ABI的二进制文件。 它使应用程序和使用不同Swift版本编译的库之间具有二进制兼容性。

以前,Swift不稳定,因此ABI稳定,因此每个二进制文件都捆绑了自己的Swift动态库版本。 如果您打开.ipa,则可以在SwiftSupport或Frameworks中找到快速的标准库(.dylib)。

假设Apple音乐使用的是Swift 3.2,因此它在内部捆绑了Swift 3.1动态库,但是Notes应用程序使用的是Swift 4.0,因此它捆绑了Swift 4.0和4.0 ABI。

现在Swift 5是ABI Stable,Swift将被嵌入到iOS操作系统中,并且它的ABI将与每个版本的Swift兼容。 即Apple Music使用的是Swift 5.0,但是Notes应用程序的是Swift 5.2,并且两者都使用了嵌入在操作系统中的Swift ABI。

  • 减小的Bundle大小:由于不再需要在Frameworks文件夹中包括Swift标准库,因此应用程序的大小将减小。
  • 源代码兼容性:较新的编译器可以编译用较早版本的Swift编写的代码。 这旨在减轻Swift开发人员在迁移到较新的Swift版本时所面临的迁移痛苦。
  • 较少的语言更改:较少的更改导致较少的迁移工作。
  • 二进制框架和运行时兼容性:它允许以二进制形式分发框架,该框架可在多个Swift版本中使用。 二进制框架包括swift模块文件和共享库。 模块格式的稳定性可稳定模块文件,该文件是编译器对框架公共接口的表示。 模块格式的稳定性需要时间才能存在(可能无法及时实现)。 开发人员可以在Swift中创建预编译框架 ,因为他们无需将Swift标准库捆绑到其框架中。
  • https://swift.org/abi-stability/
  • 在此播客中更多地了解二进制兼容性和模块稳定性

您可以随时通过Linkedin或Twitter与我联系