Categories
程式開發

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


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

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

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

Kotlin多平台

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 插件使用。

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

通過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