ABI是什么?

在软件开发中, 应用程序机器二元码界面(Application Binary Interface 简称ABI)指两个程序模块间的接口; 通常其中一个车还给你徐模块会是库或者操作系统提供的服务, 而另一边的模块则是用户所运行的程序.

一个ABI定义了机器代码如何访问数据结构与运算程序, 此处所定义的界面相当地基并且相依于硬件. 而类似概念的API则在源代码定义这些, 较为高端, 并不直接依赖于硬件, 通常会是人类可阅读的代码. 一个ABI常见的样貌即是调用约定: 数据怎么称为计算程序的输入或者从中得到输出;x86的调用约定即是一个ABI的例子.

决定要不要采用既定的ABI, 通常由编译器, 操作系统或库的开发者来决定; 然而, 如果编写一个混合多个语言的应用程序, 就必须直接处理ABI, 采用外部函数调用来达成此目的.

调用约定: https://zh.wikipedia.org/wiki/调用约定

ABI: https://zh.wikipedia.org/wiki/应用二进制接口

Swift ABI稳定对我们意味着什么?

ABI稳定就是binary接口稳定, 也就是在运行的时候只要是通过Swift5或者以上的编译器编译出来的binary, 就可以泡在任意的swift5及以上的runtime上. 这样, 我们就不需要像以前那样在app里面放一个swift runtime了, Apple会把相应的ABI整合到iOS或者macOS中.

**好处: **

  1. App尺寸会变小: Apple会根据iOS操作系统创建不同的下载包. 对于iOS12.2的系统, 因为它预装了swift5 runtime, 所以不再需要Swift的库, 它们被从app bundle中删除掉. 对于iOS12.2以下的系统, 照旧.
  2. 因为系统集成了Swift, 所以大家都用同一个Swift了, app启动时候也就不需要额外加载Swift, 所以在新的系统中会更加节省内存. 另外, 对于Apple的工程师来说, 他们可以在系统的框架中使用swift, 这样很多东西不必通过oc wrap一遍, 这会让代码运行效率提高很多.

代价:

swift版本被放到了iOS系统中, 所以想要升级就没那么容易了, 除非升级操作系统. 在ABI稳定之前, swift runtime作为开发工具的一部分, 背作为库打包到了app中. 这样, 在开发时候, 我们可以随意使用新版本的swift特性, 因为他们的版本是开发者自己决定的. 不过当ABI稳定后, swift runtime变成用户系统的一部分, 它从开发工具变成了运行环境, 不再由开发者唯一决定.

这和我们一直以来适配新系统的 API 时候的情况差不多,在 Swift 5 以后,我们需要等到 deploy target 升级到对应的版本,才能开始使用对应的 Swift 特性。这意味着,我们可能会需要写一些这样的兼容代码:

// 假如 Swift 6.0 是 iOS 13.0 的 Swift 版本
if #available(iOS 13.0, *) {
// Swift 6.0 标准库中存在 A
let a = A()} else {
// 不存在 A 时的处理
}

有什么方法能够让我们无视系统版本, 去使用swift新特性吗?

方法还是有的, 但是相对比较麻烦, 很大程度上依赖于苹果是否愿意提供支持. 就像但是iOS5.0引入ARC时候, Apple为了让iOS4.3和之前的系统也能使用ARC的代码, 在deployment target选到iOS4.3或之前时候, 回采用static link的方法打包一个叫做libarclite的库, 其中包含了ARC所需的一些runtime方法. 对于ABI稳定后的swift, 也许可以采用类似的做法. 全看Apple是否愿意提供支持.

总结

ABI稳定最大的受益者应该是Apple, 这让Apple在自己的生态系统中, 特别是系统框架中, 可以使用Swift来进行实现. Swift ABI稳定为Apple开发平台的一场戈丁奠定了基础. 在未来的几年里, 如果你还想要关注Apple平台, 可能下面几件事情特别重要:

  • Apple 什么时候发布第一个 Swift 写的系统框架
  • Apple 什么时候开始提供第一个 Swift only 的 API
  • Apple 什么时候开始“锁定” Objective-C 的 SDK,不再为它增加新的 API
  • Apple 什么时候开始用 Swift 特性更新现有的 Objective-C SDK

Swift ABI稳定对我们到底意味着什么: http://www.cocoachina.com/cms/wap.php?action=article&id=26388

05-13 18:48