查看原文
其他

减少崩溃,提升体验 | 使用 Kotlin 打造优质应用

Android 谷歌开发者 2021-08-05
作者 / Florina Muntenescu, Android Developer Advocate


每一个用户都希望从应用中获得无缝体验。崩溃会导致差评增加、应用卸载,甚至有损品牌认可度。与社区交流后,我们了解到开发者采用 Kotlin 的主要原因之一是为了更安全的代码。我将在本文中讲述 Kotlin 提高开发者代码稳定性的几种方式,也会通过 Google Play 商店统计的结果,看看使用 Kotlin 与崩溃数量之间是否有相关性 (剧透一下: 当然有!)。



应用质量


应用质量不仅影响着用户体验,应用的大量崩溃还会影响一些其他方面:

  • 应用曝光度 - Google Play 商店推荐由人工策划和算法计算共同完成,其中质量是最大的考量因素之一。

  • 品牌 - 产品表现会影响评分和评论,从而影响品牌认可度。

  • 更多的 (参与) 用户数量 - 更好的自然搜索数据和品牌认可度可以带来更好的用户获取和留存,这也会影响参与度和降低漏斗指标。


使用 Kotlin 构建的应用出现崩溃的可能性降低了 20%。

Kotlin 在其中扮演了什么角色?我们研究了 Google Play 排名前 1,000 的应用,发现使用 Kotlin 的应用与不使用 Kotlin 的应用相比,其用户崩溃率低 20%。

比如 Kotlin 的空安全性就让点评的 Android 应用团队赞不绝口,而且团队开发者还可以通过在 Java 代码中使用 @Nullable 和 @NonNull 等注解来确保 Kotlin 代码获得正确的可空性推断。整体上看,Kotlin 的空安全特性帮助点评 Android 应用将空指针导致的崩溃从日均 3 个降低至 0。



避免 NullPointerException


NullPointerException (空指针异常) 是 Google Play 上崩溃的第一大原因。2017 年,中国电信营业厅应用团队就开始使用 Kotlin,现在他们的新项目大约有 50% 的代码都是 Kotlin 编写。团队成功将空指针异常的出现概率降低了 80% 之多

为了避免 NullPointerException,您需要确保正在处理的对象引用非 null,然后再调用方法或尝试访问其成员。在 Kotlin 中,是否可为 null 是类型系统的一部分。例如,一个变量从一开始就需要被声明为可为 null 或不可为 null。在使是否可为 null 成为类型系统的一部分后,您不必再依赖内存和对代码库的了解,也不必依赖编译时警告 (如果用 @Nullable 注解字段/参数)。由于是否可为 null 被强制执行,您将得到编译时错误,而不仅仅是警告。官方文档介绍了处理是否可为 null 的方式。

  • 官方文档
    https://developer.android.google.cn/topic/performance/vitals/crash#prevent-crashes-null-pointer



避免常见问题


开发者会无意中引入一些问题,有些问题可能非常微妙且难以察觉。以下是使用 Kotlin 可以避免的一些问题。

hashCode() 和 equals()
如果两个对象相等,那么它们的哈希代码应该相同。然而,经常会发生忘记实现其中一个方法或者在类中添加新属性时忘记更新。当处理仅用于保存数据的类时,请使用 Kotlin 数据类。通过数据类,hashCode()equals() 将由编译器生成,会在您更改类属性后自动更新。


  • 数据类
    https://kotlinlang.org/docs/reference/data-classes.html



结构相等与引用相等


两个对象是在结构上相等 (具有同等内容) 还是在引用上相等 (指针相同)?在 Java 编程语言中,对于原语,您始终会使用 ==,因此,一个常见的错误是为对象也调用 == (引用相等),而实际上您想检查它们是否在结构上相等 (通过调用 equals() 检查)。首先,Kotlin 没有原语类型,它使用的是 IntString 这样的类;因此您不需要在对象和原语类型之间做这种区分,因为每一个事物都是一个对象。其次,Kotlin 为结构相等定义了 ==,为引用相等定义了 ===避免在不该检查引用相等的时候进行检查



If else if else if else 不足的时候


使用枚举时,通常需要确保涵盖所有可能的情况。这就需要使用开关或 if else 链。修改枚举来添加新的值时,您必须手动检查使用枚举的每个代码段,并确保处理好新的情况。但这很容易出错。在 Kotlin 中,如果您使用 when 作为表达式,就可以依靠编译器来处理: 如果您没有覆盖所有可能的分支,会出现一个编译器错误。



结论


应用稳定性对用户和品牌至关重要。立即使用 Kotlin,降低崩溃率,提高用户满意度,并保持较高的应用评分让您的用户留存和获取始终处于领先地位。

您可以进一步阅读如何利用 Kotlin 打造更优质的应用,并通过我们的案例研究来了解开发者如何从 Kotlin 中获益。Kotlin 是世界上最受欢迎的语言之一,欢迎访问我们的使用入门页面,迈出您使用 Kotlin 的第一步!


  • 利用 Kotlin 打造更优质的应用
    https://developer.android.google.cn/kotlin/build-better-apps
  • 案例研究
    https://developer.android.google.cn/kotlin/stories
  • Kotlin
    https://developer.android.google.cn/kotlin
  • 世界上最受欢迎的语言之一
    https://insights.stackoverflow.com/survey/2020
  • 使用入门
    https://developer.android.google.cn/kotlin/first



推荐阅读






 点击屏末 | 阅读原文 | 迈出使用 Kotlin 的第一步



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存