“ 咱们手上是一个很成熟的我的项目,所以毫无疑问须要保留 Java 代码,目前只会在新开发的页面中应用 Kotlin,并曾经感触到了它带来的便当。随着性能的迭代,咱们置信更多的性能会转而应用 Kotlin。”
—— 付迎鑫,电信营业厅技术负责人
中国电信电子渠道经营核心,属于中国电信三大主渠道之一,负责电信线上渠道的治理与经营。电信营业厅 app 则是中国电信线上渠道的次要入口。目前该利用的注册用户超过 2 亿,月沉闷用户靠近 6,000 万,月交易额在 10 亿以上。
电信营业厅利用的技术团队所面临的挑战,根本都和 “ 速度 ” 无关:
- 电信营业厅 app 不是简略的工具利用,而是中国电信在线服务的官网品牌,并基于这个定位打造成了包含电商、互联网直播、浏览、音乐、影视、游戏、资讯、生存服务、公益事业的综合服务平台。要确保如此繁多的性能都晦涩稳固地运行,对技术团队的开发效率都有非常高的要求。
- 宏大的用户群体也使得利用运行的硬件和平台非常多样,技术团队须要跟得上用户们更换新设施、更新操作系统的速度。
- 大型利用天然也会有宏大的历史资产,一旦须要对这些资产进行迭代,也须要尽可能升高工夫老本。
而 Kotlin 带来的 “ 加速度 ”,则让开发团队切实感触了一把 “ 推背感 ”。
第一脚油门总是须要谨慎
2017 年上海,开发团队在谷歌开发者大会上理解到 Kotlin 技术框架曾经日趋成熟,在看到很多支流利用纷纷开始应用 Kotlin 之后,团队便决定将 Kotlin 作为重点钻研和学习的方向,并开始定期举办外部的学习和分享流动。
△ 电信营业厅技术团队核心成员于谷歌开发者大会。
左起: 付迎鑫 (电信营业厅技术负责人)、刘峻宇 (电信营业厅星播客项目经理)、曾皓 (电信营业厅 Android 项目经理)、张熠 (电信营业厅 Android 项目经理)、黄森燊 (电信营业厅 Android 开发工程师)
但对开发者们来说,感触一门语言最间接的形式,仍然还是上手开发。于是团队决定先在中国电信渠道核心的外部利用 “ 电渠报表 ” 中应用 Kotlin 作为主打开发语言。
非常简洁的语法,对 lambda 表达式的反对,以及充分考虑了古代编程需要的架构,让团队 “ 关上了新世界的大门 ”。之后 Kotlin 很快就呈现在了中国电信渠道核心的各个外围业务中,包含本文结尾提到的电信营业厅利用,以及电信星播客利用。
“ 目前来看,我的项目整体曾经有 20% 在应用 Kotlin,开发新性能的话 50% 的代码都是 Kotlin。”
—— 付迎鑫,电信营业厅技术负责人
△ 用来 “ 小试牛刀 的电渠报表利用
开得快,开得稳
其实很多时候,” 快 ” 和 “ 稳 ” 并不矛盾——疾驰的跑车如果时不时爆胎,那显然也是跑不快的。
空指针异样 (NPE) 导致的解体 (或 ANR) 就是让开发者和用户们丧气的 “ 爆胎 ”。Kotlin 能够爱护我的项目防止对可空类型进行误操作。如果类型检测正确,编译器还会进行主动类型转换,NPE 的呈现概率升高了 80% 之多,我的项目稳定性和健壮性显著进步,更为对接和展现各省返回的业务数据打下了良好的根底。
Kotlin 的另一个要害新个性是协程,它是一个轻量级的线程,一个线程中能够创立任意个协程,线程的执行和完结是由操作系统调度的,而协程能够让开发者手动管制其执行和完结。在我的项目中,团队会联合应用 Retrofit 和协程来解决网络申请,从而更好地管制工作的执行,这样会比单纯应用线程更加节俭资源,也更加高效。在应用协程后,团队得以升高首页各个频道接口调用所需的资源,接口调用周期也更加可控。目前电信营业厅的首页和商城等外围页面都是通过 Kotlin 打造出晦涩的应用体验。
△ 电信营业厅利用的首页和商城页面
Kotlin 的 “ 快 ” 还体现在对代码的精简上。对于习惯了简短 Java 代码的 Android 开发者来说,Kotlin 的 SAM (Single Abstract Method) 转换一下子缩减大量的模版代码可能会让他们不太适应——尤其是在通过 lambda 表达式实现 SAM 转换的时候。但更简洁、更有可读性的代码无疑能够让开发者的注意力更容易集中在业务逻辑上,而不是简短的模版代码上。
另一个能大量精简代码的中央是控件绑定,以前在 Activity 中须要为绑定控件编写大量的代码 (没错,就是 “findViewById”)。引入 Jetpack View Binding 之后,ID 能够间接当做变量应用,在 ViewBinding 推出之后,配合 Kotlin 能写出更加平安和简洁的代码。
是时候看看远方的风光了
应用 Kotlin 带来的另一个益处,就是进入 Android 平台新性能的 “ 快车道 ”。
比方 Android 10 的时候平台减少了对折叠屏设施的反对,但想要让用户在折叠 / 开展设施时感觉晦涩,免不了须要让利用妥善保留界面状态和反对配置变更,用 Java 编写这种 “ 保留 / 读取配置 ” 的工作尽管可行,但 Kotlin 的 lambda 解构形式可能帮忙开发者更加不便地对须要保留的实体类和相干配置进行批改和读取,代码更加精简,可读性也更好。
△ 电信营业厅的折叠态和开展态
在 Android 反对 5G 之后,开发团队能够通过 ConnectivityManager 类拓展的新办法为 5G 用户打造更加疾速的网络体验。对那些流量敏感的用例,也能够间接应用 网络连接 API 来检测设施是否进行了高带宽连贯,并能 查看连贯是否计费。这时,开发团队大量应用了 Kotlin 的部分委托属性,使代码更加清晰明了。
来自团队的教训分享
从接触、理解 Kotlin,到逐渐尝试,乃至正式采纳,电信营业厅技术团队总结了一些第一手的教训,这里和大家分享。
- 在应用 Kotlin 前,首先要对我的项目组成员对 Kotlin 的相熟水平做一个简略的评估。对于新我的项目来说,须要对我的项目自身工作量进行评估,如果工夫布局上比拟富余,能够思考引入 Kotlin,这也能够让开发团队在实践中更加理解 Kotlin;而对于老我的项目来说,就须要综合思考兼容性、稳定性、维护性等其余相干因素。
- 须要为兼容性相干问题多预留一些解决工夫,尤其是我的项目组成员对 Kotlin 还不那么相熟的时候。
- 如果在开发过程中发现最新的 Kotlin 须要降级到 AndroidX,须要谨慎推动。因为降级 AndroidX 又会和很多第三方库产生抵触,这时只能通过与第三方进行协调来解决问题。
“ 咱们会持续加大在 Kotlin 上的投入,指标是在新我的项目中 100% 应用 Kotlin。”
—— 付迎鑫,电信营业厅技术负责人
更简洁、更高效、更古代的 Kotlin,曾经让电信营业厅技术团队感触到了实在的 “ 加速度 ”。您是否曾经筹备好进入 Android 开发的 “ 快车道 ” 了呢?