【译】Netflix APP已经用上Kotlin 跨平台(KM)了

1,003 阅读5分钟

Netflix Android and iOS Studio Apps — now powered by Kotlin Multiplatform
作者: David Henry & Mel Yahya

原文链接

过去的几年Netflix一直在开发一款叫“Prodicle”的APP,来革新实体电视机的节目和电影。实体产品的世界发展很快,而且不同国家和宗教的区别很大,甚至同一款产品的下一代也变化巨大。这个工作的性质意味着我们正处在一个多样性的环境而开发软件编写成本很重,只有不到三分之一的用户的设备有可靠的网络连接,并且错误的边界定义也很有限。因为这些原因,作为一个小的工程师团队,我们发现要不断的优化可靠性和提高我们产品交付的速度才能满足我们客户日益增长的需求。

大概率的网络连接不稳定让我们投入更多精力去研究客户端侧健壮的持久化和离线能力的移动端解决方案。为了能做到快速产品的交付需求我们开始尝试跨平台的架构。我们开始进一步使用Kotlin跨平台(KM)用Kotlin实现平台无关的代码只需要编写一次,在Android端生成Kotlin的library而在iOS测通过Kotlin/Native生成二进制的framework。

1_p4iArxP5Q8XEcBmDPHchtw.png

Kotlin 跨平台

KM可以实现Android和iOS用一套代码复用相同的业务逻辑。你只需要写必要的平台相关的代码,比如,实现原生的UI或者是平台特性的API。

KM实现跨平台的方式跟我们熟悉的一些跨平台技术有点不同。其他跨平台技术一般都会对平台特性进行抽象或者完全替换,而KM是对已存在平台相关的特性的补充,并且目的是为了替换掉平台无关的业务逻辑。它不是为了取代工具箱而是工具箱里面一种新的工具。

这种方式适合我们有以下几个原因:

  1. 我们的Android和iOSAPP有类似的架构甚至在某些业务场景下是一模一样的业务逻辑两端都需需要实现。
  2. 差不多50%的Android和iOS的产品代码适合底层的平台是解耦的。
  3. 我们一直在探索各自平台最新的技术(Android Jetpack Compose,Swift UI等等)。

那么,我们到底用KM在做些什么呢?

管理经验

之前提到了,我们用户的需求从一个产品到下一个产品变化很大。这就需要引入大量的配置文件来控制各个功能是否可用,并且为每个产品做内置APP体验的优化。随着APP的增长,将这些配置相关的代码从APP里面解耦出来能降低代码的复杂度。我们内部开始探索这种共享代码的移动端SDK Hendrix。

Hendrix的核心是作为一门简单的解释型语言,用来表达配置文件的值怎么计算。这些表达式会在当前APP的上下文进行计算,可以拿到一些数据比如A/B Test赋值,本地化,设备属性等等。在我们的使用案例里面,我们用来配置产品的可用性,版本,以及一些宗教相关的需求集合等。

糟糕的网络连接和频繁的配置修改耦合到一起反应在用户活动就意味着更倾向于在设备侧的计算而不是在服务端计算。

这就导致我们需要一个轻量级的Hendrix 移动SDK,KM是一个很好的候选者,因为其大量的业务逻辑而且和平台无关。

实现

为了简单起见,我们跳过Hendrix的具体的细节,然后谈一下使用KM替代Kotlin/Swift 之后有处理了哪些差异。

构建

对于Android来说,几乎没有什么变化。Hendrix 跨平台SDK作为一个Android库依赖通过gradle引入,跟其他引入依赖方式没什么不同。在iOS端,二进制文件在Xcode工程里面作为通用的framework导入即可。

开发者工程学

KM的源码可以在android Studio和Xcode(支持lldb)里面编辑,重编译,并且可以通过断点调试。Android Studio是立即可用的,XCode需要TouchLab的xcode插件的支持。

0_whpdb2hoa55wg_uo.png

网络

Hendrix解释规则,远程的配置会下载到设备本地。我们使用Ktor的跨平台HttpClient去内嵌网络代码到我们的SDK里面。

磁盘缓存

当然,网络连接不可能一直可用,因此下载的规则集需要缓存到磁盘。为了实现缓存,我们在在用SQLDelight配合它Android和Native的数据库驱动一起做跨平台的持久化。

最后一点思考

我们过去几年一直在跟进KM的发展,并且认为这项技术已经达到反应的节点。针对XCode的的工具和构建系统集成都有很大的改进,集成KM后不需要去写和维护多种平台的代码所带来的收益是大于集成的复杂性和维护成本的。

我们的Android和iOS APP还有很多代码可以去实现共享。当考虑到JS也可以做到跨端,我觉得在不久的未来会变得更有意思。

我们很高兴能将我我们的移动APP迭代成共享业务逻辑的轻UI层架构,并且会持续的分享向大家分享我们在这条路上学到的东西。