Swift 什么是ABI稳定、模块稳定
什么是ABI
应用程序二进制接口(Application Binary Interface,ABI)是指两程序模块间的接口,通常其中一个程序模块会是库或操作系统所提供的服务,而另一边的模块则是用户所运行的程序。
ABI 约定了我们的应用程序怎样获取数据以及操作数据。应用程序就是通过这些ABI跟系统通信的。
ABI稳定
Swift 5.0 版本之前,应用程序打包时,都会将 Swift 标准库导入到二进制包中,原因是不同的 Swift 版本之间差异大,ABI接口不兼容。
Swift 5.0 开始 ABI 以及稳定。从 5.0 版本开始 Swift 共用一个 ABI 接口,所以从 5.0 版本开始打包时就不需要将 SWift 基础库打进二进制包中,此时iOS系统以及包含了这些基础库,这样做的好处是之一就是包体积变小了,启动时间变少了,更省内存了。
1 | 事实上,打包时还是会包含 Swift 基础库,原因是在 iOS 12.2 之前依然需要 Swift 基础库,但之后的版本 App Store 会自动移除。 |
模块稳定
Swift 5.1 之前,不同的版本生成的 Module(模块)只能在对应的版本上运行,不然就会出现以下错误
1 | Module compiled with Swift 5.0.1 cannot be imported by the Swift 5.1 compiler |
而从 5.1 版本开始, Module Stability
允许 5.1 版本打的 Module 在 5.1 之后的任意版本运行。
开启 Module Stability
后,Framework 引入了一个全新的文件夹 .swiftmodule
,包含 .swiftinterface
和 .swiftmodule
文件,swiftinterface
文件作为 swiftmodule
的一个补充,用来描述 module
公开接口的文本文件,并且不受编译器版本限制,既通过 swiftinterface
文件可以将 Swift 6 打包的 framework 在 swift 7 版本下运行。
需要设置
1 | //BUILD_LIBRARY_FOR_DISTRIBUTION |
开启 Build Libraries for Distribution
后编译的文件如下
如果不开启 Build Libraries for Distribution
,那么编译后会少了 swiftinterface
, 此时的 Module
是受版本限制的。
什么是 Library Evolution
开启 Library Evolution
后,也就是Build Libraries for Distribution
,当一个框架依赖另一个框架时,如果另一个框架发生改动,那么不需要重新编译第一个框架。也就是更新第二个框架不需要重新编译第一个框架。
类似于 @frozen
?
参考
Swift ABI 稳定对我们到底意味着什么
ABI Stability and More
What is Module Stability in Swift and why should you care?