Facebook母**Meta的工程师们,对多年以来将众多Android应用代码库从Java转换成Kotlin的体会做了一番认真总结。
对于Meta这样一家坐拥成千上万开发人员和多款大型Android应用程序(包括Facebook、Instagram、Messenger、Portal以及Quest VR头显)的企业来说,这无疑是一项艰巨的任务。
Facebook**软件工程师Omer Strulovich指出:“把这些用Java开发的Android应用全面转换为Kotlin,确实不是件容易的事。”
但向Kotlin的迁移仍在进行当中,目前Meta**的Android应用repo中已经包含上千万行Kotlin代码。
Strulovich解释称:“如今,我们的Facebook、Messenger以及Instagram等Android应用各自拥有超过100万行Kotlin代码,而且转换率仍在不断提升。我们Android代码库中的Kotlin代码总规模已经超过1000万行。”Java是当前世界三大编程语言之一,在企业级应用程序领域处于主导地位;相比之下,Kotlin的人气显然无法与之相比,但也稳居榜单前二十。鉴于Meta自身的业务规模与极具份量的应用程序组合,这波从Java到Kotlin的Android应用转型不啻为一个里程碑。
尽管迁往Kotlin有种种好处,但Strulovich也列举了此番计划的一些显著缺点,至少对大型应用程序来讲确实存在不少风险。
首先,Java和Kotlin之间的人气水平仍有巨大差距,导致后者生态中的可用工具较少。另外,这些工具还必须考虑到Kotlin与Java之间的互操作性,这就让情况**更为复杂。尽管两种语言间号称有100%的互操作性,但Meta还是发现自己不得不继续保留部分Java代码。
Strulovich指出:“Kotlin也是种流行语言,但跟Java相比,其流行度还远达不到同样的量级。Java是目前全球第二或第三大流行语言(具体取决于衡量**),所以Kotlin的可用工具数量根本不可能与Java相提并论。更糟糕的是,所有Kotlin工具还要保证能跟Java实现互操作,这就让整个实现过程**更加复杂。”
Meta还有另一个大问题需要关注:相较于Java,Kotlin的构建速度要慢得多。
“我们从一开始就知道Kotlin的构建速度不及Java。这不光是因为Kotlin及其生态系统更加复杂,还因为Java在编译器优化方面领先了20年。由于我们拥有多个大型应用程序,所以更慢的构建速度肯定会对我们的开发者体验产生负面影响。”
最后还有一点,Strulovich称HTTP客户端项目OkHttp在2019年完成了从Java到Kotlin的迁移。这是个体量很小的项目,只有24000行Kotlin代码。但即使如此,它的Java版本编译时长仅为2.4秒,而Kotlin版本则需要10.2秒。
Meta工程师决定将几乎所有代码全部转换为Kotlin,而没有选择保留大部分Java代码,只是用Kotlin编写新增代码。顺带一提,Linux内核项目和Android开源项目倒是选择了通过增量形式引入Rust代码的**。
但Meta已经在GitHub上发布了好几款内部Kotlin转换工具,可供其他人直接使用,或者至少能激励大家积极寻求自己的自动化转换方案。这对整个Kotlin生态系统的健康**和吸引力肯定不是坏事。
Facebook工程师们去年曾介绍称,虽然Kotlin并不难上手,但大规模采用也绝非易事。Facebook拥有自己的Buck构建系统,IntelliJ/Android Studio IDE使用的则是Gradle。
Strulovich还具体介绍了Meta贡献的几款开源Kotlin工具,例如能够让Kotlin**“与Java对等开发体验”的Pygments库。Meta还开发了Ktfmt,一款面向IntelliJ和Android Studio的插件,能提供“符合google-java-format代码理念的决定性Kotlin格式化程序”。
Strulovich指出,截至目前,Meta的代码库体积平均缩小了11%。Google Home团队则报告称,在将新功能开发迁移至Kotlin之后,其应用程序的代码库也成功瘦身了33%。
Strulovich提到,“我们从网上看到的数字还要更高,但估计不同项目对应的具体瘦身比例可能有很大差异。但无论如何,我们对这个数字感到满意,因为里面删除的行通常是样板代码,Kotlin在这部分代码上确实比Java更优。”
Kotlin最初由JetBrains负责开发,即IntelliJ等开发者工具/IDE的开发商。自2017年以来,Google就一直使用Kotlin构建Android应用程序,并从2018年起联合JetBrains建立起了Kotlin基金会。
2019年,Google Android团队开始采用“Kotlin优先”方法。Google目前拥有70多个部分或全部由Kotlin构建的Android应用,包括Google Maps、Google Home、Google Play、Google Drive以及Google Messages。相较于Java,Google称Kotlin的效率更高、代码安全性更强、代码库体量更小,而且能跟Java实现100%互操作——这大大**了两种代码的共存难度与旧代码转换门槛。
Google Kotlin产品经理James Ward对Meta的决定表示欢迎,“三年以来,Android一直是Kotlin开发的先行者,也带来了最出色的开发者体验,同时牢牢植根于Java及其生态的互操作性之上。所以,我们很高兴看到Meta能够迁移至Kotlin,并**初步成功。不少Google团队也经历过类似的从Java到Kotlin的迁移之旅,涵盖Android到服务器端等领域,最终积累起超1100万行Kotlin代码(截至2022年10月)。Meta的案例,再次证明我们选择的这条从Java到Kotlin的迁移道路是正确的。”