网站首页 > 技术文章 正文
过去几年以来,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 层,后续我们还将不断与大家分享我们在发展道路中的见闻心得。
原文链接:
https://netflixtechblog.com/netflix-android-and-ios-studio-apps-kotlin-multiplatform-d6d4d8d25d23
延伸阅读:
Netflix的CEO:为什么我们愿意高薪雇佣程序员?-InfoQ
关注我并转发此篇文章,私信我“领取资料”,即可免费获得InfoQ价值4999元迷你书,点击文末「了解更多」,即可移步InfoQ官网,获取最新资讯~
猜你喜欢
- 2024-09-21 除了简洁,与Java互操作,Kotlin超过Java还有哪些优势?
- 2024-09-21 Java老矣!它的继承者在这几年究竟经历了什么
- 2024-09-21 开发一个支持跨平台的 Kotlin 编译器插件
- 2024-09-21 快速上手,使用 Kotlin 把支付宝小程序装进自己的App
- 2024-09-21 Kotlin 1.5新特性大揭秘:编程世界的全新飞跃
- 2024-09-21 SpringNative:把Spring项目编译成原生程序
- 2024-09-21 为什么 Flutter 使用 Dart 而不是另一种“更好”的语言
- 2024-09-21 一个项目,四种方式实现(Flutter、Kotlin、Weex、RN)
- 2024-09-21 AWS SDK for Kotlin 和 AWS SDK for Rust 上线!
- 2024-09-21 Spring Native 中文文档(spring5中文文档)
- 1514℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 567℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 509℃MySQL service启动脚本浅析(r12笔记第59天)
- 486℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 485℃启用MySQL查询缓存(mysql8.0查询缓存)
- 466℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 446℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 443℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)