查看原文
其他

Kotlin 实战指南 | 如何在大型应用中添加 Kotlin

Android 谷歌开发者 2019-02-14

作者 / 宋立心 (Tiem Song), Android 软件工程师  

每次参加开发者大会,开发者最常问我的一个问题就是: "我该如何在现有 Android 应用中添加 Kotlin? 最好的方法是什么?" 如果您工作的团队规模较大,转于用新的开发语言确实会比较复杂。渐渐的,我给的回应越来越详细,而且也会根据其他开发者的心得体会 (Google 内部和外部均有) 以及我自己用 Kotlin 的实际经验调整我的答案。


以下提供的指南针对于帮助大型团队在现有应用中介绍如何使用 Kotlin。Google 内部有不少团队,列如 Android 开发者关系团队,已经成功使用了这些指导方针。典型的两个例子是:一,完全用 Kotlin 重新编程的 2018 Google I/O 应用;二,混合 Java 和 Kotlin 来编程的 Plaid

  • 2018 Google I/O 应用: 

    https://github.com/google/iosched

  • Plaid: 

    https://github.com/nickbutcher/plaid



如何在应用中添加 Kotlin

团队内指定一位 Kotlin 推广者

首先,您应该从团队中选一位同学来担任 Kotlin 专家和导师的角色。这位一般不难找,他/她往往是团队里对 Kotlin 最感兴趣的。正在阅读这篇的您很可能就是那位吧! 推广者应该尽可能多的学习 Kotlin 语言,同时探索在现有应用中利用 Kotlin 的最佳方法。也鼓励这位同学除了积极分享 Kotlin 相关知识,为队友答疑解惑之外,也参与到 Java 和 Kotlin 的代码审查工作中,确保变更后的代码符合 Kotlin 规范,并保障两种语言之间的可互操作性 (如可空性注解)。


学习基础知识

在推广者负责深入钻研的同时,其他同学应该掌握一定的基本知识。现在有许多适合 Kotlin 新团队的学习资源,让团队在熟悉语言的同时,了解 Kotlin 与 Android 的交互机制。我个人比较喜欢从 Kotlin Koans 入门,通过一系列编程练习逐步掌握 Kotlin 的主要语言特性,边练边学,趣味无限。

  • Kotlin Koans: 

    https://kotlinlang.org/docs/tutorials/koans.html


前往 Kotlin 官方网站查看参考文档,学习 Kotlin 标准库的使用方法,或者按照分步教程,了解如何使用 Kotlin 完成不同的任务。此外,Android 开发者网站中还有不少的 Kotlin 学习资源,包括 31 天的 Kotlin 系列,值得好好探索一番。

  • Kotlin 标准库:

    http://kotlinlang.org/api/latest/jvm/stdlib/index.html

  • 参考文档: 

    http://kotlinlang.org/docs/reference/

  • Kotlin 学习资源: 

    https://developer.android.google.cn/kotlin/index.html


组建学习小组

当团队能够使用基本 Kotlin 编程后,就可以开始组建学习小组。由于 Kotlin 发展速度较快,诸如 CoroutinesMultiplatform 一类的新特性层出不穷,通过定期举行小组讨论,可以一边学习新的语言特性,一边巩固 Kotlin 在公司内部的最佳实践。

  • Coroutines: 

    https://kotlinlang.org/docs/reference/coroutines.html

  • Multiplatform: 

    https://kotlinlang.org/docs/reference/multiplatform.html


使用 Kotlin 编写测试代码

在聊到项目实战开发时,许多团队表示用 Kotlin 编写测试是个不错的切入口,因为这既不会影响到生产代码,又不会把 Kotlin 代码捆绑到应用包中。团队可以选择用 Kotlin 编写新测试,或者将现有测试转换成 Kotlin 代码。测试对于检查代码回归很有用,并且在重构代码时会增加一定的置信度。在将现有 Java 代码转成 Kotlin 时,会发现这些测试尤为有效。


使用 Kotlin 写新代码

在转换现有 Java 代码至 Kotlin 时,可以尝试向现有应用的代码中添加一些小段的 Kotlin 代码:从小型类或者顶层辅助函数着手在 Kotlin 代码中添加相关注释,以确保与 Java 代码的正确互操作性。

  • 注释: 

    https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html


Kotlin 对 APK 体积以及构建情况的影响

