
作者|姜沂(傾寒)
出品|阿裡巴巴新零售淘系技術部
背景
手淘 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,在國外已經是現狀。
Github/Stack Over Flow 社群等 Objective-C 開源庫和問題提問已經基本停滞,未來我們在落地新技術,Objective-C 可能已經是最壞的打算,加之 WWDC 17年以來,蘋果不再提供 Objective-C 的示例,組内同學也多次遇見 Objective-C Bug去社群提問,毫無熱度的情況。
蘋果在 WWDC19 年釋出了 4 個 Pure Swift 架構,無法簡單的被 Objective-C 混編。
未來我們極有可能因為蘋果的強制推進風格和社群文化的落後産生技術踏空,無法迅速響應業務,甚至無法招聘到會使用 Objective-C 的工程師。
▐ Swift 研發效率
Swift 從誕生之初就是一門先進的語言,主要有三個特性。
- Safe Swift 從文法層面避免了很多未定義的行為,空值通路,值類型,對工程的穩定性有非常正面的好處,曾經面試一個候選人,簡單重寫為 Swift 讓項目的崩潰率降低 30%。
- Fast,Swift 的語言設計讓更多的方法排程通過靜态排程完成,語言運作時效率優于 Objective - C。
- Expressive, 富有表現力的文法特性,讓代碼量清晰已了解,減少的代碼量約有30%-50%不等,簡潔的代碼也讓一些 Bug 無處藏身,也讓工程師能更高效的支撐業務發展,大大提升了研發效率。
下圖是一個業務子產品重寫後的代碼量對比:
▐ 其他不利因素
Swift 雖然在 5.0 版本完成了 ABI 穩定,但是在低版本作業系統中 (iOS 12.2 以下) 仍舊會有一些不夠完美的地方。
在低于 iOS12.2 以下的作業系統會帶來約有 3MB 的包大小問題,但幸運的是蘋果放開了蜂窩資料網絡下 200M 的下載下傳大小。在 iOS13 上甚至可以超過 200MB。
在低于 iOS12.2 以下的作業系統會有 100-200ms不等的啟動耗時增加,但在團隊同學的努力下上線了二進制重排,啟動性能大幅度上升 具體分析請看 手淘架構組最新實踐 | iOS基于靜态庫插樁的⼆進制重排啟動優化。
集團橫向組織成立
在充分的說明了 Swift 的優勢和未來的情況下,我們決定不再停留與各種了解,準備下決心落地 Swift,畢竟所有的 iOSer 都知道,Swift 是未來,但是喊了這麼多年的口号,總需要有組織的向前推進,隻有自己做了并且落地了才有未來。
在基礎會議上讨論了一些 關于 Swift 落地的計劃和核心任務。如 Swift 基礎建設,基礎庫适配,Xcode 更新, 以及新架構 SwiftUI, Combine, 容器化架構等。
并逐漸拆解任務,落地下去。
SwiftUI & GAIA FaaS
在了解 Swift 的同時恰逢 WWDC19, 蘋果與 WWDC 推出了跨 Apple 平台下一代聲明式的 UI 布局架構 “SwiftUI”。作者第一時間了解了 SwiftUI 的方方面面的特性,簡潔清晰的 DSL, 表現力十足的資料流管理,能減少傳統 Cocoa 指令式程式設計 80% 的代碼,對研發效率有極大提升。
以下是一個簡單的代碼展示
同時我們日常工作中一直有值班看資料大盤的訴求,有時甚至需要在外出的時候檢視,之前我們不得不攜帶工作電腦,迫切需要一款移動值班的APP,剛好出來的 SwiftUI 新技術可以幫助我們快速落地原型。
但此時沒有後端支援,我們想到了 GAIA 平台, GAIA 平台是一款 FaaS 平台的風格,且 Swift 是一門跨平台語言,早在很早 IBM 就曾有 Serverless 服務,于是我們使用 Swift 遵守GAIA規範實作了一套 FaaS 服務,作為我們的資料大盤後端支撐。
之前已經編寫了多篇文章分析了 SwiftUI 和 FaaS 的核心實作,這裡就不再贅述,更多資訊詳見。(點選标題即可閱讀)
新晉網紅SwiftUI——淘寶帶你初體驗 系列文章深度解讀|SwiftUI 背後那些事兒 曆時五天用 SwiftUI 做了一款 APP,阿裡工程師如何做的? Swift 在 GAIA 平台雲端一體化的探索▐ SwiftUI 的未來
随着前面的調研,使用分析等,雖然 SwiftUI 在初期使用UIKit/APPKit 在性能上略顯不足于 Flutter,但是SwiftUI 的 DSL 和其他特性比Flutter 簡介不少,相信蘋果在未來的版本種會持續優化,現在的技術儲備讓我們可以輕松應對未來 SwiftUI 的落地。
業務子產品重寫
手淘在多年的曆史疊代中,或多或少遺留了一些曆史包袱,如 Cocoapods 不規範使用,頭檔案管理不規範,工程模版老舊。
為了發現是否存在工程問題會導緻 Swift 無法落地業務,我們嘗試編寫一個代碼量适中的 SDK,來驗證 Swift 的研發效率等提升。
完成 SDK 初步重寫後,我們發現了現有工程中遺留了大量的問題,導緻現有的項目完全無法使用 Swift。
主要存在以下問題:
- 頭檔案不規範無法混編。
- 不支援 Module 無法被 Swift導入。
- 工具鍊老舊支援 Swift 源碼開發調試。
- Swift 5.0 不是 Module Stability, 對 Xcode 版本有強制限制。
适配基礎庫
為了解決 Swift 落地工程中的問題,我們結合集團 Swift 橫向組織的力量,号召 Swift 愛好者,調研适配技術,編寫适配文檔,提供自動化工具,梳理出大量的 Swift 适配文檔,推動中間件負責的同學,在不影響業務業務疊代的同時,順手改掉曆史包袱,滿足Swift業務。
截至目前階段,我們适配了約 100+ 基礎庫子產品, 開啟了強制打包卡口,長期有效的治理曆史包袱,部分子產品在治理曆史包袱時,對自己的打包時常,和研發效率都有不小的提升。
适配 Xcode + Cocoapods
手淘的開發模式不同于其他中小型 APP,我們的開發團隊複雜,傳遞方式主要由打包 SDK 二進制內建為主,但Swift 5.1 才滿足了 Module Stability,蘋果于 9 月份才正式推出 Swift 5.1, 我們開始着手更新 Xcode11。
對于手淘這樣的 APP, 每年更新 Xcode 也會帶來大量的 Break Change Future,我們通過檢視官方文檔,提供适配方案,推動業務方修改了大量 Bug 适應了大量 Futuer,我們與 11月初完成了 Xcode11 的适配工作。
同時由于 Cocoapods 1.5.x 才支援 Swift 靜态庫,我們将 Cocoapods 更新到了 1.7.5, 更新還帶來不少SDK 打包效率巨大的提升。
▐ Swift 二進制不相容研究
Swift 是一門相對靜态的語言,不同于 Objective-C 大部分通過 msg_send 動态排程,靜态語言需要通路到其他依賴 SDK 的資料結構的靜态布局資訊,且手淘的研發方式是二進制依賴傳遞,容易造成下層 SDK 更新未通知上層 SDK 更新重新編譯,帶來的二進制不相容問題很有可能留到線上在爆發,Swift 5.1 同時帶來的 Library evoluation 功能幫助我們避免二進制不相容問題發生。
以下是一份會打破二進制不相容的 API 變動清單:
業務完成
完成以上基本工作後,我們把之前重寫的 SDK 通過回歸測試後在手淘新版本正式上線,上線後的業務調用量等同于手淘UV,且 0 Crash, 對開發同學造成了極大的鼓舞,多位同學主動嘗試使用 Swift 落地業務。
教育訓練
在初期的業務落地中,我 Review 了大量的代碼,發現各位同學寫的代碼還帶有濃濃的 Objective-C 風格,甚至由于不習慣可選類型,引入了強制解包等文法,這些文法會在安全性造成隐患,極易Crash,我們了解到大量的同學 “看的懂Swift文法,但應對不了 Swift風格和混編環境” 為了解決這些問題,我們組織了集團一些 Swift 大牛,指定規劃了一列課程幫助各位開發者輕松的過渡到 Swift 開發環境中 未來我們會考慮向業界開發者提供,敬請期待。
未來已來
手淘在完成 Swift 落地實踐中産出了大量的适配文檔,工具,教程,方法論,在 2019 年初我們指定的目标和方向已經基本完成,我們做到了!!!
在 Swift 誕生這 6 年時間裡,各位開發者一直在聲稱 Swift 是未來,但是在我們手淘架構組的努力下,Swift 不再是未來,而是此刻。
在接下來的計劃裡,我們會提供一種漸進式的 SDK 遷移方案,逐漸将老舊 SDK 遷移到 Swift 中去,Swift 的高效研發效率和安全性将更易支撐業務的快速發展。
參考
手淘架構組最新實踐 | iOS基于靜态庫插樁的⼆進制重排啟動優化
ranking-programming-languages-by-github-users
We are hiring
淘寶基礎平台團隊正在進行社招招聘,崗位有iOS Android用戶端開發工程師、Java研發工程師、C/C++研發工程師、前端開發工程師、算法工程師。
歡迎投遞履歷至:[email protected]
更多淘寶基礎平台團隊的技術分享,可關注淘系技術微信公衆号AlibabaMTT