每次参加开发者大会,开发者最常问个人一个问题就是: "我该如何在现有 Android 应用中添加 Kotlin? 最好的方法是什么?" 若是您工做的团队规模较大,转于用新的开发语言确实会比较复杂。渐渐的,我给的回应愈来愈详细,并且也会根据其余开发者的心得体会 (Google 内部和外部均有) 以及我本身用 Kotlin 的实际经验调整个人答案。html
如下提供的指南针对于帮助大型团队在现有应用中介绍如何使用 Kotlin。Google 内部有很多团队,列如 Android 开发者关系团队,已经成功使用了这些指导方针。典型的两个例子是:一,彻底用 Kotlin 从新编程的 2018 Google I/O 应用;二,混合 Java 和 Kotlin 来编程的 Plaid。java
2018 Google I/O 应用: android
https://github.com/google/ioschedios
Plaid: git
https://github.com/nickbutcher/plaidgithub
如何在应用中添加 Kotlin编程
团队内指定一位 Kotlin 推广者api
首先,您应该从团队中选一位同窗来担任 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 发展速度较快,诸如 Coroutines 和 Multiplatform 一类的新特性层出不穷,经过按期举行小组讨论,能够一边学习新的语言特性,一边巩固 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。在 Sunflower 和 Plaid 项目中,咱们就使用了 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 迁移之旅上一帆风顺!