Meta 工程师为了最大化 Kotlin 在生产力与安全性方面的优势,正在将其 1000 万行的 Android 代码库从 Java 迁移到 Kotlin。迁移过程已进行了一年,大约完成了一半,并开发了一个名为 Kotlinator 的工具,以尽可能自动化这一过程。
主要观点
- 全面迁移而非部分迁移:Meta 选择全面迁移而非仅迁移活跃开发的代码,以避免遗留 Java 代码可能引发的空值问题,并消除使用两种工具链并行以及混合代码库编译性能下降的弊端。
- 自动化工具的开发:由于 IntelliJ 的 J2K 转换工具不足以应对如此大规模的代码库,Meta 开发了 Kotlinator 工具,以自动化转换过程。J2K 提供了基础,但 Kotlinator 进行了扩展和优化。
- 转换步骤的优化:Kotlinator 在转换前后添加了预处理和后处理步骤,确保转换后的代码可编译。这些步骤处理空值问题、应用已知的 J2K 解决方案,并使生成的代码更符合 Kotlin 的惯用语法。
- 代码转换的复杂性:转换过程涉及大量步骤,包括分析文件及其依赖关系,并在必要时进行 Java 到 Java 或 Kotlin 到 Kotlin 的转换。Meta 开源了部分转换工具,展示了如何通过 Kotlin 编译器 API 操作抽象语法树(AST)。
- PSI 库的使用:大多数转换步骤使用 JetBrains 的程序结构接口(PSI)库进行元编程,该库可以解析文件并创建语法和语义代码模型,而无需依赖编译器。
- 空值安全性:Meta 工程师的一个重要目标是使 Java 代码在转换为 Kotlin 时具备空值安全性。他们使用静态分析工具(如 Nullsafe 和 NullAway)检测潜在问题,并通过 Kotlinator 的 Java 编译器插件在运行时收集空值数据,进一步减少空指针异常(NPE)的风险。
- 与 JetBrains 的合作:Meta 与 JetBrains 合作扩展了 J2K,使其能够在 IDE 中直接运行客户端库注入的钩子。
关键信息
- 迁移规模:1000 万行代码,已完成约 50%。
- 工具开发:Kotlinator 是基于 J2K 的自动化转换工具。
- 开源贡献:Meta 开源了部分 AST 转换工具。
- 技术难点:处理空值安全性、代码转换的复杂性、编译错误的自动化处理。
重要细节
- 头模式 J2K:将 J2K 转换为可在远程机器上运行的头模式工具。
- 转换步骤:包含预处理和后处理,涉及文件分析、依赖关系分析以及必要的代码转换。
- 空值处理策略:默认将参数和返回类型视为可空,以减少 NPE 风险。
- 运行时数据收集:通过 Java 编译器插件收集空值数据,识别潜在的空值问题。
总结
Meta 的 Java 到 Kotlin 迁移项目展示了大规模代码库转换的复杂性和挑战。通过开发自动化工具 Kotlinator,Meta 工程师不仅提高了转换效率,还确保了代码的空值安全性和可编译性。这一过程需要与 JetBrains 紧密合作,并利用 PSI 库等先进技术进行元编程。尽管迁移尚未完成,但这一项目为理解 Java 与 Kotlin 之间的差异以及如何以编程方式转换代码提供了宝贵的经验。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。