0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

将其Android应用的Java代码迁移到Kotlin

OSC开源社区 来源:OSC开源社区 作者:OSC开源社区 2022-10-28 15:15 次阅读

Meta 发布了一篇博客表示,正在将其 Android 应用的 Java 代码迁移到 Kotlin,并分享了这一过程中的一些经验。

公司认为,Kotlin 是一种流行的 Android 开发语言,与 Java 相比具有一些关键优势。“因此,在我们努力使我们的开发工作流程更加高效的过程中,将 Meta 的 Android 开发转向 Kotlin 是非常合理的。..。..Kotlin 通常被认为是一种比 Java 更好的语言,在年度 Stack Overflow 开发者调查中,它的好感度要高于 Java。”

除了受欢迎程度外,Meta 还将最新的 Kotlin 版本与 Java 11(可用于 Android 开发的最新版本)进行了比较,并得出了 Kotlin 的一些主要优势:可空性、函数式编程、更短的代码、以及领域特定语言 (DSL) / 类型安全构建器等。

Facebook 软件工程师 Omer Strulovich 指出,Meta 旗下几个流行的 Android 应用 --Facebook、Instagram、Messenger、Portal 和 Quest 都已经开始从 Java 转向 Kotlin。截至目前,Facebook、Messenger 和 Instagram 的 Android 应用程序都有超过 100 万行 Kotlin 代码,并且转换率正在提高。Meta 的 Android 代码库总共已包含有超过 1000 万行的 Kotlin 代码。作为此次迁移的一部分,Meta 透露其也正在开源用于操作 Kotlin 代码的各种示例和实用程序。

不过,采用 Kotlin 也有一些不能忽视的缺点。博客内容指出,比如:两种语言的混合代码库需要长时间的处理维护;以及 Kotlin 与 Java 相比,流行度还是存在明显的差距,这意味着 Kotlin 可用的工具也更少。更糟糕的是所有 Kotlin 工具还都需要考虑 Kotlin 和 Java 的互操作性,这使得它们的实现就变得复杂。

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

如何处理迁移

Meta 称,迁移到 Kotlin 既简单又非常复杂。因为 Kotlin 的设计允许从 Java 进行简单的转换,并具有经过深思熟虑的互操作性。这种设计使 JetBrains 能够为开发人员社区提供 J2K,即 IntelliJ/Android Studio 中的 Java 到 Kotlin 转换器。但 J2K 不是万能的,迁移中的有些情况仍然很复杂。

迁移之前,该公司考虑了两个选择:

一个是可以使用 Kotlin 在 Meta 上编写新代码,但将大部分现有代码保留在 Java 中。

还有一个是可以尝试将几乎所有内部代码转换为 Kotlin。

第一个选项的优势很明显,即少得多的工作量;但是这种方法也有两个明显的缺点。首先,在 Kotlin 和 Java 代码之间实现互操作性引入了 Kotlin 中 platform types 的使用。platform types 会导致运行时空指针取消引用,从而导致崩溃,破坏了纯 Kotlin 代码提供的静态安全优势。在一些复杂的情况下,Kotlin 的空检查省略还可能漏掉空值通过,进而引发空指针异常。例如,如果 Kotlin 代码调用由 Java 接口实现的 Kotlin 接口,就会发生这种情况。其他问题包括 Java 无法将类型参数标记为可空性(直到最近才修复),以及 Kotlin 的重载规则考虑了可空性,而 Java 的重载规则却没有。

第二个缺点是考虑到 Meta 的大多数软件开发都需要修改现有代码。“如果我们的大部分代码都是用 Java 编写的,我们就无法让我们的开发人员充分享受 Kotlin 的乐趣。由于迁移是一个漫长的过程,期望每个工程师在接触文件之前将文件转换为 Kotlin 既费力又低效。”

因此,Meta 方面最终选择了第二条选项,决定将几乎所有代码转换为 Kotlin。而在尝试为现有应用程序引入 Kotlin 时,Meta 也遇到了很多麻烦,例如需要更新 Redex 以支持 Java 不生成的字节码模式。以及使用的某些内部库依赖于在编译期间进行字节码转换来获取更好的性能。而将其作为 Kotlin 编译的一部分运行时,这部分代码则无法生效。为此,Meta 专门构建了解决工具。

此外,他们还发现在现有工具中存在的一些差异。例如代码审查或 wiki 中缺少 Kotlin 语法高亮显示。“我们更新了我们正在使用的库 Pygments,以使体验与 Java 相媲美。我们更新了一些内部代码修改工具,以便能够处理 Kotlin。我们还构建了 Ktfmt,这是一个基于 google-java-format 的代码和理念的确定性 Kotlin 格式化程序。”

准备好所有工具后,Meta 就可以正式开始批量转换大量代码。“随着我们工具的改进,我们已经能够将相当大的一部分代码转换成 Kotlin。我们的代码库中已经有超过 1000 万行 Kotlin 代码,而且 Meta 的大多数 Android 开发人员现在都在编写 Kotlin 代码”。平均而言,此次迁移使代码行数减少了 11%。

Meta 方面表示,其向 Kotlin 的迁移仍在进行中并在加速。“我们已经允许 Meta 的任何想要使用 Kotlin 的 Android 开发人员这样做,并为他们提供了工具来轻松地将现有代码迁移到 Kotlin。Kotlin 仍然缺少一些我们在使用 Java 时已经习惯的工具和优化。但我们正在努力缩小这些差距。随着我们取得进展以及这些工具和库的成熟,我们还将努力将它们反馈给社区。”

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3851

    浏览量

    125648
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    103001
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66814

