如何通过 Android Vitals 修复应用质量问题(第 2 部分)





0/5 (0投票)
修复崩溃和不必要的唤醒锁如何提高 Play 商店性能
我很高兴看到越来越多的人通过 Google Play Console 中的 Android Vitals 部分成功地修复了应用质量问题。自我的 第一篇关于 Android Vitals 的文章以来,我们一直在不断改进,为您带来新的指标和功能。在本文中,我将首先介绍新内容,然后带您了解如何处理卡住的唤醒锁和崩溃。
Android Vitals 新增功能
我们在 Google I/O 2018 上 宣布了新的 Android Vitals 功能。这些改进包括两个新的性能领域、现有指标信息的增强以及一种提醒您注意 Android Vitals 意外变化的方式。
类别基准
应用中“良好”(低)或“不良”(高)的 Vitals 水平很大程度上取决于应用所在的 Play 商店类别。例如,“棋盘游戏”类别中的应用的平均启动延迟低于“赛车游戏”类别中的应用。这就是为什么 Android Vitals 现在显示类别基准的原因,这样您就可以看到您的应用与同类应用相比的性能表现。
异常检测
应用行为的突然变化并非好事。为了帮助您快速应对这些情况,每当 Android Vitals 检测到 Vitals 指标的突然飙升时,它都会在 Play Console 和电子邮件中通知您。然后,您可以访问 Android Vitals 来了解情况并解决原因。
权限拒绝
查看用户拒绝您应用权限请求的百分比。当拒绝率很高时,您可以审查您的应用设计,看看例如,是否更突出地显示权限原因可以帮助用户更放心地授予该权限。
应用启动时间
即使您提供了出色的功能或卓越的游戏体验,如果您的应用启动速度太慢,用户也不会停留下来使用它。为了帮助您了解这是否可能是您应用中的一个挑战,这个新的性能区域显示了您的应用或游戏从三种类型的应用启动中启动的速度:冷启动(当您的应用最近未使用且未缓存在内存中时);温启动(当您的应用在内存中,但 Activity 需要重新创建时);以及热启动(当用户返回应用时,应用和 Activity 都在内存中)。
当您在 Android Vitals 中看到启动问题时,请使用 Android Studio 3.2 中的 新的 Android Profiler 工具,例如应用启动 CPU 分析和 Systrace,来追踪启动延迟问题。
核心 Vitals
所有 Vitals 指标对于高质量的应用都很重要。但是,有四个指标可以成为您的首要任务:过度唤醒、ANR、卡住的后台唤醒锁和崩溃。过度唤醒和 ANR 是我 第一篇文章的主题。所以,现在我将关注唤醒锁和崩溃。
唤醒锁
过去,在 Android 中进行后台工作依赖于在需要时创建后台服务,这些服务会运行所需的时间——有时称为自由运行服务。在运行这些后台服务时使用唤醒锁,以防止设备的 CPU 和无线电功能关闭。
以这种方式使用唤醒锁并非最优。应用可以过于频繁地安排其服务,并最终运行过长时间,占用内存等资源。这种资源使用通常会导致设备性能下降和过度耗电,因为 CPU 和无线电使用增加,并且它们阻止设备进入睡眠状态。
Android Vitals 在 **卡住的唤醒锁** 和 **卡住的唤醒锁(后台)** 页面上提供了您应用通过 PowerManager
类获取的 部分唤醒锁的详细信息。部分唤醒锁可确保 CPU 运行,但屏幕和键盘背光可以关闭。
在报告中,您将看到受卡住唤醒锁影响的电池会话(设备两次充满电之间的时间)的百分比。信息包括过去两个 30 天期间受影响会话的百分比、显示您的应用与 Google Play 上(按安装量计算)排名前 1000 的应用相比的基准、受影响会话随时间变化的图表,以及(截图未显示)按应用版本、Android OS 版本和设备等标准划分的一系列细分。
如果基准显示您的应用受卡住唤醒锁影响的会话百分比 **处于后 25%**,**请开始考虑改进您的应用**。
正如我在 第一篇文章中提到的,自 Android 5.0 引入 JobScheduler 以来,最佳实践建议是逐步淘汰使用闹钟和自由运行服务。从 Android Oreo 开始,这一转变变得强制性,因为您的应用无法再在后台启动服务(这将导致异常)。同样,请将您的应用从使用唤醒锁转移开,因为现在对于大多数用例都有更好的替代方案。因此,我们建议您不要使用唤醒锁,而是为您的应用执行以下操作:
- 当作业需要在后台运行时,请使用 JobScheduler 或 WorkManager API。 使用这些功能将在作业运行时为其持有唤醒锁。
- 当您想在固定时间或固定时间间隔运行后台任务时,请安排 AlarmManager 广播。
AlarmManager
会在您的BroadcastReceiver.onReceive()
方法运行时持有唤醒锁。 - 在您希望在用户查看应用中的 Activity 时保持屏幕亮起的任何窗口中添加 FLAG_KEEP_SCREEN_ON。 例如,在阅读电子书时。通过这种方法,当 Activity 不再可见时,系统将清除唤醒锁。
当您需要自行管理唤醒锁时(例如,在使用长时间运行的前台服务播放音轨时),请记住遵循以下规则:
- 使用
PARTIAL_WAKE_LOCK
,不要使用已弃用的唤醒锁类型。 - 获取唤醒锁时指定超时时间,这样,如果您的应用未能释放唤醒锁,系统将在超时到期时自动清除它。
- 为唤醒锁提供静态、描述性的标签,例如 com.myapp: my wake lock,以获得 Android Vitals 中唤醒锁的最佳报告。不要在标签中添加计数器或其他动态数据。通过良好的描述性标签,Android Vitals 可以将相似的唤醒锁进行分组(合并),从而为您提供单个唤醒锁行为的准确图景。
- 在不再需要唤醒锁时释放它们。请记住,错误也可能导致唤醒锁不再需要。处理错误的良好方法是防御性编程,并将调用包装在
try { … } finally { wakeLock.release(); }
块中。
崩溃
Android Vitals 提供崩溃的汇总视图和详细视图。在崩溃率和多重崩溃率页面上,您会看到崩溃数据与使用数据相结合,生成一个标准化的指标。
除了此汇总信息外,您还可以在 ANR 和崩溃页面上查看实时崩溃详情。
与卡住的后台唤醒锁一样,与崩溃率进行比较的关键指标是“不良行为阈值”。**如果您的应用的崩溃率超过了不良行为阈值,我们建议您优先处理崩溃**。
您的代码可能因多种原因导致异常并导致应用崩溃。因此,在此讨论并提供解决方案是不切实际的。但是,我可以提供一些通用建议来帮助避免崩溃。
Android Vitals 是一个很好的途径,可以获取有关最常见崩溃以及有多少用户受到影响的信息。Android Vitals 的一个巨大优势在于,它可以捕获在第三方崩溃报告 SDK 有机会初始化之前发生的崩溃。
如果您需要更多信息来帮助重现、调试和修复崩溃,请考虑使用 Firebase Crashlytics。此工具可以深入了解应用在崩溃时的情况。Firebase Crashlytics 通过与 Firebase Analytics 集成并允许您添加自定义日志记录来包含在崩溃报告中,从而实现这一点。
我关于避免许多常见崩溃原因的关键建议是:
- 不要重复造轮子
- 切换到 Kotlin
- 坚持使用
public
API
不要重复常见的代码模式
为什么要冒着在编码常见任务时出错的风险,当高质量、不易导致崩溃且易于重用的库随处可用时?
您可以为代码中许多常见任务找到库的一个好来源是 Android Jetpack,它是一组库,可以作为大多数 Android 应用的基础。您可以依赖 Android Jetpack 来处理许多常见任务,例如 Activity 生命周期管理、导航、运行后台作业、数据库操作、从外部加载数据等等。您不必仅限于 Google 开发的库。市面上有许多出色、经过测试且开源的库可供您在应用中使用。
考虑从 Java 切换到 Kotlin
去年在 I/O 大会上,我们宣布 Android 支持 Kotlin。我们正在通过改进 Kotlin 支持来继续这项投资。最终目标是提高开发者的生产力,至少部分是通过避免一些可能导致崩溃的常见编码错误。
Kotlin 的一个优点是它的类型系统中内置了可空性信息。通过 null
安全调用和编译时 null
检查,您可以更有信心地确保您的代码不会在运行时导致 NullPointerException
。如果您还没有尝试过 Kotlin,我鼓励您 尝试 Kotlin。您可以逐渐将其添加到您的应用中,无需替换所有 Java 代码,因为 Kotlin 与 Java 具有出色的互操作性。
坚持使用公共 Android API
public
Android API 是在 Android Developer 网站上记录的类和 public
方法。这些 API 保证在所有经过认证的 Android 设备上可用并正常工作。使用反射可以访问的 private
或隐藏方法可能是导致崩溃的巨大来源。这些方法的挑战在于,它们不能保证在设备上可用,并且经常在每次 Android 更新时发生更改或中断。因此,它们适用于实验,但我们建议在公开的 Play 商店应用中避免使用它们。
由于 private
或隐藏方法存在问题,在 Android P Developer Preview 和所有未来的 Android 版本中,对这些未记录的 private
API 的访问受到限制,您的应用可能需要立即停止使用它们才能保持兼容。如果您想了解更多信息,请查看预览网站上的文章 对非 SDK 接口的限制。
最后的忠告
Android Vitals 旨在帮助您构建更高质量的应用,吸引并留住更多用户,从而建立蓬勃发展的业务。在我的两篇文章中,我为您提供了关于四种核心 Vitals 指标(过度唤醒、ANR、卡住的后台唤醒锁和崩溃)的基本信息。我还介绍了一些最近添加到 Android Vitals 的功能。
希望通过遵循本文中的建议和见解,能够帮助您更好地理解您应用的 Android Vitals 指标,并利用这些指标来提高您应用的质量。
如果您想了解更多信息,请查看 Android Vitals:调试应用性能并获得回报 这场 Google I/O 2018 会议的录像,这是我和 Joel t Newman 以及 Fergus Hurley 共同主持的。您还可以从 Google Play 上的 Medium 博客 中了解更多适用于 Android 应用和游戏的最佳实践。
如果您对 **Android Vitals** 有任何想法,请通过发推使用 **#AskPlayDev** 告知我们,我们将从 @GooglePlayDev 回复您,我们会在其中定期分享有关如何在 Google Play 上取得成功的消息和技巧。