【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

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

评论

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

【Python 实战】Python 采集二手车数据——超详细讲解

BROKEN

三周年连更

易观千帆 | 2023年3月银行APP月活跃用户规模盘点

易观分析

金融 经济 手机银行

《嗨,城市猎人》首播,揭秘猎头行业职场真实状态

Geek_2d6073

免费,无需魔法,媲美ChatGPT4

石云升

AI AIGC ChatGPT 三周年连更

深入剖析Go语言中的Channel:高级特性与注意事项

Jack

《一文带你看懂:亿级大表垂直拆分的工程实践》

后台技术汇

数据库 后端 三周年连更

linux性能调优

乌龟哥哥

三周年连更

如何使用 Linux find 命令查找文件?

wljslmz

三周年连更

金蝶赵燕锡:如何选择大模型?融入To B产品?

B Impact

阿里云周靖人回答:第一个提出MaaS模式背后的思考路径

B Impact

算法题每日一练---组合总和

知心宝贝

数据结构 算法 前端 后端 三周年连更

华为工单宝:助力制造业数字化转型,通过项目管理实现售后服务自动化和规范化

YG科技

Lex Fridman、Sam Altman对话摘要,从高维度看 ChatGPT 是什么?

B Impact

ShareSDK Android SDK API

MobTech袤博科技

ETH测试币怎么免费领?Arbitrum ETH水龙头盘点!

加密先生

Linux内核中的C语言宏:常见用法和最佳实践

Linux内核拾遗

Linux C语言

2023-04-19:给定一个非负数组arr 任何两个数差值的绝对值,如果arr中没有,都要加入到arr里 然后新的arr继续,任何两个数差值的绝对值,如果arr中没有,都要加入到arr里 一直到ar

福大大架构师每日一题

Go 算法 rust

华为工单宝助力科视光学实现售后服务自动化,提升客户体验和企业效率

YG科技

陈小伟:从ChatGPT谈起,预测5个数据库开发趋势

OceanBase 数据库

数据库 oceanbase

Vue3 内置组件

程序员海军

Vue 3 三周年连更

【JVM故障问题排查心得】「GC内存诊断」一文教你如何打印及分析JVM的GC日志(实战分析上篇)

洛神灬殇

JVM GC 4月日更 GC日志

Groovy as关键字性能测试

FunTester

测试需求平台 7- 产品管理服务接口一篇搞定

MegaQi

Python 挑战30天学完Python 三周年连更

一文读懂物联网 MQTT 协议之基础特性篇

老周聊架构

三周年连更

devops如何使用chatgpt提高工作效率

wisonzhu

DevOps

图数据库 NebulaGraph 的 Java 数据解析实践与指导

NebulaGraph

Java 数据库

携程商旅白皮书前瞻:商务旅行,迎来怎样的复苏?

携程商旅

技术 企业管理 数字化 商旅系统 差旅报销

掌玩科技×OceanBase:HTAP实时数据分析,降低80%存储成本

OceanBase 数据库

数据库 oceanbase

华为,找寻科技秋天里的春光

脑极体

通信 算力

一文初探 Go reflect 反射包

陈明勇

Go golang 反射 三周年连更

node可以用nvm快速切换版本,golang如何快速切换版本?用gvm就行。

福大大架构师每日一题

Go

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