神譯局是36氪旗下編譯團隊,關注科技、商業、職場、生活等領域,重點介紹國外的新技術、新觀點、新風向。
編者按:移動app開發最煩人的地方在於,針對不同的平臺(Android/iOs),開發者需要開發不同的版本,能不能像Java那樣一次編寫,到處運行呢?Netflix的移動app開發團隊利用Kotlin Multiplatform進行了這方面的探索,這次他們首先實驗的是將業務邏輯抽離出來,讓兩種app共享。原文發表在其官方技術博客上,標題是:Netflix Android and iOS Studio Apps — now powered by Kotlin Multiplatform
過去幾年的時間裡,Netflix一直在開發著一款移動app,名字叫做Prodicle,我們希望能夠對電視節目和電影的實際拍攝進行創新。實際拍攝的世界節奏很快,在不同的國家、地區之間,甚至從一種拍攝到另一種拍攝之間,需求都會有很大的不同。這項工作的性質意味著我們要在分布式的環境下,在不到1/3的用戶設備擁有非常可靠的連接,且誤差容許量有限的情況下,開發需要大量寫操作的軟體。出於這些原因,作為一個小型工程團隊,我們發現,為了可靠性和產品交付速度而進行優化,是我們成功滿足不斷提高的客戶需求所必需的。
網絡連接不可靠的可能性很高,這使得我們被迫要依靠移動解決方案來獲得健壯的客戶端持久性和離線支持。快速交付產品的需求讓我們開始嘗試多平臺架構。現在,通過利用Kotlin Multiplatform,用Kotlin一次性編寫與平臺無關的業務邏輯,然後針對Android編譯成Kotlin庫,針對iOS通過Kotlin/Native編譯成原生的Universal Framework,我們又更進了一步。
Kotlin Multiplatform可以讓你將單一的業務邏輯代碼庫應用到iOS和Android app上面。你只需要在必要的是編寫平臺相關代碼,比方說,實現原生UI,或者要利用平臺相關API時。
Kotlin Multiplatform的跨平臺移動開發方案跟這個領域的一些知名技術不一樣。別的技術都是把平臺相關的app開發抽象化或者完全取代掉,Kotlin Multiplatform卻是對現有平臺相關技術的補充,致力於替代與平臺無關的業務邏輯。這算是給現有工具箱增加一個新工具,而不是要把工具箱替換掉。
這種做法對我們來說效果很好,原因有這麼幾個:
我們的Android和iOS Studio app有著共同的體系結構,兩個平臺都寫有類似或者在某些情況下相同的業務邏輯。
我們的Android和iOS app裡面幾乎50%的生產代碼都是跟底層平臺分離的。
我們對探索各自平臺提供的最新技術(Android Jetpack Compose,Swift UI等)的渴望絲毫沒有受到任何阻礙。
那麼,我們用它來幹什麼呢?
如前所述,我們的用戶需求在不同產品之間的差異很大。這種差異會轉化為大量的app配置,對功能可用性進行切換,要優化每個產品的應用內體驗。把管理這些配置的代碼跟app本身去耦合,可以有助於降低app的複雜性。我們對代碼共享的首次探索包括我們的內部體驗管理工具Hendrix的移動SDK實現。
Hendrix的核心是一種用來表示應該如何計算配置值的簡單解釋性語言。這些表達式是在當前app會話的上下文中計算的,而且可以訪問類似A / B測試作業、位置、設備屬性等數據。我們的用例是配置產品的可用性,版本,以及特定區域的應用功能集。
糟糕的網絡連接再加上為了響應用戶活動而頻繁變更配置值,意味著在設備側進行規則計算要比在伺服器端進行計算更好。
於是我們就開發了輕量級的Hendrix移動SDK——而這是應用Kotlin Multiplatform的理想選擇,因為它需要大量的業務邏輯,並且完全與平臺無關。
為簡便起見,Hendrix的具體細節我們就跳過不談了,這裡就講講用Kotlin Multiplatform來替代Kotlin / Swift會涉及到的一些差異。
Build
對於Android來說,一切照舊。就像其他任何的依賴項一樣,Hendrix Multiplatform SDK會被當成Android庫項目依賴項,通過gradle導入進來。至於iOS,原生二進位文件作為通用框架已包含在Xcode項目裡面。
開發人員工效學
Kotlin Multiplatform的源碼可以進行編輯,重新編譯,並且可以給Android Studio和Xcode附上帶有斷點的調試器(包括lldb支持)。Android Studio開箱即用,還可以通過TouchLabs的xcode-kotlin插件實現對Xcode的支持。
通過Xcode調試Kotlin源碼。
網絡
Hendrix會對規則集——已下載到設備本地的遠程可配置文件,做出解釋。我們用Ktor的Multiplatform HttpClient來把我們的網絡代碼嵌入到SDK裡面。
磁碟緩存
當然,網絡連接未必總能在線,所以需要把下載的規則集緩存到磁碟上。為了實現Multiplatform的持久性,我們用了SQLDelight以及它的Android與Native Database驅動程序。
在過去幾年的時間裡,我們一直在密切關注Kotlin Multiplatform的發展,現在我們認為這項技術已經達到拐點。Xcode的工具和構建系統集成已經得到了顯著改善,相較而言,不必編寫和維護多個平臺相關的實現所帶來的好處,已經大大超過了集成和維護所牽涉到的複雜性。
我們的Android和iOS Studioapp之間還有很多其他的代碼共享的機會。考慮到JavaScript transpilation(一種從源碼到另一種源碼的編譯)也有可能性時,這項技術的潛在未來應用會變得更加有趣。
我們的studio移動app有可能會演進為瘦UI層+共享業務邏輯,我們對這種可能性感到興奮,我們會繼續將在這條道路上學到的東西分享給大家的。
譯者:boxi。