您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > 百科

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

时间:2022-10-26 14:51:06  来源:  作者:InfoQ

编译|燕珊,核子可乐

Meta 现在爱 Kotlin 多于 JAVA

Facebook 母公司 Meta 正在将其 Android 应用的 Java 代码迁移到 Kotlin。根据 Meta 的官方博客所述,截至今天,其 Android 代码库已经有超过 1000 万行 Kotlin 代码,旗下包括 Facebook、Instagram、Messenger、Portal 和 Quest 在内的应用都已经开始从 Java 转向 Kotlin。

将代码库转换为 Kotlin

Kotlin 是一种更年轻的编程语言,也依赖于 Java 虚拟机。Kotlin 由软件工具制造商 JetBrAIns 创建,于 2011 年首次亮相,2016 年发布 1.0 版本。次年,它被 google 采用为 Android 开发的一级语言,并由其基金会管理,该基金会由 JetBrains 和 Google 资助。

到 2019 的 Google I/O 大会,Google 正式宣布,Kotlin 编程语言已成为 Android 应用开发人员的首选语言,并在当年年底表示前 1000 个 Android 应用程序中有近 60% 包含 Kotlin 代码。

从 Google 自身来看,明面上它说自己选择 Kotlin 的理由是它更简洁、更安全、支持结构化并发,能更轻松地编写异步代码,并且可以与 Java 互操作。不过,另一个业界推测是可能跟那宗与 Oracle 旷日持久的 Java 侵权案有关—— Oracle 花了十多年的时间追究 Google 在 Android 中使用 Java API 的侵权索赔,最终 Oracle 败诉。

回到 Meta,Facebook 软件工程师 Omer Strulovich 对选择 Kotlin 如此解释道:“Kotlin 通常被认为是一种比 Java 更好的语言,在年度 Stack Overflow 开发人员调查中,其受欢迎程度高于 Java,”他还指出,由于近年来 Kotlin 已成为 Android 开发的流行语言,“因此,在努力使我们的开发工作流程更加高效的过程中,我们在 Meta 的安卓开发中转向 Kotlin 是非常合理的……”

除了受欢迎之外,Meta 认为 Kotlin 拥有的主要优势包括可空性、函数式编程、代码更短、以及领域特定语言(DSL)等等。

不过,Strulovich 指出,过渡到 Kotlin 也有一些不可忽视的缺点,比如混合代码库可能难以维护,以及 Kotlin 虽然流行,但与 Java 相比还是有比较大的差距,工具集还不够成熟。所有 Kotlin 工具都需要考虑 Kotlin 和 Java 的互操作性,这使得它们的实现变得复杂。

但 Meta 最大的担忧还是构建时间。“我们从一开始就知道 Kotlin 的构建时间会比 Java 的要长。该语言及其生态系统更加复杂,Java 在优化其编译器方面领先了 20 年。由于我们拥有多个大型应用程序,较长的构建时间可能会对我们的开发人员体验产生负面影响。”

为什么不只用 Kotlin 来写新代码

Strulovich 没有透露 Meta 何时开始这种转变。Meta 本来可以选择只用 Kotlin 编写新代码,但它最终还是决定将所有的 Android 应用程序都转换过来。

根据 Strulovich 的说法,如果是只使用 Kotlin 来编写新代码,继续保留大部分现有 Java 代码的话,工作量明显更低,但相应的也有两个缺点:首先就是要在 Kotlin 和 Java 代码之间实现互操作性,就需要引入 Kotlin 中的 platform 类型。Platform 类型会导致运行时中的空指针取消引用,进而引发崩溃,这就破坏了纯 Kotlin 代码提供的静态安全优势。在某些复杂情况下,Kotlin 的空检查省略可能会漏掉空值,意外引发空指针异常。例如,如果 Kotlin 代码调用由 Java 接口实现的 Kotlin 接口,就会发生这种情况。其他的问题还包括 Java 无法将类型参数标记为可空(最近才刚刚修复);Kotlin 的重载规则考虑到了可空性,Java 的重载规则却没有考虑到。

第二个缺点是,这种方式要求对 Meta 已经开发的大多数软件进行代码修改。如果继续把大部分代码保留为 Java 形式,那开发人员就没法充分发挥 Kotlin 的优势。

Kotlin 迁移大法

如今,Meta 旗下的 Android 版 Facebook、Messenger 和 Instagram 应用都拥有超过百万行 Kotlin 代码,而且转换率也一路走高。纵观整个 Android 代码库,其中的 Kotlin 代码量已经超过千万行。

起步阶段

