Data+AI时代,如何打造下一代数智平台? 了解详情
写点什么

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

评论

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

企业数字化转型与SAP云平台

汪子熙

SAP 11月日更 SAP数字化转型 SAP云平台

She Builds Summit|邀您一同感受她的科技力量!

SphereEx

开源 AWS SphereEx 潘娟

论文解读丨无监督视觉表征学习的动量对比

华为云开发者联盟

视觉 无监督学习 无监督视觉 表征学习 动量对比

KubeMeet 深圳站完整议题出炉!快来 get 云原生边缘计算硬核技术干货

阿里巴巴云原生

阿里云 云原生 边缘计算 KubeMeet 线下活动

Vue进阶(幺玖幺):ECharts 实现地图功能

No Silver Bullet

Vue eCharts 11月日更

Kafka中的数据不丢失机制及CAP理论详解

五分钟学大数据

11月日更

Python 中的反转字符串:reversed()、切片等

华为云开发者联盟

Python 切片 反转字符串 reversed 反转

flutter开发中vscode插件推荐1

坚果

flutter vscode 11月日更

【Flutter 专题】06 图解基础【登录】页面并学习相关 Widget

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 11月日更

到底什么样的ABAP系统能运行Fiori应用

汪子熙

SAP abap Fiori 11月日更

译文|选择 Apache Pulsar 而非 Kafka 的 10 个理由

Apache Pulsar

kafka 架构 云原生 中间件 Apache Pulsar

火出边际的Serverless,你居然还不了解?

华为云开发者联盟

云计算 Serverless 运维 云原生 敏捷

告诉你!操作系统是个大骗子!

博文视点Broadview

亿磐获评《新闻周刊》2021年度最受雇员喜爱工作场所

InfoQ_434670063458

亿磐 EPAM 新闻周刊

TDengine助力曲靖卷烟厂有效提升时序数据存取效率

TDengine

数据库 tdengine 后端

博文推荐 | 一文带你看懂 Pulsar 的消息保留和过期策略

Apache Pulsar

架构 云原生 中间件 干货 Apache Pulsar

ETL和数据建模

大数据技术指南

11月日更

虚拟机与容器的混合管理实践

安第斯智能云

Kubernetes 后端 云化底层的那些事

dart系列之:在dart中使用packages

程序那些事

Java flutter dart 程序那些事 11月日更

时序序列分类算法概述

云智慧AIOps社区

大数据 算法 时间序列 智能运维

GaussDB NoSQL架构设计分享

华为云开发者联盟

nosql 云原生 GaussDB 超融合 多模数据库

纪念林徽因

潜藏在手机中的新威胁:免安装应用安全指北

安第斯智能云

安全 移动端

博文推荐|Pulsar 的消息存储机制和 Bookie 的 GC 机制原理

Apache Pulsar

存储 Apache Pulsar 消息中间件 Apache BookKeeper bookie

CSS奇技淫巧之滤镜

Augus

CSS 11月日更

Apollo选型及优势介绍

小鲍侃java

11月日更

APP上运行小程序的混合移动研发模式

Speedoooo

容器 ios开发 APP开发

博文推荐|Pulsar 存储空间不释放的问题分析与解决方法

Apache Pulsar

架构 云原生 Apache Pulsar 技术干货 BookKeeper 存储空间

AI运动:阿里体育端智能最佳实践

阿里巴巴终端技术

最佳实践 端智能

containerd镜像层过大问题

ilinux

一图看懂 Apache ShardingSphere 5.0.0

SphereEx

数据库 开源 ShardingSphere

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