“我们手上是一个非常成熟的项目,所以毫无疑问,我们需要保留Java代码。目前,我们只在新开发的页面中使用Kotlin,并且有已经感受到它带来的影响。随着功能的迭代,我们相信会有更多的功能转用Kotlin。”——中国电信营业厅技术总监付迎新中国电信电子渠道运营中心,属于中国电信三大渠道之一1.负责电信在线渠道的管理和运营,电信营业厅APP为中国电信线上渠道的主入口,目前APP注册用户超过2亿,月活跃用户近6000万,月交易额超过10亿,电信技术团队面临的挑战营业厅应用基本上都与“速度”相关:电信营业厅APP不是简单的工具应用,而是中国电信在线服务的官方品牌,互联网直播、阅读、音乐、影视、游戏、资讯、生活服务,公益事业综合服务平台,要保证这么多功能流畅稳定运行,要求非常高s为了技术团队的开发效率。庞大的用户群也使得应用运行的硬件和平台非常多样化,技术团队需要跟上用户更换新设备和更新操作系统的速度。大规模的应用自然会有巨大的历史资产。一旦需要对这些资产进行迭代,就要尽可能降低时间成本。Kotlin带来的“加速度”,让开发团队真切感受到了一种“推背感”。第一个油门总是需要谨慎2017年的上海,开发团队在谷歌开发者大会上了解到Kotlin技术框架已经日趋成熟。在看到很多主流应用开始使用Kotlin后,团队决定将Kotlin作为重点研究和学习的方向,开始定期举办内部学习和分享活动。△谷歌开发者大会电信营业厅技术团队核心成员。左起:付迎鑫(电信营业厅技术总监)、刘俊宇(电信营业厅明星播客项目经理)、曾浩(电信营业厅Android项目经理)、张毅(电信营业厅Android项目经理)),黄森申(电信营业厅Android开发工程师)但是对于开发者来说,体验一门语言最直接的方式还是开发上手。于是团队决定在中国电信渠道中心的内部应用“电商渠道报表”中使用Kotlin作为主要开发语言。非常简洁的语法、对lambda表达式的支持以及充分考虑现代编程需求的架构让团队“打开了新世界的大门”。之后,Kotlin很快出现在中国电信渠道中心的各项核心业务中,包括本文开头提到的电信营业厅应用,以及电信之星播客应用。“目前整个项目有20%在使用Kotlin,50%的开发新功能的代码都是Kotlin。”——电信事业部技术总监付迎新报表应用驱动快速稳定。其实很多时候,“快”和“稳”并不矛盾——如果一辆疾驰的跑车时不时爆胎,那显然它的速度并不快。由空指针异常(NPE)(或ANR)引起的崩溃是让开发人员和用户感到沮丧的“爆胎”。Kotlin可以保护项目免受错误处理可空类型的影响。如果类型检测正确,编译器也会进行自动类型转换,减少NPE的概率。高达80%,项目的稳定性和健壮性得到显着提升,为对接展示各省回传的业务数据打下了良好的基础。Kotlin的另一个关键新特性是协程,它是一种轻量级线程。一个线程中可以创建任意数量的协程。线程的执行和结束由操作系统调度,协程允许开发者手动控制它的执行和结束。在项目中,团队会使用Retrofit和coroutines来处理Network请求,从而更好地控制任务的执行,比单纯使用线程更节省资源,效率更高。使用协程后,团队可以减少首页各个渠道的接口调用所需的资源,接口调用周期也更短可控。目前,电信营业厅首页、商城等核心页面均采用Kotlin打造流畅的用户体验。Kotlin的“快”还体现在代码的简化上。对于习惯了冗长Java代码的Android开发者来说,Kotlin的SAM(SingleAbstractMethod)转换可能会一下子减少大量的模板代码,这可能会让他们感到不舒服——尤其是在通过lambda表达式实现SAM转换的时候。但更简洁、更易读的代码无疑可以让开发人员更容易专注于业务逻辑,而不是冗长的样板代码。另一个可以大大简化代码的地方是控件绑定。以前需要为Activity中的绑定控件写很多代码(没错,就是“findViewById”)。引入JetpackViewBinding后,ID可以直接作为变量使用。引入ViewBinding后,可以使用Kotlin编写更安全、更简洁的代码。是时候看看远处的风景了。使用Kotlin的另一个好处是可以进入Android平台新特性的“快车道”。例如,在Android10中,平台增加了对折叠屏设备的支持,但如果要让用户在折叠/展开设备时感觉顺畅,应用适当保存界面状态和支持配置更改是不可避免的。写这个“保存/读取配置”的工作虽然是可行的,但是Kotlin的lambda解构方式可以帮助开发者更方便的修改和读取需要保存的实体类和相关配置,代码也更加精简和可读。△电信营业厅折叠状态和展开状态Android支持5G后,开发团队可以通过ConnectivityManager类扩展的新方法,为5G用户打造更快速的网络体验。对于流量敏感的用例,也可以直接使用网络连接API,检测设备是否有高带宽连接,检查连接是否计费。此时,开发团队大量使用了Kotlin的本地委托属性,使代码更加清晰。网络连接APIhttps://developer.android.google.cn/reference/android/net/ConnectivityManager识别非计费状态https://developer.android.google.cn/reference/android/net/NetworkCapabilities.html#NET_CAPABILITY_NOT_METEREDfrom团队的经验分享从接触和了解Kotlin,到逐渐尝试,甚至正式采用,电信营业厅技术团队总结了一些第一手的经验,我将在这里与大家分享。在使用Kotlin之前,先对项目组成员对Kotlin的熟悉程度做一个简单的评估。对于新项目,需要评估项目本身的工作量。如果时间规划比较充足,可以考虑引入Kotlin,也可以让开发团队在实践中更好的理解Kotlin;对于老项目,需要综合考虑兼容性、稳定性、可维护性等相关因素。需要为与兼容性相关的问题留出更多的解决时间,尤其是当项目团队成员对Kotlin不太熟悉时。如果在开发过程中发现最新的Kotlin需要升级到AndroidX,需要慎重推广。因为升级AndroidX会和很多第三方库冲突,只能通过第三方协调解决。“我们将继续加大对Kotlin的投入,目标是在新项目中100%使用Kotlin。”——电信营业厅技术总监付迎鑫更简单、更高效、更现代化的Kotlin让电信营业厅的技术团队感受到了真正的“加速度”。您准备好踏上Android开发的“快车道”了吗?