事实上,在尝试为现有应用程序引入 Kotlin 时,Meta 遇到了不少麻烦。例如,团队得更新 Redex 才能支持 Java 无法生成的字节码模式。另外,其使用的某些内部库要求在编译期间进行字节码转换来获取更好的性能。而在将这些库纳入 Kotlin 编译过程时,这部分代码无法正常起效。为此,Meta 针对这些问题构建了专门的解决工具。

Meta 还发现,现有工具之间存在不少冲突。例如,代码审查和 wiki 工具无法对 Kotlin 语法进行高亮显示。“我们还更新了之前使用的 Pygments 库,确保其体验与处理 Java 代码时一致。我们更新了一些内部代码修改工具,使其能够支持 Kotlin。我们也构建了 Ktfmt,一款基于 google-java-format 编码理念的确定性 Kotlin 格式化程序。”

迁移加速阶段

在工具准备齐全之后,Meta 现在已经能将代码中的任意部分转换为 Kotlin。但每次迁移都需要大量样板设计工作,只能由员工们手动完成。J2K 是一种通用工具,并不会去理解所转换的代码是在表达什么。因此,某些特定部分就只能进行手动调整。

最典型的例子就是 Junit 测试规则的使用。假设使用 ExpectedException 规则,来验证是否抛出了正确的异常:

@Rule public ExpectedException expectedException = ExpectedException.none();

当 J2K 将这部分代码转换成 Kotlin 时,得到的就是:

@Rule var expectedException = ExpectedException.none()

这段代码乍看之下与原先的 Java 代码等价,但由于 Kotlin 使用了 site 注解,所以其实际上等价于:

@Rule private ExpectedException expectedException = ExpectedException.none();