添加 Kotlin 代码后,应用的 APK 体积大小和构建时间可能会有所增加。可以使用 Proguard 对 APK 进行发布前优化,从而最大程度减少输出文件脚本的增量。运行 Proguard 后,Kotlin 对 APK 体积的影响应该很小,尤其是当开始使用 Koltin 的阶段。

  • Proguard: 

    https://developer.android.google.cn/studio/build/shrink-code


在纯 Kotlin 项目和混合语言项目中 (Java 和 Kotlin 混用) ,编译时间会稍微拖长。但是,不少开发者认为 Kotlin 带来的效率提升可以有效弥补增加的时间成本。构建是开发项目中很关键的一步,Kotlin 和 Android 团队已经知道它的严重性,正在努力改进此项流程,争取缩短构建时间。建议在开发过程中,监控和测量构建情况对项目造成的影响。


将现有代码更新为 Kotlin 代码

一旦团队顺利上手 Kotlin 后,可以着手将现有代码转换至 Kotlin。


比较极端的做法是从头开始,用 Kotlin 重写一遍应用代码。我们在开发 2018 Google I/O 应用时,采取的就是这个策略。但是该方法对于大部分团队并不适用,因为它要求开发者在采用新技术的同时要保证项目的按时发行进行应用迁移。幸好,Kotlin 和 Java 可以完全互相操作,开发者不用直接一次性把整个项目都转换到 Kotlin 上,可以分布操作,比如说一次只迁移一个类。

  • 2018 Google I/O 应用: 

    https://android-developers.googleblog.com/2018/08/google-releases-source-for-google-io.html


比较实际的做法是利用 Android Studio 代码转换器对 Java 文件中的代码进行转换。或者,也可以先使用 Java 编写代码,然后再把代码复制粘贴到 Kotlin 文件中,最后通过 IDE 将文件中的 Java 代码转换为 Kotlin 代码。转换器不但能够节省大量时间,还可以让查看 Kotlin 代码在代码库中的情况;自动生成的 Kotlin 代码不一定是最佳最优化的代码,可以在此之后仔细审查和修改各个文件中的代码。


请注意,尽管 Kotlin 与 Java 具备 100% 相互操作性,但两者的源代码并非完全兼容,开发者无法在一个文件中混合使用两种语言。建议在编写互通代码的过程中,参考 Kotlin 指南Android 指南

  • 代码转换器: 

    https://developer.android.google.cn/studio/projects/add-kotlin#convert-to-kotlin-code

  • Kotlin 指南: 

    https://kotlinlang.org/docs/reference/java-interop.html

  • Android 指南: 

    https://android.github.io/kotlin-guides/interop.html



说服管理层使用 Kotlin

初步尝试过 Kotlin 之后,或许已经打心底里儿觉得它适合自己的团队了。但是要怎么样才能说服管理层和利益相关方选择 Kotlin 呢?毕竟他们不像一样热爱数据类、智能类型转换还有扩展函数。尽管具体的说辞会依情况不同而有所差异,但是我们在下面列举的论点和数据或许对会有所帮助:


  • Kotlin 有助于提升团队开发效率。通过比较 Kotlin 文件和 Java 文件内的平均代码行数,会发现 Kotlin 可以缩减至少 25% 的代码行数。写的代码少了,测试和维护的的时间成本就会相应降低,团队开发新特性的速度自然也就上去了。此外,还可以观察一下如果用 Kotlin 和 Java 开发类似的特性,哪种语言的用时会更短。


  • Kotlin 有助于改善应用质量。除了大家熟知的空安全 (null-safety) 特性以外,Kotlin 还提供了许多其它的安全特性,帮助避免各种类型的代码错误。Pinterest 建议开发者在应用程序迁移的过程中,跟踪记录每个模块的代码错误率。可以发现错误率呈下降趋势。请点击观看 Android 开发者故事对 Camera360 的专访,或者阅读近期学术研究,进一步了解 Kotlin 如何提高代码质量。


  • Kotlin 是行业趋势所在。在 Google Play Top 1000 榜单中,使用 Kotlin 开发的 Android 应用占比达到 26%,其中包括 Twitter、Pinterest、微信、美国运通卡等超重量级应用。Redmonk 公布的榜单显示 Kotlin 是目前发展第二快的的移动平台编程语言。科技媒体 Dice 也曾发文指出 Kotlin 的相关工作数量呈爆炸式增长


  • Kotlin 让的团队更开心。虽然幸福感很难量化,但是可以通过适当的方式让管理层体会到团队对 Kotlin 的热爱。根据《 StackOverflow 2018 年度开发者调查报告》显示,Kotlin 是目前第二大最受欢迎的编程语言。


  • 其它的安全特性: 

    https://proandroiddev.com/kotlin-avoids-entire-categories-of-java-defects-89f160ba4671

  • 近期学术研究: 

    https://www.theregister.co.uk/2018/08/02/kotlin_code_quality

  • 爆炸式增长: 

    https://insights.dice.com/2018/09/24/kotlin-jobs-meteoric-rise-android

  • StackOverflow 2018 年度开发者调查报告: 

    https://insights.stackoverflow.com/survey/2018#most-loved-dreaded-and-wanted



