Meta 将 Android 应用 Java 代码迁移到 Kotlin:零到 1000 万行


Meta 发布了一篇博客表示,正在将其 Android 应用的 Java 代码迁移到 Kotlin,并分享了这一过程中的一些经验。

该公司认为,Kotlin 是一种流行的 Android 开发语言,与 Java 相比具有一些关键优势。“因此,在我们努力使我们的开发工作流程更加高效的过程中,将 Meta 的 Android 开发转向 Kotlin 是非常合理的......Kotlin 通常被认为是一种比 Java 更好的语言,在年度 Stack Overflow 开发者调查中,它的好感度要高于 Java。”

除了受欢迎程度外,Meta 还将最新的 Kotlin 版本与 Java 11(可用于 Android 开发的最新版本)进行了比较,并得出了 Kotlin 的一些主要优势:可空性、函数式编程、更短的代码、以及领域特定语言 (DSL) / 类型安全构建器等。

Facebook 软件工程师 Omer Strulovich 指出,Meta 旗下几个流行的 Android 应用--Facebook、Instagram、Messenger、Portal 和 Quest 都已经开始从 Java 转向 Kotlin。截至目前,Facebook、Messenger 和 Instagram 的 Android 应用程序都有超过 100 万行 Kotlin 代码,并且转换率正在提高。Meta 的 Android 代码库总共已包含有超过 1000 万行的 Kotlin 代码。作为此次迁移的一部分,Meta 透露其也正在开源用于操作 Kotlin 代码的各种示例和实用程序。

不过,采用 Kotlin 也有一些不能忽视的缺点。博客内容指出,比如:两种语言的混合代码库需要长时间的处理维护;以及 Kotlin 与 Java 相比,流行度还是存在明显的差距,这意味着 Kotlin 可用的工具也更少。更糟糕的是所有 Kotlin 工具还都需要考虑 Kotlin 和 Java 的互操作性,这使得它们的实现就变得复杂。

最大的问题还在于构建时间。“我们从一开始就知道 Kotlin 的构建时间会比 Java 的要长。该语言及其生态系统更加复杂,Java 在优化其编译器方面领先了 20 年。由于我们拥有多个大型应用程序,较长的构建时间可能会对我们的开发人员体验产生负面影响。”

如何处理迁移

Meta 称,迁移到 Kotlin 既简单又非常复杂。因为 Kotlin 的设计允许从 Java 进行简单的转换,并具有经过深思熟虑的互操作性。这种设计使 JetBrains 能够为开发人员社区提供 J2K,即 IntelliJ/Android Studio 中的 Java 到 Kotlin 转换器。但 J2K 不是万能的,迁移中的有些情况仍然很复杂。

迁移之前,该公司考虑了两个选择:

  • 一个是可以使用 Kotlin 在 Meta 上编写新代码,但将大部分现有代码保留在 Java 中。
  • 还有一个是可以尝试将几乎所有内部代码转换为 Kotlin。

第一个选项的优势很明显,即少得多的工作量;但是这种方法也有两个明显的缺点。首先,在 Kotlin 和 Java 代码之间实现互操作性引入了 Kotlin 中 platform types 的使用。platform types 会导致运行时空指针取消引用,从而导致崩溃,破坏了纯 Kotlin 代码提供的静态安全优势。在一些复杂的情况下,Kotlin 的空检查省略还可能漏掉空值通过,进而引发空指针异常。例如,如果 Kotlin 代码调用由 Java 接口实现的 Kotlin 接口,就会发生这种情况。其他问题包括 Java 无法将类型参数标记为可空性(直到最近才修复),以及 Kotlin 的重载规则考虑了可空性,而 Java 的重载规则却没有。

第二个缺点是考虑到 Meta 的大多数软件开发都需要修改现有代码。“如果我们的大部分代码都是用 Java 编写的,我们就无法让我们的开发人员充分享受 Kotlin 的乐趣。由于迁移是一个漫长的过程,期望每个工程师在接触文件之前将文件转换为 Kotlin 既费力又低效。”

因此,Meta 方面最终选择了第二条选项,决定将几乎所有代码转换为 Kotlin。而在尝试为现有应用程序引入 Kotlin 时,Meta 也遇到了很多麻烦,例如需要更新 Redex 以支持 Java 不生成的字节码模式。以及使用的某些内部库依赖于在编译期间进行字节码转换来获取更好的性能。而将其作为 Kotlin 编译的一部分运行时,这部分代码则无法生效。为此,Meta 专门构建了解决工具。

此外,他们还发现在现有工具中存在的一些差异。例如代码审查或 wiki 中缺少 Kotlin 语法高亮显示。“我们更新了我们正在使用的库 Pygments,以使体验与 Java 相媲美。我们更新了一些内部代码修改工具,以便能够处理 Kotlin。我们还构建了 Ktfmt,这是一个基于 google-java-format 的代码和理念的确定性 Kotlin 格式化程序。”

准备好所有工具后,Meta 就可以正式开始批量转换大量代码。“随着我们工具的改进,我们已经能够将相当大的一部分代码转换成 Kotlin。我们的代码库中已经有超过 1000 万行 Kotlin 代码,而且 Meta 的大多数 Android 开发人员现在都在编写 Kotlin 代码”。平均而言,此次迁移使代码行数减少了 11%。

