每次参加开发者大会,开发者最常问我的一个问题就是: "我该如何在现有 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 发展速度较快,诸如 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