下一步

有了一定的 Kotlin 实战经验后,一定很好奇要如何在日常开发中运用 Kotlin,为此我们额外准备了一些实用技巧,希望对有参考价值。


为项目制定代码风格规范

《 Kotlin 风格指南》《 Android Kotlin 风格指南》为确定 Kotlin 代码格式提供了很好的建议。可以在此基之上确立最适合团队的编码规范和习惯用法。


可以通过以下两种策略来统一 Kotlin 的代码风格: (1) 自定义 Androis Studio 的代码风格;(2) 使用 Linter。在 SunflowerPlaid 项目中,我们就使用了 Ktlint 保障代码风格的规范性。Ktlint 提供了一系列符合 Kotlin 标准风格指南的默认设置,并且允许开发者根据具体要求进行自定义更改。

  • Kotlin 风格指南: 

    https://kotlinlang.org/docs/reference/coding-conventions.html

  • Android Kotlin 风格指南: 

    https://android.github.io/kotlin-guides

  • 代码风格: 

    https://www.jetbrains.com/help/idea/copying-code-style-settings.html

  • Sunflower: 

    https://github.com/googlesamples/android-sunflower

  • Plaid: https://github.com/nickbutcher/plaid

  • Ktlint: https://ktlint.github.io


贵精不贵多

Kotlin 具备很多出色的语言特性,但是在实际运用时,开发者往往把控不好一个 "度",比如过度使用 Kotlin 语法糖,或者在包裹语句时使用太多的 `apply`, `let`, `use` 函数。一般情况下,不建议开发者为了缩短代码行数而牺牲了可读性。我们在开发 Plaid 的时候就规定了每个 `apply` 括号中至少需要包含两行代码。可以根据具体情况,制定出最适合团队的编码规则,然后将其添加至的风格指南中。


示例项目及案例分析

可以下拉至文末的 "继续探索" 板块,查看并研究 Kotlin 相关实战案例,了解 Google 如何进行 Kotlin 项目迁移,其它公司又是如何在已有项目中添加 Kotlin 代码的。



常见问题

新技术带来新的疑问。以下我们汇总了一些开发者们在采用 Kotlin 的过程中遇到问题,并附上了对应的解决建议。


应该如何说服其他共事的工程师使用新语言?

之前在 Google I/O 开发者大会上,我和 Kotlin 首席语言设计师 Andrey Breslav 分享过几个帮助工程师采用 Kotlin 的方法。我们认为最好是采取分步策略,先试着往项目中加入少量 Kotlin 代码,然后再观察情况是否得到改善。如果最后发现 Kotlin 的缺点多于优点,决定放弃这门语言,Andrey 认为这是完全可以理解的。

  • Andrey Breslav: https://twitter.com/abreslav


学习 Kotlin 会不会很难?

大多数开发者可以轻松上手 Kotlin。资深的 Java 开发者能够使用同一套工具进行 Java 和 Kotlin 编程。还可以在 Kotlin 中找到许多与 Ruby 和 Python 相似的语言特性,如方法链。


Google 会继续支持 Kotlin 用于 Android 开发吗?

当然!Google 会一直为 Kotlin 提供有力支持。



结语

希望本文内容对的团队有所启发,帮助们将 Kotlin 顺利添加至应用中。尽管这个过程中不乏挑战,但是几乎所有开发者都告诉我,Kotlin 帮他们重新找回了软件开发的乐趣。


请注意:虽然本文主要是针对 Android 应用进行撰写的,但是文中提及的概念适用于任何类型的 Java 项目,无论是 Android 移动端应用还是服务器端。


感谢阅读本文,预祝在 Kotlin 迁移之旅上一路顺风!



 点击屏末  | 前往 Kotlin 官方文档查看更多信息



推荐阅读

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存