Netflix的Kotlin多平台

2020-10-30 01:07:53

在过去的几年里,Netflix一直在开发一款名为Prodicle的移动应用程序,以创新电视节目和电影的实体制作。物质生产的世界是快节奏的,国家、地区之间的需求差异很大,甚至从一种生产到另一种生产也是如此。这项工作的性质意味着我们要在分布式环境中开发编写繁重的软件,在这些设备上,只有不到⅓的用户在现场具有非常可靠的连接,并且错误容限有限。出于这些原因,作为一个小型工程团队,我们发现要想成功地满足不断变化的客户需求,必须优化产品交付的可靠性和速度。

网络连接不可靠的可能性很高,这导致我们求助于移动解决方案,以实现强大的客户端持久性和离线支持。为了快速交付产品,我们尝试了多平台架构。现在我们更进一步,使用Kotlin MultiPlatform在Kotlin中编写平台无关的业务逻辑,并通过Kotlin/Native编译成适用于Android的Kotlin库和适用于iOS的本机通用框架。

Kotlin MultiPlatform允许您使用单个代码库来处理iOS和Android应用程序的业务逻辑。例如,在需要实现本机UI或使用特定于平台的API时,您只需要编写特定于平台的代码。

Kotlin MultiPlatform处理跨平台移动开发的方式与该领域的一些知名技术不同。在其他技术抽象或完全取代特定于平台的应用程序开发的情况下,Kotlin MultiPlatform是对现有特定于平台的技术的补充,旨在取代与平台无关的业务逻辑。这是工具箱中的一个新工具,而不是取代工具箱。

我们的Android和iOS工作室应用程序有一个共享的架构,在两个平台上编写的业务逻辑相似,甚至在某些情况下是相同的。

在我们的Android和iOS应用程序中,几乎50%的生产代码与底层平台分离。

我们探索各自平台(Android Jetpack Compose、Swift UI等)提供的最新技术的胃口丝毫没有受到任何阻碍。

如前所述,我们的用户需求从一种产品到另一种产品差别很大。这意味着需要进行大量的应用程序配置,以切换功能可用性并优化每个产品的应用内体验。将管理这些配置的代码与应用程序本身解耦有助于降低应用程序增长时的复杂性。我们对代码共享的第一次探索涉及到为我们的内部体验管理工具Hendrix实现移动SDK。

本质上,Hendrix是一种简单的解释型语言,表示应该如何计算配置值。这些表达式在当前应用程序会话上下文中求值,可以访问A/B测试分配、位置、设备属性等数据。对于我们的用例,我们正在配置特定于生产、版本和区域的应用程序功能集的可用性。

网络连通性差,加上响应用户活动而频繁更改配置值,意味着设备上的规则评估比服务器端评估更可取。

这导致我们构建了一个轻量级的Hendrix移动SDK-Kotlin MultiPlatform的一个很好的候选者,因为它需要重要的业务逻辑,并且完全与平台无关。

为简洁起见,我们将跳过Hendrix的具体细节,并触及使用Kotlin MultiPlatform代替Kotlin/Swift所涉及的一些不同之处。

对于Android来说,一切如常。Hendrix多平台SDK通过Gradle作为Android库项目依赖项导入,其方式与任何其他依赖项相同。在iOS端,本机二进制文件作为通用框架包含在Xcode项目中。

Kotlin多平台源代码可以编辑、重新编译,并且可以在Android Studio和Xcode中附加断点的调试器(包括lldb支持)。Android Studio开箱即用,Xcode支持通过TouchLabs的Xcode-Kotlin插件实现。

Hendrix解释规则集-下载到设备的远程可配置文件。我们使用KTOR的多平台HttpClient将我们的网络代码嵌入到SDK中。

当然,网络连接可能并不总是可用的,因此需要将下载的规则集缓存到磁盘。为此,我们使用SQLDelight以及它的Android和Native Database驱动程序来实现多平台持久化。

在过去的几年里,我们一直在密切关注Kotlin多平台的发展,并相信这项技术已经达到了一个转折点。Xcode的工具和构建系统集成得到了显著改进,因此不必编写和维护多个特定于平台的实现的好处盖过了集成和维护所涉及的复杂性。

我们的Android和iOS工作室应用程序之间有大量的额外代码共享机会。当我们考虑到Javascript转换也是可能的时,这项技术的潜在未来应用变得更加有趣。

我们很高兴我们的工作室移动应用程序可以演变成具有共享业务逻辑的薄UI层,并将继续在此过程中与您分享我们的经验教训。