写点什么

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:0011853

评论

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

Mysql优化

EquatorCoco

MySQL

2025上海国际机器人展(Tech G)

AIOTE智博会

消费电子展 消费电子展会 消费电子博览会 消费电子展览会

怎么把域名解析到IP地址?流程有哪些?一文讲清域名解析那些事

国科云

科大讯飞智能录音笔S8离线版 功能介绍

妙龙

科大讯飞 录音笔

精选的掘金文章汇总[2024.11月-12月]

安全乐谷

GitHub 架构 算法 前端 后端

科大讯飞T30 Lite和T30 Pro 对比

妙龙

科大讯飞 学习机

新金景集团:二十载专注做好女性私密

新消费日报

CCF-CV企业交流会—走进合合信息顺利举办,打造大模型时代的可信AI

合合技术团队

人工智能 信息安全 图像安全

Java后端最全面试攻略,吃透25个技术栈,阿里十万字内部面试题总结全网开源

架构师之道

编程 java面试

ChatGPT在功能测试用例生成方面的优势

不在线第一只蜗牛

ChatGPT

阿里P9重磅分享内部绝密《百亿级并发系统设计》手册!

程序员高级码农

Java 程序员 高并发 架构设计 架构师

DevOps研发效能建设的六大“雷区”:你中招了吗?

嘉为蓝鲸

DevOps 研发度量 效能度量 研发效能管理

Java行情崩盘了?传智播客收入下滑严重,Java之父和金角大王的IT课程白菜价贱卖

陆通

RWA代币:下一波财富增长的密码?

TechubNews

币安独霸,okx,bitget共享天下交易所新格局

区块链项目一站式包装孵化

OpenAI从传统发布会改成12天直播:OpenAI Day1 带来了哪些惊喜?

测试人

编写 Java 单元测试最佳实践

腾讯云 AI 代码助手

科大讯飞P20 Plus词典笔 怎么样

妙龙

科大讯飞 词典笔

猿辅导和作业帮哪个更好

妙龙

作业帮 学习机 猿辅导

AI与数据分析|使用机器学习,轻松解决复杂的情感分析问题

Altair RapidMiner

机器学习 AI 数据分析 情感分析 altair

面试必刷:阿里巴巴 内部 Java 高级架构师 1080 道面试题

采菊东篱下

Java 编程 计算机

AI Agent:未来高效螺丝钉,谁用得好,谁先赚到钱

博文视点Broadview

阿里Spring Security OAuth2.0认证授权笔记震撼开源!原理+实战+源码三飞

采菊东篱下

编程 java面试

阿里大牛强力推荐:springboot实战派文档,从入门到实战,样样具备

架构师之道

Java 编程

想提高查询性能,用GaussDB(DWS) in表达式还是or表达式?

华为云开发者联盟

数据库 GaussDB 表达式 大数据‘’ #SQL

让我们一起来建设 Fluent Editor 开源富文本编辑器吧!

OpenTiny社区

富文本 OpenTiny 前端开源

科大讯飞学习机和作业帮学习机哪个好

妙龙

科大讯飞 作业帮 学习机

作业帮X58和X28区别对比选哪个

妙龙

作业帮 学习机

Java面试突击手册,一周刷完这300道面试题,你也可以当架构师!

Summer

Java 程序员 面试 架构师 大厂

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