原文标题:已超1000万行代码,Java再次输给了Kotlin...

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何将数据从MySQL迁移到Influxdb中

    如果以前是将时序数据存放在MySQL,现在为了获取更好的性能和使用可视化工具,我们需要将数据从MySQL迁移到Influxdb中。 这看起来是一个常见场景,经过一番查阅,发现了
    的头像 发表于 11-02 10:54 689次阅读

    传统企业将VMware迁移到阿里云弹性裸金属的最佳实践

    场景描述 传统企业将VMware迁移到阿里云弹性裸金属,利用云计算平台提供的弹性基础设施,降低部分运维成本和学习成本,使用其擅长的技术工具专注自身业务,实现线下业务平滑迁移上云。 解决问题 1.
    发表于 10-11 11:51 138次阅读
    传统企业将VMware<b class='flag-5'>迁移到</b>阿里云弹性裸金属的最佳实践

    Java改为 Kotlin过程中遇到的坑

    最近了解了下 Kotlin ,其中的很多语法糖很有意思,并且可以与 Java 无缝兼容。故尝试在一个 SpringBoot 工程上将部分类修改为 Kotlin ,下面记录了由 Java
    的头像 发表于 09-30 16:51 462次阅读
    由<b class='flag-5'>Java</b>改为 <b class='flag-5'>Kotlin</b>过程中遇到的坑

    如何成功迁移到Springboot工程

    最近在做一个老旧工程的迁移,其中一个服务端接口是使用 WebService 做的,而且用的是 Axis1.4 这种老的不能再老的框架。经过一番探索和研究,终于成功迁移到Springboot工程
    的头像 发表于 09-25 10:53 736次阅读
    如何成功<b class='flag-5'>迁移到</b>Springboot工程

    用于FICON SAN结构的大型机从Brocade第5代迁移到第6/7代

    电子发烧友网站提供《用于FICON SAN结构的大型机从Brocade第5代迁移到第6/7代.pdf》资料免费下载
    发表于 09-01 14:42 0次下载
    用于FICON SAN结构的大型机从Brocade第5代<b class='flag-5'>迁移到</b>第6/7代

    171从ADS迁移到RVDS 3.0的应用笔记

    并不是一个要求。 某些ARM工具特定功能已更改或已过时,需要更改这些功能。 内联汇编程序(__ASM)C编译器有一个内置的内联汇编程序。 然而,ARM体系结构6和更高版本的指令集不会保持这一点。 建议用户将所有内联汇编代码迁移到嵌入式汇编程序,或在可能的情况下使用编译器内
    发表于 08-30 08:17

    从电源架构迁移到ARM的应用说明

    本文档的目的是强调那些参与将软件应用程序从Power架构迁移到ARM平台的人员感兴趣的领域。 本文并不试图将一种体系结构提升到另一种体系结构之上,只是为了清楚地解释将现有软件应用程序从一种体系结构
    发表于 08-22 06:09

    如何将LPC84x迁移到LPC86x

    电子发烧友网站提供《如何将LPC84x迁移到LPC86x.pdf》资料免费下载
    发表于 08-16 16:56 0次下载
    如何将LPC84x<b class='flag-5'>迁移到</b>LPC86x

    如何将项目从Arm Compiler 5迁移到Arm Compiler 6

    按照本教程中的步骤,将现有的Arm Compiler 5裸机项目迁移到Arm Compiler 6裸机项目。完成迁移后,就可以重新构建您的可执行并在DS-5提供的固定虚拟平台(FVP)模型上运行。
    发表于 08-02 14:42

    如何使用Neon intrinsic的矢量处理代码迁移到氦intrinsic

    本指南旨在帮助任何将使用霓虹灯内部函数的现有矢量处理代码迁移到氦内部函数的人。我们将研究不同复杂度的霓虹灯代码示例,并研究如何将该霓虹灯代码迁移到
    发表于 08-02 07:39

    Android自定义Toast Kotlin

    电子发烧友网站提供《Android自定义Toast Kotlin.zip》资料免费下载
    发表于 06-16 11:43 0次下载
    <b class='flag-5'>Android</b>自定义Toast <b class='flag-5'>Kotlin</b>

    Kotlin协程实战进阶之筑基篇3

    协程的概念在1958年就开始出现(比线程还早), 目前很多语言开始原生支, Java 没有原生协程但是大型公司都自己或者使用第三方库来支持协程编程, 但是Kotlin原生支持
    的头像 发表于 05-30 16:26 435次阅读

    Kotlin协程实战进阶之筑基篇2

    协程的概念在1958年就开始出现(比线程还早), 目前很多语言开始原生支, Java 没有原生协程但是大型公司都自己或者使用第三方库来支持协程编程, 但是Kotlin原生支持
    的头像 发表于 05-30 16:25 470次阅读
    <b class='flag-5'>Kotlin</b>协程实战进阶之筑基篇2

    Kotlin协程实战进阶之筑基篇1

    协程的概念在1958年就开始出现(比线程还早), 目前很多语言开始原生支, Java 没有原生协程但是大型公司都自己或者使用第三方库来支持协程编程, 但是Kotlin原生支持
    的头像 发表于 05-30 16:24 363次阅读
    <b class='flag-5'>Kotlin</b>协程实战进阶之筑基篇1

    如何将Mifare Classic系统迁移到Mifare Plus或Mifare Desfire?

    大家好,我叫 Antonio,在一家安防公司担任售前工程师。我们现在有一个伟大的项目,我们必须将 Mifare Classic 系统迁移到 Mifare Plus EVx 或 Mifare
    发表于 05-17 07:42