写点什么

Meta 将百万行代码从 Java 移植到 Kotlin

  • 2022-11-24
    北京
  • 本文字数:1161 字

    阅读完需:约 4 分钟

Meta将百万行代码从Java移植到Kotlin

Meta 一直在将他们的Android代码库从Java移植到Kotlin。Meta 的工程师 Omer Strulovich 解释说,在这个过程中,他们学到了许多有趣的经验教训,并积累了一些有用的方法。


Meta 之所以决定采用 Kotlin 开发 Android 应用,是因为他们看到了Kotlin相对于 Java 的优势,包括可空性和函数式编程支持、更简短的代码,以及创建特定领域语言的可能性。Kotlin 工程师还清楚地知道,他们必须将尽可能多的 Java 代码库移植到 Kotlin,以防止 Java 空指针问题潜入 Kotlin 代码库,并减少需要维护的 Java 代码。这不是一件容易的事,从一开始就需要做相当多的调研工作。


Meta 工程师必须克服的第一个障碍是,Meta 使用的几个内部优化工具无法与 Kotlin 正常兼容。例如,Meta 必须更新ReDex Android字节码优化器和语法高亮显示工具 Pygments 的词法分析器组件,并构建一个Kotlin符号处理(KSP)API,用于创建 Kotlin 编译器插件。


在代码转换方面,Meta 工程师选择使用 Kotlin 官方转换器 J2K,它可以作为编译器插件使用。除了一些特定的框架(包括 JUnit)之外,这种方法工作得非常好。但对于特定的框架,这个工具缺乏足够的知识,无法进行正确的转换。


我们已经遇到了很多需要进行小修复的情况。有些很容易做到(比如替换 isEmpty),有些需要做一些研究工作才能搞清楚(与 JUnit 规则的情况一样),还有一些是针对 J2K 本身的 bug 的变通方法,这些 bug 可能会导致出现任何问题——从构建时错误到运行时行为。


处理这种情况的正确方法包括三个步骤:首先是准备好 Java 代码,然后在 headless 模式的 Android Studio 实例中自动运行 J2K,最后对生成的文件进行后续处理,进行所有所需的重构和修复。Meta 已经开源了许多重构工具,以帮助其他开发人员完成相同的任务。


这些自动化转换过程并不能解决所有的问题,但我们能够优先解决最常见的问题。我们针对模块运行转换脚本(我们贴切地称之为 Kotlinator),优先考虑活跃和简单的模块。然后我们观察生成的代码:它们可以通过编译吗?它们是否可以顺利通过我们的持续集成管道?如果可以,我们就提交它们。如果不可以,我们就研究问题,并设计新的自动重构过程来修复它们。


Meta 已经通过这种方式移植了超过 1000 万行 Kotlin 代码,让大多数的 Meta Android 工程师切换到Kotlin来完成他们的日常工作。这个过程也验证了许多预期的结果,包括更短的生成代码和不变的执行速度。但是,从消极的方面来看,Kotlin 编译器比 Java 编译器慢得多。使用 KSP 来处理注解,改进 Java 存根生成和编译时间,这为优化带来了新的可能性,不过仍然需要持续的努力。


如果你对完整的细节感兴趣,请不要错过 Meta 的这篇关于迁移到 Kotlin 的文章。


原文链接

https://www.infoq.com/news/2022/11/meta-port-java-kotlin/


相关阅读:

Kotlin Multiplatform Mobile 进入 Beta 测试

又一巨头从 Java 迁移到 Kotlin:关键应用全部开始切换、安卓代码库超过千万行 Kotlin 代码

2022-11-24 08:0012113

评论

发布
暂无评论
发现更多内容

分布式软时钟有多重要?|HDC2021技术分论坛

HarmonyOS开发者

HarmonyOS

尝试 Promise A+

Jeannette

硬科技起飞,这家成立仅三年的AI研究院已颇具国际风范

硬科技星球

async/await 优雅永不过时

CRMEB

【活动预告】下一代数据平台走向何方?

SphereEx

大数据 大前端 ShardingSphere SphereEx 线上沙龙

Apache Tomcat 7.x安全加固指南

喀拉峻

网络安全 安全 信息安全

一周信创舆情观察(11.15~11.21)

统小信uos

JS柯里化和反柯里化

Jeannette

恒源云(GPUSHARE)_训练一个专门捣乱的模型

恒源云

人工智能 深度学习 算力

SAP ERP classification 和 SAP Cloud for Customer 的同步

汪子熙

中间件 SAP ERP C4C 11月日更

高可用是什么意思啊?行云管家支持高可用部署吗?

行云管家

高可用 服务器 IT运维

SAP 公有云和私有云解决方案概述

汪子熙

公有云 云平台 SAP 11月日更 公有云私有云

先到先得!Alibaba甩出第四次更新的JDK源码高级笔记(终极版)

热爱java的分享家

Java 源码 jdk 面试 经验分享

质量基础设施“一站式”线上平台搭建,NQI一站式综合平台解决方案

电微13828808271

智慧园区一体化管理平台开发,园区智能化集成系统

电微13828808271

下单延迟10s撤单性能测试

FunTester

性能测试 延迟队列 接口测试 测试框架 FunTester

架构实战营 模块五

felix

#架构实战营

闭包与内存泄露

Jeannette

跨端分布式计算技术初探|HDC2021技术分论坛

HarmonyOS开发者

HarmonyOS

ETL工具算法构建企业级数据仓库五步法

大数据技术指南

11月日更

广发证券携手HarmonyOS打造智慧金融服务|HDC2021技术分论坛

HarmonyOS开发者

HarmonyOS

JS函数的this

Jeannette

2021年26家大厂Java面试题整理了360道(分布式+微服务+高并发)

热爱java的分享家

Java 架构 面试 程序人生 经验分享

Javascript的内存管理

Jeannette

微信 ClickHouse 实时数仓的最佳实践

科技热闻

字节跳动如何系统性治理 iOS 稳定性问题

字节跳动终端技术

ios 字节跳动 APM APP稳定性

应急响应入门之Linux分析排查

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

TDengine在理想汽车物联网业务场景的落地实践

TDengine

tdengine 时序数据库

【Pandas学习笔记01】强大的分析结构化数据的工具集

恒生LIGHT云社区

Python 大数据 数据分析 pandas

Tapdata “设擂招贤”携手 LeetCode 举办全球极客技术竞赛

tapdata

10年阿里人告诉你:秒杀系统设计就该这么玩

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

Meta将百万行代码从Java移植到Kotlin_语言 & 开发_Sergio De Simone_InfoQ精选文章