Netflix 是如何實現 Android 與 iOS 共用一套代碼?

過去幾年以來,Netflix 一直在開發 Prodicle 移動應用,藉此在電視節目與電影製作領域推進創新。時至今日,實體生產的具體方式可謂日新月異,不同國家、地區甚至是不同生產體系之間都存在着巨大的方法與需求層面的差異。工作性質的變化,意味着我們需要在分佈式環境中的設備上開發出高寫入強度軟件,其中約三分之一用戶的網絡連接條件並不穩定,容錯能力也相當有限。作爲一支小型工程團隊,我們意識到必須對可靠性及產品交付速度進行優化,才能滿足不斷變化的客戶需求。

由於網絡連接的可靠性不高,因此我們更傾向於推出移動解決方案,藉此實現強大的客戶端持久性與脫機支持能力。爲了快速交付產品,我們決定使用一套多平臺架構。現在,我們使用 Kotlin Multiplatform 編寫平臺中立性業務邏輯,並通過 Kotlin/Native 將其編譯爲分別面向 Android 的 Kotlin 庫與面向 iOS 的原生通用框架。

Kotlin Multiplatform

Kotlin Multiplatform允許我們在iOS與Android應用程序的業務邏輯中使用同一套代碼庫。您只需在必要時編寫特定於平臺的代碼即可,例如實現原生UI或者使用特定於平臺的 API 時。

Kotlin Multiplatform 與以往各類知名跨平臺移動開發技術有所區別。其它技術主要以抽象化或者全面取代平臺特定開發方法作爲主要訴求,並致力於替換掉一切特定平臺應用開發方興未艾。與之相反,Kotlin Multiplatform 是對當前平臺特定技術的補充,致力於替代各類平臺中立性業務邏輯。換言之,Kotlin Multiplatform 的訴求在於爲解決方案庫帶來新工具,而非取代整個解決方案庫。

事實證明,新方案效果不錯,具體表現爲:

  1. 我們的 Android 與 iOS studio 應用獲得了共享架構,且能夠在兩套平臺上編寫相似甚至完全相同的業務邏輯。
  2. 在我們的 Android 與 iOS 應用當中,近 50% 的生產代碼與底層平臺保持解耦。
  3. 我們能夠靈活探索不同平臺(Android Jetpack Compose、Swift UI 等)上提供的最新技術,再無任何後顧之憂。

那麼,我們是如何使用 Kotlin Multiplatform 的?

體驗管理

如前所述,用戶在不同產品中的實際需求存在巨大差異。具體而言,這些差異將轉化爲大量應用程序配置,要求我們切換可用功能並優化每款產品的應用內體驗。而將應用當中負責管理這些配置的代碼解耦出來,將有助於降低應用程序的複雜性。我們對代碼共享的首次探索,是爲內部體驗管理工具 Hendrix 建立移動 SDK。

Hendrix 的核心是一自足簡單的解釋語言,用於表示如何計算配置值。這些表達式將配合當前應用會話上下文進行評估,並能夠訪問 A/B 測試分配、位置、設備屬性等數據。在我們的用例中,具體配置範圍包括生產可用性、版本以及特定區域應用功能集等。

糟糕的網絡連接以及用戶活動響應配置中的頻繁值變更,意味着我們有必要將規則評估從服務器端遷移至更靈活的用戶設備端。

爲此,我們需要構建輕量化 Hendrix 移動 SDK——在這方面,Kotlin Multiplatform 憑藉着強大的業務邏輯與全面的平臺中立性脫穎而出。

實現

爲了簡便起見,這裏我們不再介紹 Hendrix 中的特定細節,主要講解使用 Kotlin Multiplatform 替代 Kotlin/Swift 中的一些差異。

構建

對於 Android,一切照常運行,不受太多影響。Hendrix Multiplatform SDK 通過 gradle 以 Android 庫項目依賴項的形式進行導入。而在 iOS 方面,原生二進制文件將作爲通用框架被包含在 Xcode 項目當中。

面向開發者的人體工程學

Kotlin Multiplatform 源代碼可以進行編輯、重新編譯,並能夠在 Android Studio 與 Xcode 中配合一款帶有斷點的調試器(包括 lldb 支持)。Android Studio 可實現開箱即用,在 Xcode 中則需要通過 TouchLabs 的 xcode-kotlin 插件使用。

通過 Xcode 調試 Kotlin 源代碼

網絡

Hendrix 解釋規則集(即遠程可配置文件)已被下載至設備。這裏我們使用 Ktor 的 MultiplatformHttpClient 將網絡代碼嵌入至 SDK 當中。

磁盤緩存

當然,有時候網絡連接的可用性將無法保證,因此需要將下載的規則集緩存到磁盤當中。爲此,我們使用 SQLDelight 及其 Android 與原生數據庫驅動程序實現 Multiplatform 的持久存儲。

總結

過去幾年以來,我們一直密切關注 Kotlin Multiplatform 的發展,也堅信項目已經迎來發展拐點。Xcode 的工具與構建系統集成已經得到顯著改善,用戶不必編寫及維護特定於多種平臺的實現,能夠將節約下來的精力投入到更具價值的應用設計與開發當中。

我們的 Android 與 iOS Studio 應用之間還存在着廣闊的代碼共享空間。也許未來我們還會再進行一輪 JavaScript 轉換,相信這也將是個非常有趣的話題。

我們很高興能夠將 Studio 移動應用開發爲具有共享業務邏輯的瘦 UI 層,後續我們還將不斷與大家分享我們在發展道路中的見聞心得。

原文鏈接:

https://netflixtechblog.com/netflix-android-and-ios-studio-apps-kotlin-multiplatform-d6d4d8d25d23

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章