篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从探索到落地,手淘引入 Swift “历险记”相关的知识,希望对你有一定的参考价值。
作者|姜沂(倾寒) 出品|阿里巴巴新零售淘系技术部
背景
手淘 ios APP 在 2019 年经过了约一年的时间,完成了 Swift 语言从调研到基础设施建设再到顺利落地业务。 手淘作为一个航母级别的 APP, 组织结构,工程结构,都是普通 APP 难以企及的,在手淘中实践犹如在沼泽地艰难探索,期间和集团内众多 Swift 爱好者,中间件负责人,一起努力探索出一条较为明朗的 Swift 落地指南。
时间轴
Swift 预研
Swift 语言在 2018 年就已经宣布 ABI 稳定是最重要的目标,虽然早在 Swift 4.x 时代, 语法就已基本不变,但受限于手淘是一个航母级 APP, 工程交付以二进制组件化为主,ABI 未稳定的 Swift 只能固定 Swift Toolchain 的版本,加之会有将近 3MB 的包大小压力,彼时都不适合引入 Swift。苹果与 2019年 3 月 25 日发布了 Swift 5.0 版本,宣布了 ABI 稳定,彼时又让团队的 Swift 燃起了信心,架构组作为新技术的把控团队,决定在百忙之余让团队成员各自分担一些对 Swift 的调研工作。 在工作之余,我们完成了调研工作,从中得到两个比较重要的结论。
▐ Swift 流行度
我们通过爬虫分析国内外 APP Store 排行榜 Top1000 的APP,通过文件扫描分析得到结论。
国内使用 Swift 的 APP 约占比 22%,美区使用 Swift 的 APP 约占比 78%,其中美区剩余没有使用 Swift的APP大部分来自中国地区本地化的产品,如抖音,快手等,可以得出一个结论,国内还是小众的 Swift,在国外已经是现状。
手淘在多年的历史迭代中,或多或少遗留了一些历史包袱,如 Cocoapods 不规范使用,头文件管理不规范,工程模版老旧。为了发现是否存在工程问题会导致 Swift 无法落地业务,我们尝试编写一个代码量适中的 SDK,来验证 Swift 的研发效率等提升。完成 SDK 初步重写后,我们发现了现有工程中遗留了大量的问题,导致现有的项目完全无法使用 Swift。 主要存在以下问题:
头文件不规范无法混编。
不支持 Module 无法被 Swift导入。
工具链老旧支持 Swift 源码开发调试。
Swift 5.0 不是 Module Stability, 对 Xcode 版本有强制限制。
适配基础库
为了解决 Swift 落地工程中的问题,我们结合集团 Swift 横向组织的力量,号召 Swift 爱好者,调研适配技术,编写适配文档,提供自动化工具,梳理出大量的 Swift 适配文档,推动中间件负责的同学,在不影响业务业务迭代的同时,顺手改掉历史包袱,满足Swift业务。 截至目前阶段,我们适配了约 100+ 基础库模块, 开启了强制打包卡口,长期有效的治理历史包袱,部分模块在治理历史包袱时,对自己的打包时常,和研发效率都有不小的提升。
Swift 是一门相对静态的语言,不同于 Objective-C 大部分通过 msg_send 动态调度,静态语言需要访问到其他依赖 SDK 的数据结构的静态布局信息,且手淘的研发方式是二进制依赖交付,容易造成下层 SDK 升级未通知上层 SDK 升级重新编译,带来的二进制不兼容问题很有可能留到线上在爆发,Swift 5.1 同时带来的 Library evoluation 功能帮助我们避免二进制不兼容问题发生。 以下是一份会打破二进制不兼容的 API 变动列表:
Change
Normal struct
@frozen struct
Adding fields
Allowed
Affects ABI
Reordering fields
Allowed
Affects ABI
Removing ABI-public fields
Affects ABI
Affects ABI
Removing non-ABI-public fields
Allowed
Affects ABI
Changing the type of an ABI-public field
Affects ABI
Affects ABI
Changing the type of a non-ABI-public field
Allowed
Affects ABI
Changing a stored instance property to computed
Allowed
Affects ABI
Changing a computed instance property to stored
Allowed
Affects ABI
Changing the access of a non-ABI-public field
Allowed
Allowed
Marking an internal field as @usableFromInline
Allowed
Allowed
Changing an internal ABI-public field to be public
Allowed
Allowed
业务完成
完成以上基本工作后,我们把之前重写的 SDK 通过回归测试后在手淘新版本正式上线,上线后的业务调用量等同于手淘UV,且 0 Crash, 对开发同学造成了极大的鼓舞,多位同学主动尝试使用 Swift 落地业务。
培训
在初期的业务落地中,我 Review 了大量的代码,发现各位同学写的代码还带有浓浓的 Objective-C 风格,甚至由于不习惯可选类型,引入了强制解包等语法,这些语法会在安全性造成隐患,极易Crash,我们了解到大量的同学 “看的懂Swift语法,但应对不了 Swift风格和混编环境” 为了解决这些问题,我们组织了集团一些 Swift 大牛,指定规划了一列课程帮助各位开发者轻松的过渡到 Swift 开发环境中 未来我们会考虑向业界开发者提供,敬请期待。
未来已来
手淘在完成 Swift 落地实践中产出了大量的适配文档,工具,教程,方法论,在 2019 年初我们指定的目标和方向已经基本完成,我们做到了!!!在 Swift 诞生这 6 年时间里,各位开发者一直在声称 Swift 是未来,但是在我们手淘架构组的努力下,Swift 不再是未来,而是此刻。 在接下来的计划里,我们会提供一种渐进式的 SDK 迁移方案,逐步将老旧 SDK 迁移到 Swift 中去,Swift 的高效研发效率和安全性将更易支撑业务的快速发展。
参考
ranking-programming-languages-by-github-users
Library-Evoluation
Developer SwiftUI
We are hiring 淘宝基础平台团队正在进行社招招聘,岗位有iOS android客户端开发工程师、Java研发工程师、C/C++研发工程师、前端开发工程师、算法工程师。欢迎投递简历至:junzhan.yzw@taobao.com 如果你想更详细了解淘宝基础平台团队,可点击“阅读原文”观看团队介绍视频更多淘宝基础平台团队的技术分享,可关注淘系技术微信公众号AlibabaMTT
END
了解更多 点击下方图片即可阅读
戳
“阅读原文”观看团队视频!
以上是关于从探索到落地,手淘引入 Swift “历险记”的主要内容,如果未能解决你的问题,请参考以下文章