Mobile

Cash App 案例研究:在舒适区中从 KMM 受益

Read this post in other languages:
English

来自 Cash App 的 Alec Strong 分享了他们使用 KMM 并从移动端跨平台共享代码中受益的故事。

Cash应用是转账、花费、存款以及交易加密货币的最优方案。我们确信,为人们提供重要的金融服务,能让他们充分地参与到经济中来。该应用于 2013 年推出,是一款由 4 位移动端工程师开发的便捷点对点支付应用,现已拥有 50 位移动端工程师 (分布于 iOS 和 Android ) 以及3000 万的月活跃用户。

该应用始终通过原生 Android/iOS 工具链构建,但有一些小例外。我们引入了 JavaScript 运行时以支持部分共享服务器驱动的逻辑来展示敏感的付款信息,这是我们首次接触共享代码。2016 年后,我们继续尝试将 JavaScript 作为共享代码的工具,但结论是,除非情况必要,否则使用 JavaScript 的成本将超过其代码共享的价值。我们尽力让 Cash App 周期性快速开发,在数小时内对轻量 PR 进行审核和合并,但在 JavaScript 编码和审查过程中,我们的速度总是被拖慢。随着时间的流逝,我们的 Android 和 iOS 团队越来越紧密,由于这些平台在 Swift 和 Kotlin 上都做了相同的处理,因此两个团队间的协作得以加强。我们开始互相交流意见并比对代码,并且相似的实现也开始包含到代码库中。

而对 Kotlin Multiplatfor 的试验决定始于一个开源项目。 我们所维护的一个叫 SQLDelight 的库正准备只生成仅 Kotlin 可用的 API,同时还决定通过 KMM 让这些生成的 API 平台无关化。 这个调整比较自然。 SQLite 是目前使用最广泛的跨平台技术,因此将是测试该技术的机会,由于 Android 版 Cash 应用的核心重度依赖该库,也为应用后续使用该技术奠定基础。


Visit the Kotlin Multiplatform Mobile portal to find more case studies from different companies!

在 Cash 应用中使用 KMM 的提议一举两得:我们既能删除那些引起问题的 JavaScript 共享代码,同时也让 Android 和 iOS 工程师能够进行下一步的合作,维护单个代码库。我们热衷于Kotlin Multiplatform 提倡的”业务共享,UI 原生”,这意味着我们的团队无需放弃他们偏爱的工具链。我们从 2018 年开始依靠着 TouchLab 的帮助在 Cash 应用上测试该技术,并在 feature flag 后缓慢推出该技术,确保在遇到技术先行者问题后将问题提交到 JetBrains 并进行回滚。
 

去年,我们对如何使用Kotlin Multiplatform做了重大的改变,以帮助团队去采用它。 我们最初通过将共享代码保存在同一个代码仓库中来将 Gradle 工具链引入 iOS 构建,但是考虑到依赖项的更改频率,运行 Gradle 和重新构建项目的额外成本显的没有意义。 后来,我们为Android / iOS创建了一个共享代码库,作为共享业务逻辑的主目录。 从那时起,我们的网络、投资和增长团队都使用 KMM 构建部分业务逻辑功能。 最让我兴奋的是不仅仅 Android 和 ios 团队的成员在贡献代码,服务器团队的成员也在贡献代码! 由于我们使用 Kotlin 进行服务器端开发,因此服务器端团队现在可以在共享的代码仓库中工作,并且由于与平台无关的 Kotlin 与 Swift 非常相似,我们的 iOS 团队也可以轻松的适应这种编程语言的转变。

除了使用 SQLDelight 之外,我们还使用 TouchLab 的 CrashKiOS 来获得更好的堆栈跟踪信息,并且我们正在使用 Wire 在共享代码库中使用 protocol buffers。至于我们在业务逻辑的哪些方面推荐 KMM 作为解决方案,到目前为止,我们在共享代码中的持久性和纯函数方面最成功,接下来我们希望使用 Wire 与我们的网络 API 进行更紧密的合作。

我们的绝大多数代码都是本地编写的—让开发人员愉快而高效地编写代码对我们来说仍然是最重要的。我们现在的重点是确保那些想要尝试 Kotlin Multiplatform 的人可以轻松地做到这一点(而且用户数量继续增长!)。 去年有更多的项目考虑将其作为一种选择,这一趋势表明了该技术的实力。 对于JavaScript,我们在尝试之后很快就放弃了,但到目前为止,团队中越来越多的人已经表现出对采用KMM的兴趣。


访问 KMM 门户,使用 Kotlin 创建您的第一个跨平台应用程序!


我们喜欢Kotlin Multiplatform,因为我们不必放弃任何我们喜欢的工作内容。 我们现在处于这样一个阶段:开发人员的工作流程没有改变,但有一个分享代码的选项,并在不离开舒适区的情况下获得所有这些好处。 我们团队终于开始发现KMM的潜力,试用它,并看到它是多么强大。

Alec Strong,
Senior Kotlin Developer

英文博文原作者:

Lei

Alex Anisimov

特别感谢由来自 Kotlin 社区的 黄智聪 (pye52)shaowei chang(shaowei.chang) 为本篇博文提供中文译文。

Discover more