对于一个应用开发者来说,没有比开心的用户更好的衡量成功的标准,而且最好是有很多这样的用户。实现这一目标的最佳方式是拥有一个人人都想用的优秀应用,不过我们所说的“优秀”指的是什么呢?它可以归结为两件事:功能和应用质量。前者最终取决于你的创造力和选择的商业模式,而后者可以客观地衡量和改进。
在去年进行的一项 Google 内部研究中,我们查看了 Play Store 中的一星评论,发现超过 40% 的人提到应用稳定性的问题。相对的,人们会用更高的评分和更好的评论持续奖励那些表现最佳的应用。这使得它们在 Google Play 上获得更好的排名,而好的排名有助于提高安装量。不仅如此,用户还会更加投入,并愿意在这些应用程序上花费更多的时间和金钱。
因此,解决应用程序的稳定性问题可以在很大程度上决定它有多成功。
为了提供一个客观的质量衡量标准,使你可以轻松发现应用需要解决哪些稳定性问题,我们在 Play Console 中添加了一个名为 Android vitals 的新模块。这个模块可以告诉你应用程序的性能和稳定性问题,而不需要在代码中添加仪器或库。当你的应用程序运行在众多设备上的时候,Android vitals 会收集关于应用程序性能的匿名指标。即使在使用硬件实验室进行测试时,它也会以其他方式难以获得的规模为你提供信息。
Android vitals 可以提醒你的问题包括崩溃、应用程序无响应(ANR)和渲染时间。这些问题都直接影响你的用户对应用的体验和看法。此外,还有一类用户可能不会直接与你的应用关联的不良应用行为:比如耗电的速度比预期的要快。
在本文中,我将着眼于以下两个问题:
那么,唤醒是什么以及它们何时变得过度呢?
为了延长电池的续航时间,屏幕关闭后,Android 设备将通过禁用主 CPU 内核进入深度睡眠模式。除非用户唤醒设备,否则设备会尽可能长时间地保持在此状态。但是,有一些重要事件需要唤醒 CPU 并提醒用户,例如,当闹钟响起或有新的聊天消息到达时。这些警报可以通过唤醒警报(wakeup alarm)来处理,但正如我将要解释的那样,这并不是必须的。到目前为止,唤醒似乎是一件好事,它可以显示重要的事件引起用户的注意,但是如果有太多这种事件那么电池寿命就会受到影响。
了解你的应用是否在驱动过多的唤醒是 Android vitals 的重要任务。收集的有关你应用行为的匿名数据用于显示自设备完全充电后,每小时经历超过 10 次唤醒的用户的百分比。要查看的关键点是一个红色的图标;这个图标告诉你,你的应用已超出不良行为阈值。而这个阈值表示你的应用属于 Google Play 上表现较差的应用,你应该考虑改善其行为。
在指定时间或间隔后唤醒设备的主要方法是使用 AlarmManager API 的 RTC_WAKEUP 或 ELAPSED_REALTIME_WAKEUP 标志来安排警报。但是一定要注意谨慎地使用此功能,而且只有在其他调度和通知机制不能更好地提供服务的情况下。当你想要使用唤醒警报时,请注意考虑以下几点:
只有当消息推送和定期任务不适合你的工作时,你才应该使用 AlarmManager 安排唤醒警报。或者从另一个角度来看,只有当你需要在特定时间启动闹钟时才需要使用唤醒警报,无论网络或其他条件如何。
要解决过度唤醒的问题,请先确定你的应用在哪些地方设置了唤醒警报,然后降低触发这些警报的频率。
要确定你的应用在哪些地方设置了唤醒警报,请在 Android Studio 中打开 AlarmManager 类,右键单击 RTC_WAKEUP 或 ELAPSED_REALTIME_WAKEUP 字段并选择 “Find Usages”。这将显示你项目中用到这些标志的所有实例。审查每一个实例,看看你是否可以切换到更智能的定时任务机制中的一种。
你还可以在 Find Usages 选项中将范围设置为“项目和库”,以确定你的依赖库是否使用了 AlarmManager API。如果是,你应该考虑使用替代库或向作者报告这个问题。
如果你决定必须使用唤醒警报,那么如果你提供了符合以下要求的警报标签,则 Play Console 可以提供更好的分析数据:
那么,什么是应用程序无响应(ANR),它又是如何影响用户的呢?
对于用户来说,ANR 是当他们尝试与你的应用进行交互时,该界面被冻结。界面保持冻结几秒钟后,会显示一个对话框,让用户选择等待或强制应用程序退出。
从应用程序开发的角度来看,当应用程序因为执行耗时操作(如磁盘或网络读写)阻塞主线程时,就会发生 ANR。主线程(有时称为 UI 线程)负责响应用户事件并刷新屏幕上每秒绘制六十次的内容。因此,将任何可能延迟其工作的操作都转移到后台线程是至关重要的。
使用收集到的有关你应用 ANR 事件的匿名数据,Android vitals 提供了有关 ANR 的多个级别的详细信息。主屏幕显示你应用程序中发生 ANR 的 Activity 的概况。这显示了用户经历过至少一次 ANR 的每日会话的百分比,以及之前最近 30 天的单独报告。还提供了不良行为的阈值。
详细信息视图的 ANR 比例页面显示了 ANR 比例随时间变化的详细信息,以及按应用版本、Activity 名称、ANR 类型和 Android 版本显示的 ANR 信息。你可以通过 APK 版本号、支持的设备、操作系统版本和时间段来过滤这些数据。
你还可以从 ANRs & crashes 部分获取更多详细信息。
如前所述,当应用程序进程阻塞主线程时就会发生 ANR。几乎任何原因都可能导致这种阻塞,但最常见的原因包括:
查找 ANR 的原因可能会非常棘手,就拿 URL 类来说吧。 你觉得确定两个 URL 是否相同的 URL#equals 方法是否会被阻塞?SharedPreferences 又会怎样?如果你在后台从中读取值,可以在主线程上调用 getSharedPreferences 方法吗?在这两种情况下,答案是这些都可能是长时间阻塞操作。
幸运的是,StrictMode 使查找 ANR 不再靠猜的。在调试版本中使用这个工具可以捕获主线程上意外的磁盘和网络访问。在应用程序启动时使用 StrictMode#setThreadPolicy 可以自定义你想要检测的内容,包括磁盘和网络读写,甚至可以通过 StrictMode#noteSlowCall 在应用程序中触发自定义的慢速调用。你还可以选择 StrictMode 在检测到阻塞调用时如何提醒你:通过让应用程序崩溃、Log 信息或者是显示对话框。更多详细信息,请参阅 ThreadPolicy.Builder类。
一旦你消除了主线程中的阻塞调用,记得在将你的应用程序发布到 Play Store 之前关闭 StrictMode。
消除过度唤醒和 ANR 将提高应用程序的质量和可用性,提高评分和评论,进而实现更多安装。通过查看 Android vitals,你可以快速轻松地发现是否存在需要解决的问题。在代码中查找和解决这些问题并不总是那么直截了当,但有些工具和技术可以帮你更高效地完成这些工作。
Android vitals 还可以给你提供更多帮助,我会在下一篇文章里介绍更多这些功能。我将在 5 月 8 日星期二下午 3 点,在 Google I/O 2018 大会上和同事 Fergus Hurley 以及 Joel Newman 一起演示 “Android vitals:调试应用程序性能和收获奖励” 的环节。如果你在那里或者想通过直播了解更多关于 Android vitals、最新的 Play Console 和 Android Studio 工具以及帮助你提高应用质量的意见,请加入我们。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有