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

2020-11-24 富寶資訊

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

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

Kotlin Multiplatform

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

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

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

我們的 Android 與 iOS studio 應用獲得了共享架構,且能夠在兩套平臺上編寫相似甚至完全相同的業務邏輯。

在我們的 Android 與 iOS 應用當中,近 50% 的生產代碼與底層平臺保持解耦。

我們能夠靈活探索不同平臺(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 插件使用。

網絡

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

磁碟緩存

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

總 結

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

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

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

相關焦點

  • 讓安卓與IOS共用代碼,Netflix是如何實現的?
    為了快速交付產品以滿足客戶需求,我們決定嘗試使用一套多平臺架構。目前我們正在這一點上發力,使用Kotlin Multiplatform編寫平臺無關性業務邏輯,並通過Kotlin/Native技術將其編譯為分別面向Android系統的Kotlin庫和面向iOS系統的本地通用框架。
  • 在Android 中,使用簡單的幾行代碼實現複雜、漂亮的動畫
    要使用比較複雜、漂亮的動畫,使用 Android API 就比較難以實現了,或者說需要花更多的時間,往往還達不到理想中的視覺效果。比如,如下動畫的實現該動畫效果來自 lottie 官方。這個動畫如果使用幀動畫來實現,很可能就會出現 oom。這個動畫複雜在哪?
  • Google I/O 2019 Android 應用原始碼現已發布
    更多內容,請閱讀《手勢導航: 實現邊到邊的全屏體驗》系列連載,或請前往 Github 查看團隊在 Google I/O 應用庫中提交的相關代碼,了解如何將應用內容擴展到屏幕邊緣。更多內容,請收看 Google I/O 大會上關於深色主題背景與手勢導航的專題分享, 或查看 Github 上 Google I/O 應用庫中團隊所提交的三份代碼 (初步實現、風格修復以及更多更新),了解深色主題背景在真實應用中的具體實現方式。深色主題背景下的日程表 UIhttps://www.youtube.com/watch?
  • Android Studio基礎-選項菜單Java實現實例
    Android提供了兩種創建菜單的方法,一種是在java代碼中創建,另一種是使用xml資源文件定義 一、效果圖: 三、代碼實現 public class MainActivity extends Activity {
  • Android - android xml 層級專題及常見問題 - CSDN
    這節教程將學習如何來組織應用程式資源,指定替代資源,並在應用程式中訪問它們。在eclipse中組織資源你需要將每種資源放置在項目中 res/ 目錄的特定子目錄下。下面的章節介紹如何分別在這兩種場景中訪問資源。在代碼訪問資源當 Android 應用程式被編譯,生成一個 R 類,其中包含了所有 res/ 目錄下資源的 ID。你可以使用 R 類,通過子類+資源名或者直接使用資源 ID 來訪問資源。
  • NetflixTOP10年度美劇之《怪奇物語》
    PS:灰網加速提供netflix國內通道服務,支持4K,跨平臺支持,手機、平板、電視、電腦等。android/mac/ios/merlin/openWRT等。讓你輕鬆觀看各種大片佳片
  • android電源管理 - OFweek電子工程網
    framework層主要有這兩個文件:  frameworks\base\core\java\android\os\PowerManager.java  frameworks\base\services\java\com\android\server\PowerManagerService.java  其中PowerManager.java
  • 駭極乾貨|第2期:Android日誌系統分析
    Liblog提供的接口實現在logd_write.c文件中,它的位置如下:其中實現了一系列的日誌寫入函數,如下圖所示:其中_android_log_assert, _android_log_vprint和_android_log_print用來寫入類型為
  • Android系統開機動畫的一生
    前言在上篇文章【Android從上電到加載launcher,都發生了啥】中,簡單介紹了Android系統從上電到加載launcher的流程,但比較粗略,特別是init之後,開機動畫如何啟動,又如何結束的,絲毫沒有涉及,這篇文章就來好好說說。
  • 谷歌終於為谷歌Nexus4發布了Android5.0Lollipop工廠映像
    XDA公認的開發人員cybojenix足夠友好,可以提供差異以顯示自android-5.0.0_r5修訂版以來的代碼差異,因此您可以檢查自那時以來已修復的問題。按照Google的發布時間表,我們應該期待android-5.0_r7,它將最終為Nexus 7的移動數據版本帶來支持。
  • Android ConstraintLayout約束布局可視化工具使用~
    :constraint-layout:1.0.2'<android.support.constraint.ConstraintLayoutandroid:layout_width="match_parent"
  • 全程手把手教你實現Android自動化測試,實踐案例分享
    代碼解釋:使用Java代碼實現View(控制項)點擊輸入操作6. 通過View(控制項)的Text屬性捕獲控制項的情形:7. 通過View(控制項)的Class與索引屬性捕獲控制項的情形:1、view(控制項)沒有ID與Text屬性。
  • android啟動頁設計專題及常見問題 - CSDN
    這篇文章主要包括以下兩方面內容 集成騰訊廣告聯盟的SDK 啟動頁加載過程中,後臺初始化數據 我們在設計啟動頁時的常規做法是建立一個Activity來加載開屏圖片或者廣告,作為程序的入口,那麼在這個三到五秒時間內如果進行數據下載,當用戶點擊了跳過按鈕或者計時結束了數據還沒初始化完成,已經進入了主頁面,而主界面剛好需要那些基礎數據該如何?
  • 如何用 Python 寫一個安卓 APP ?
    開發安卓APP  我們使用kivy開發安卓APP,Kivy是一套專門用於跨平臺快速應用開發的開源框架,使用Python和Cython編寫,對於多點觸控有著非常良好的支持,不僅能讓開發者快速完成簡潔的交互原型設計,還支持代碼重用和部署,絕對是一款頗讓人驚豔的NUI框架。
  • 想讓Android手機開掛,安裝Xposed框架就行了!
    其通過替換Android系統的關鍵文件,可以攔截幾乎所有Java函數的調用,並允許通過模塊擴展方式來實現各種功能,模塊中的自定義代碼可以更改調用函數時的行為,常被用來修改Android系統和應用程式的功能。用戶可以在一些應用商店或其自帶的下載庫來下載安裝各種模塊,相比於重新安裝系統來獲得新功能,Xposed提供了一種更便捷的方式[1][2]。
  • 【Android改機系列】一鍵新機原理剖析
    >const-string vX, "加密後的字符串"invoke-static {vX}, Lcom/test/decString(Ljava/lang/String;)Ljava/lang/String;move-result-object vX這個案例也不例外,所以編寫一個腳本去匹配以上代碼
  • android app被殺原因專題及常見問題 - CSDN
    分析長按HOME鍵清理App最終會執行到ActivityManagerService.cleanUpRemovedTaskLocked方法中,ActivityManagerService類在文件"frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java"中,