Netflix 是如何實現(xiàn) Android 與 iOS 共用一套代碼?
過去幾年以來,Netflix 一直在開發(fā) Prodicle 移動應(yīng)用,借此在電視節(jié)目與電影制作領(lǐng)域推進(jìn)創(chuàng)新。時至今日,實體生產(chǎn)的具體方式可謂日新月異,不同國家、地區(qū)甚至是不同生產(chǎn)體系之間都存在著巨大的方法與需求層面的差異。工作性質(zhì)的變化,意味著我們需要在分布式環(huán)境中的設(shè)備上開發(fā)出高寫入強(qiáng)度軟件,其中約三分之一用戶的網(wǎng)絡(luò)連接條件并不穩(wěn)定,容錯能力也相當(dāng)有限。作為一支小型工程團(tuán)隊,我們意識到必須對可靠性及產(chǎn)品交付速度進(jìn)行優(yōu)化,才能滿足不斷變化的客戶需求。
由于網(wǎng)絡(luò)連接的可靠性不高,因此我們更傾向于推出移動解決方案,借此實現(xiàn)強(qiáng)大的客戶端持久性與脫機(jī)支持能力。為了快速交付產(chǎn)品,我們決定使用一套多平臺架構(gòu)。現(xiàn)在,我們使用 Kotlin Multiplatform 編寫平臺中立性業(yè)務(wù)邏輯,并通過 Kotlin/Native 將其編譯為分別面向 Android 的 Kotlin 庫與面向 iOS 的原生通用框架。

Kotlin Multiplatform允許我們在iOS與Android應(yīng)用程序的業(yè)務(wù)邏輯中使用同一套代碼庫。您只需在必要時編寫特定于平臺的代碼即可,例如實現(xiàn)原生UI或者使用特定于平臺的 API 時。
Kotlin Multiplatform 與以往各類知名跨平臺移動開發(fā)技術(shù)有所區(qū)別。其它技術(shù)主要以抽象化或者全面取代平臺特定開發(fā)方法作為主要訴求,并致力于替換掉一切特定平臺應(yīng)用開發(fā)方興未艾。與之相反,Kotlin Multiplatform 是對當(dāng)前平臺特定技術(shù)的補(bǔ)充,致力于替代各類平臺中立性業(yè)務(wù)邏輯。換言之,Kotlin Multiplatform 的訴求在于為解決方案庫帶來新工具,而非取代整個解決方案庫。
事實證明,新方案效果不錯,具體表現(xiàn)為:
我們的 Android 與 iOS studio 應(yīng)用獲得了共享架構(gòu),且能夠在兩套平臺上編寫相似甚至完全相同的業(yè)務(wù)邏輯。
在我們的 Android 與 iOS 應(yīng)用當(dāng)中,近 50% 的生產(chǎn)代碼與底層平臺保持解耦。
我們能夠靈活探索不同平臺(Android Jetpack Compose、Swift UI 等)上提供的最新技術(shù),再無任何后顧之憂。
那么,我們是如何使用 Kotlin Multiplatform 的?
如前所述,用戶在不同產(chǎn)品中的實際需求存在巨大差異。具體而言,這些差異將轉(zhuǎn)化為大量應(yīng)用程序配置,要求我們切換可用功能并優(yōu)化每款產(chǎn)品的應(yīng)用內(nèi)體驗。而將應(yīng)用當(dāng)中負(fù)責(zé)管理這些配置的代碼解耦出來,將有助于降低應(yīng)用程序的復(fù)雜性。我們對代碼共享的首次探索,是為內(nèi)部體驗管理工具 Hendrix 建立移動 SDK。
Hendrix 的核心是一自足簡單的解釋語言,用于表示如何計算配置值。這些表達(dá)式將配合當(dāng)前應(yīng)用會話上下文進(jìn)行評估,并能夠訪問 A/B 測試分配、位置、設(shè)備屬性等數(shù)據(jù)。在我們的用例中,具體配置范圍包括生產(chǎn)可用性、版本以及特定區(qū)域應(yīng)用功能集等。
糟糕的網(wǎng)絡(luò)連接以及用戶活動響應(yīng)配置中的頻繁值變更,意味著我們有必要將規(guī)則評估從服務(wù)器端遷移至更靈活的用戶設(shè)備端。
為此,我們需要構(gòu)建輕量化 Hendrix 移動 SDK——在這方面,Kotlin Multiplatform 憑借著強(qiáng)大的業(yè)務(wù)邏輯與全面的平臺中立性脫穎而出。
為了簡便起見,這里我們不再介紹 Hendrix 中的特定細(xì)節(jié),主要講解使用 Kotlin Multiplatform 替代 Kotlin/Swift 中的一些差異。
對于 Android,一切照常運行,不受太多影響。Hendrix Multiplatform SDK 通過 gradle 以 Android 庫項目依賴項的形式進(jìn)行導(dǎo)入。而在 iOS 方面,原生二進(jìn)制文件將作為通用框架被包含在 Xcode 項目當(dāng)中。
Kotlin Multiplatform 源代碼可以進(jìn)行編輯、重新編譯,并能夠在 Android Studio 與 Xcode 中配合一款帶有斷點的調(diào)試器(包括 lldb 支持)。Android Studio 可實現(xiàn)開箱即用,在 Xcode 中則需要通過 TouchLabs 的 xcode-kotlin 插件使用。
通過 Xcode 調(diào)試 Kotlin 源代碼
Hendrix 解釋規(guī)則集(即遠(yuǎn)程可配置文件)已被下載至設(shè)備。這里我們使用 Ktor 的 MultiplatformHttpClient 將網(wǎng)絡(luò)代碼嵌入至 SDK 當(dāng)中。
當(dāng)然,有時候網(wǎng)絡(luò)連接的可用性將無法保證,因此需要將下載的規(guī)則集緩存到磁盤當(dāng)中。為此,我們使用 SQLDelight 及其 Android 與原生數(shù)據(jù)庫驅(qū)動程序?qū)崿F(xiàn) Multiplatform 的持久存儲。
過去幾年以來,我們一直密切關(guān)注 Kotlin Multiplatform 的發(fā)展,也堅信項目已經(jīng)迎來發(fā)展拐點。Xcode 的工具與構(gòu)建系統(tǒng)集成已經(jīng)得到顯著改善,用戶不必編寫及維護(hù)特定于多種平臺的實現(xiàn),能夠?qū)⒐?jié)約下來的精力投入到更具價值的應(yīng)用設(shè)計與開發(fā)當(dāng)中。
我們的 Android 與 iOS Studio 應(yīng)用之間還存在著廣闊的代碼共享空間。也許未來我們還會再進(jìn)行一輪 JavaScript 轉(zhuǎn)換,相信這也將是個非常有趣的話題。
我們很高興能夠?qū)?Studio 移動應(yīng)用開發(fā)為具有共享業(yè)務(wù)邏輯的瘦 UI 層,后續(xù)我們還將不斷與大家分享我們在發(fā)展道路中的見聞心得。
https://netflixtechblog.com/netflix-android-and-ios-studio-apps-kotlin-multiplatform-d6d4d8d25d23
-End-
最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來,可以說是程序員面試必備!所有資料都整理到網(wǎng)盤了,歡迎下載!

面試題】即可獲取