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

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

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

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

如何在应用中添加 Kotlin

团队内指定一位 Kotlin 推广者

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

学习基础知识

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

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

组建学习小组

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

使用 Kotlin 编写测试代码

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

使用 Kotlin 写新代码

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

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

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

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

将现有代码更新为 Kotlin 代码

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

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

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

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

说服管理层使用 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 是目前第二大最受欢迎的编程语言。

下一步

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

为项目制定代码风格规范

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

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

贵精不贵多

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

示例项目及案例分析

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

常见问题

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

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

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

学习 Kotlin 会不会很难?

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

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

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

结语

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

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

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

点击这里前往 Kotlin 官方文档查看更多信息

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容