public ExpectedException getExpectedException() {return expectedException

尝试运行后,此测试会失败并返回一个错误:“The @Rule expectedException must be public”,这是因为 Junit 发现了一条带有 @Rule 注解的私有字段。这是个常见问题,论坛上面也已经有成熟答案:要么在字段中添加“@JvmField”;要么在注解中添加注解 use-site,也就是“@get:Rule”:

// 方案一:使用“get”作为注解的use-site@get:Rule var expectedException = ExpectedException.none()

// 方案二:只为没有getter的Java字段生成JVM代码@JvmField @Rule var expectedException = ExpectedException.none()

由于 J2K 无法(可能也不应该)感知 JUnit 的复杂性,所以没能正确完成转换。但即使 JUnit 不存在这个问题,J2K 在处理其他小众框架的时候也肯定会掉类似的坑。

例如,很多 Android Java 代码会使用 android.text.TextUtils 中的实用方法,例如 isEmpty,来简化对某些字符串的检查。但在 Kotlin 中,其实是有内置的标准库方法 String.isNullOrEmpty 的。该方法之所以更好,是因为它能通过契约来告知 Kotlin 编译器如果它返回 false,则被测试的对象不得再为 null,并将其智能转换为 String。

Java 代码也有不少类似的辅助方法,也有很多库都实现了相同的基本方法。这一切都需要替换成标准的 Kotlin 方法,借此简化代码并保证编译器能正确检测出不可为空的类型。

Strulovich 表示,内部发现了许许多多类似的小小修复实例。有些难度不大(例如替换 isEmpty),有些则需要研究一番才能搞明白(例如 JUnit 规则)。还有一些其实属于 J2K 出的错,可能导致构建错误、运行时行为错乱等问题。

为了解决这些问题,Meta 团队将 J2K 转换流程划分成三个步骤:

首先,取一个 Java 包并准备将其转换为 Kotlin。这个步骤主要解决错误,并完成相应的内部工具转换。

第二步就是运行 J2K。团队已经能够以无头模式运行 Android Studio 并调用 J2K,由此将整个管道作为脚本来运行。

最后一步,对新的 Kotlin 文件进行后处理。具体包括大部分自动重构与修复步骤,例如将 JUnit 规则标记为 @JvmField。在此步骤中,团队还应用了自动更新 linter,并在无头模式下应用各种 Android Studio 建议。

“当然,自动化并不足以解决所有问题,但至少能帮我们优先处理那些最常见的问题。”Strulovich 说。

在 Java 重构方面,Meta 使用的是 JavaASTParser 等工具,它能帮助解析某些类型。而在 Kotlin 这边,团队还没有找到能够解析类型的好办法,所以选择使用 Kotlin 编译器 API。

Meta 还发布了一组自动重构方法(https://Github.com/fbsamples/kotlin_ast_tools)。虽然不是很多,但希望能帮助更多开发者利用 Kotlin 编译器解析器高效完成工作。

下一步

平均而言,Meta 发现迁移后的代码行数减少了 11%。尽管网上各种案例引用的数字往往要比这高得多,但他们还是对这个数字感到满意。

Strulovich 说,Meta 向 Kotlin 的迁移仍在进行中并在加速。“Kotlin 仍然缺乏一些我们在使用 Java 时已经习惯了的工具和优化,但我们正在努力缩小这些差距。随着我们取得的进展和这些工具和库的成熟,我们也将努力把它们反馈给社区。”

https://www.theregister.com/2022/10/25/meta_java_kotlin/

https://engineering.fb.com/2022/10/24/android/android-java-kotlin-migration/



Tags:Kotlin   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
基于GitHub App 深度讲解Kotlin高级特性与框架设计
基于GitHub App 深度讲解Kotlin高级特性与框架设计GitHub App 是 GitHub 平台上的一种特殊类型的应用程序,它允许开发者通过 GitHub API 与 GitHub 上的仓库和组织进行交互...【详细内容】
2023-11-28  Search: Kotlin  点击:(199)  评论:(0)  加入收藏
Kotlin的作用域函数有哪些?
Kotlin作用域函数Kotlin提供了几个作用域函数,用于在特定的作用域内执行代码块。这些作用域函数包括: let函数:let函数允许您在对象上执行代码块,并将对象作为参数传递给代码...【详细内容】
2023-11-20  Search: Kotlin  点击:(103)  评论:(0)  加入收藏
Kotlin 将取代 Java,跻身 Top 10?| TIOBE 11 月榜单发布
整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)一个月的时间过得很快,转眼之间 11 月 TIOBE 编程语言榜单已最新出炉,一起来看看这个月又有什么值得关注的新变化吧?“确信 Kotlin 能跻身...【详细内容】
2023-11-14  Search: Kotlin  点击:(343)  评论:(0)  加入收藏
教你将Java代码转换为Kotlin
在2017年的Google I/O大会上,Google 宣布 Kotlin 成为 Android 官方开发语言。Kotlin 是一种强大而多功能的语言,适用于各种开发任务。而且,Kotlin与Java是互操作的,可以轻松地...【详细内容】
2023-07-19  Search: Kotlin  点击:(128)  评论:(0)  加入收藏
手把手教你将Java代码转换为Kotlin
在2017年的Google I/O大会上,Google 宣布 Kotlin 成为 Android 官方开发语言。Kotlin 是一种强大而多功能的语言,适用于各种开发任务。而且,Kotlin与Java是互操作的,可以轻松地...【详细内容】
2023-07-19  Search: Kotlin  点击:(159)  评论:(0)  加入收藏
为什么放弃Java后,没有使用Kotlin,新的开发语言正在席卷而来
从 Java 到Kotlin,Kotlin作为Android官方支持语言,获得了更多的关注和采用!这几年,Kotlin的发展势头很猛,可以说由 Java 转 Kotlin 早已势不可挡。那么Kotlin有哪些优势可以打败J...【详细内容】
2023-07-05  Search: Kotlin  点击:(242)  评论:(0)  加入收藏
Google称内部全在用Kotlin搞安卓开发,体验碾压Java
在 KotlinConf 2023 开幕主题演讲中, Grace Kloba 分享了来自 Google 的最新消息:Google 内部几乎全在用 Kotlin 搞 Android 开发。Kotlin 在 2016 年左右开始在 Android 社区...【详细内容】
2023-04-16  Search: Kotlin  点击:(361)  评论:(0)  加入收藏
又一巨头从Java迁移到Kotlin:关键应用全部开始切换、安卓代码库超过千万行Kotlin代码
编译|燕珊,核子可乐Meta 现在爱 Kotlin 多于 Java。Facebook 母公司 Meta 正在将其 Android 应用的 Java 代码迁移到 Kotlin。根据 Meta 的官方博客所述,截至今天,其 Android 代...【详细内容】
2022-10-26  Search: Kotlin  点击:(417)  评论:(0)  加入收藏
保姆级,使用 KotlinScript 构建 SpringBootStarter
因业务需要, 公司内需要使用 SpringBoot Starter 构建 SDK. 不同的是使用了更为灵活的 Kotlin 语言, 构建脚本也换成了 Kotlin Script. 框架: SpringBoot 业务代码语言: Kot...【详细内容】
2022-09-27  Search: Kotlin  点击:(333)  评论:(0)  加入收藏
ViewBinding 与 Kotlin 委托双剑合璧
前言大家好,我是小彭。过去两年,我们在掘金平台上发表过一些文章,小彭也收到了大家的意见和鼓励。最近,我会陆续搬运到公众号上。ViewBinding 是 Android Gradle Plugin 3.6 中...【详细内容】
2022-09-08  Search: Kotlin  点击:(553)  评论:(0)  加入收藏
▌简易百科推荐
用于人工智能开发的主流编程语言都有哪些?
在人工智能开发领域,编程语言的选择至关重要。目前,主流的编程语言主要包括Python、Java、C++、JavaScript和Swift等。这些语言各具特色,适用于不同的人工智能开发场景。首先,Py...【详细内容】
2024-01-31    简易百科  Tags:编程语言   点击:(133)  评论:(0)  加入收藏
探究微处理器开发中的汇编语言的优势与挑战
在计算机编程中,汇编语言是一种低级语言,它可以直接控制计算机的硬件资源。与高级语言相比,汇编语言具有更高的运行效率和更好的控制能力,但同时也更加复杂和难以理解和维护。在...【详细内容】
2023-12-19  松鼠宝贝    Tags:汇编语言   点击:(100)  评论:(0)  加入收藏
选择适合微服务的编程语言,让你的工作事半功倍!
讨论编程语言就像是一场政治辩论。每个开发者都会过分捍卫他/她所使用的编程语言。然而,编程语言应该被看作是它们真正是的东西,即一种工作工具。每种编程语言都有特定的目的...【详细内容】
2023-12-14  爱发白日梦的后端  微信公众号  Tags:编程语言   点击:(178)  评论:(0)  加入收藏
编程语言大比拼:Python、Java、C、C++、Go 实现 'Hello World' 和九九乘法表"
应该90%的IT专业的朋友写的第一段代码就是打印"holle world",每个大学老师都会通过这个方式吸引你对课程产生兴趣。也许有的朋友学的是JAVA开发,有的学的是c,在几年前应该很...【详细内容】
2023-12-11  IT仔的笔记本  微信公众号  Tags:编程语言   点击:(217)  评论:(0)  加入收藏
TypeScript中的null和undefined的区别
在TypeScript中,null和undefined是两个特殊的值,用于表示变量的缺失或未定义。尽管它们在某些情况下可能看起来相似,并且都可以表示"没有值",但它们在语义和用法上存在一些重要...【详细内容】
2023-12-07  科学随想录  微信公众号  Tags:TypeScript   点击:(136)  评论:(0)  加入收藏
面向AI开发的六种最重要的编程语言
作者丨FATIH KÜÇÜKKARAKURT 译者 | 布加迪审校 | 重楼出品 | 51CTO技术栈(微信号:blog51cto)在AI开发界,你使用的编程语言很重要。每种语言有其独特...【详细内容】
2023-12-07    51CTO  Tags:编程语言   点击:(121)  评论:(0)  加入收藏
NLP问题实战:基于LSTM(RNN)和Transformer模型
译者 | 朱先忠审校 | 重楼简介GPT等语言模型最近变得非常流行,并被应用于各种文本生成任务,例如在ChatGPT或其他会话人工智能系统中。通常,这些语言模型规模巨大,经常使用超过数...【详细内容】
2023-11-29    51CTO  Tags:NLP   点击:(274)  评论:(0)  加入收藏
一文了解低级和高级编程语言
中文是一种尽量用简短文字表达更多含义的语言,所以很多时候一句话的含义很容易曲解成别的意思。最近,有人提出C语言是一种中级语言的概念,所以特意介绍一下低级语言和高级语言...【详细内容】
2023-11-23  数字随行  微信公众号  Tags:编程语言   点击:(232)  评论:(0)  加入收藏
JetBrains 发布 2023 调研报告:77% 开发者使用 ChatGPT
IT之家 11 月 21 日消息,JetBrains 日前公布了《2023 开发人员生态系统现状》调研报告,汇集了来自全球 26,348 位开发者的调研结果。《开发者生态系统现状报告》涵盖广泛的主...【详细内容】
2023-11-21    IT之家  Tags:JetBrains   点击:(239)  评论:(0)  加入收藏
Go vs Rust:文件上传性能比较
一、设置所有测试都在配备16G内存的 MacBook Pro M1 上执行。软件版本为: Go v1.20.5 Rust v1.70.0测试工具是一个基于 libcurl 并使用标准线程的自定义工具,能够发送多部分请...【详细内容】
2023-11-20  技术的游戏  微信公众号  Tags:Rust   点击:(174)  评论:(0)  加入收藏
站内最新
站内热门
站内头条