Meta 方面表示,其向 Kotlin 的迁移仍在进行中并在加速。“我们已经允许 Meta 的任何想要使用 Kotlin 的 Android 开发人员这样做,并为他们提供了工具来轻松地将现有代码迁移到 Kotlin。Kotlin 仍然缺少一些我们在使用 Java 时已经习惯的工具和优化。但我们正在努力缩小这些差距。随着我们取得进展以及这些工具和库的成熟,我们还将努力将它们反馈给社区。”

更多详情可查看官方博客。


相關推薦

2023-04-16

了来自 Google 的最新消息:Google 内部几乎全在用 Kotlin 搞 Android 开发。 Kotlin 在 2016 年左右开始在 Android 社​​区中流行起来。 2017 年,谷歌宣布在 Android 上正式支持 Kotlin,并通过与 JetBrains 一起创建 Kotlin 基金会来发展这门语

2022-10-11

动应用中共享业务逻辑,具体来说是可通过 KMM 在 iOS 和 Android 应用中使用相同的业务逻辑代码。 关于 Kotlin Multiplatform 生态系统的演变的一些信息还包括有: Google 的 Android 团队分享了 Jetpack 中 Kotlin 多平台库的预览。作为

2023-04-15

。至此,Compose Multiplatform 基本实现了全平台支持:iOS、Android、Windows、macOS、Linux 和 Web。 Compose Multiplatform 是用于跨多个平台共享 UI 的声明式框架,基于 Kotlin 和 Jetpack Compose 打造,由 JetBrains 和开源贡献者开发。 Jetpack Compos

2022-03-25

在官方招聘页面放出新的,而这个招聘信息则是泄漏了 Android Studio 的未来发展方向。根据招聘信息介绍,该职位是 Android Studio 高级软件工程师,在简介中 Google 写道: 我们正在 Android Studio 中启动一个新项目,以使其可用于 Andr

2022-09-06

,比如 Codegen 的新的统一配置、Hermes 作为默认引擎、对 Android 构建的完整 CMake 支持,还有对新架构文档的更新。 具体更新内容如下: New Architecture 的新文档 在过去的几个月里,Meta 一直在努力为文档中的 New Architecture 部分增

2022-08-24

Google I/O 大会上,谷歌宣布:官方正式支持将 Kotlin 作为 Android 开发的 First-Class(一等公民)语言。自此,Kotlin 开发商 JetBrains 和谷歌一直围绕 Kotlin 进行紧密合作,并共同创立了 Kotlin 基金会。 正如最初 I/O 公告中所强调的那

2022-12-07

前言     随着Android平台的飞速发展,许多老牌App,都发展成了所谓的“超级应用”,不但功能模块众多、代码量巨大,团队规模更是扩大到了几十人甚至上百人的规模。一线大厂的旗舰应用,甚至可能涉及到多

2023-11-14

该语言的第一波流行是在 2017 年,彼时 Google 宣布在 Android 上对 Kotlin 提供一流的支持,Kotlin 在 TIOBE 指数中也达到了近 1% 的峰值。但这一记录在本月被打破,目前 Kotlin 的评级为 1.15%。 TIOBE CEO Paul Jansen 评论

2022-07-02

发短信,备用机必备神器!         监控 Android 手机短信、来电、APP 通知,并根据指定规则转发到其他手机:钉钉机器人、企业微信群机器人、飞书机器人、企业微信应用消息、邮箱、bark、webhook、Telegram 机器人、

2022-11-21

的启动体验。因此,他们带来了明显的性能改进,以加快应用程序的启动和项目的打开。 通过切换到基于协程的 API,开发团队将一些过去按顺序运行的进程并行化。此外还设法减少了类加载,并在 Intention Action、检查、IElementTy

2023-10-31

,亮点数据包括: 彻底重构 For you 服务和排名系统,代码行数从 700K 减少到 70K,减少了 90%,计算占用量减少了 50%,帖子吞吐量增加了 80%。 重构了技术栈的 API 中间件层,并简化了架构,删除超过 10 万行代码和数千个未

2023-09-12

于 2016 年首次正式发布 Kotlin 语言;2017 年,Google 宣布为 Android 版 Kotlin 提供一流支持。彼时,由于 Java(Android 的传统语言)被认为过于冗长,Kotlin 的受欢迎程度上升至 1%,并在当时的 TIOBE 指数中名列前 20。 接下来,Kotlin 耗

2021-12-16

和 Java 库的激增,安全管理器变得力不从心,随着搭载 Android 智能手机的普及,Java 平台也不再支持小应用这种格式,安全管理器使用的环境变得更少了。多年来,它一直不是保护客户端 Java 代码的主要手段,也很少用于保护服

2023-08-19

用者的反馈进行调整。 2020 年,我们将重点转向 iOS 与 Android 之间的代码共享,这是最常见的用例。我们希望吸引更多移动开发者使用 Kotlin Multiplatform,利用他们的反馈增强技术,准备进行更多改进,包括更好地支持其他目标。