去年谷歌进行的一项内部调查显示 Play Store 中超过 40% 的一星应用存在稳定性问题。另外一方面,对于性能卓越的应用,人们打分和评论每每愈来愈好,这让它们在 Google Play 中的排名上升,下载量也随之增长。不只如此,用户参与度也更高,并且愿意花更多的时间和金钱在这些应用上。编程
所以,解决应用稳定性问题可以显著影响到应用成功与否。网络
经过对应用质量的客观测量,开发者可以轻易发现应用亟待解决的稳定性问题,为此咱们在 Google Play Console 添加了一款名为 Android vitals 的新板块。借助 Android vitals,开发者无须添加额外工具代码或者库就能了解应用存在的性能及稳定性问题。当应用在大量设备上运行时,Android vitals 会收集与应用性能相关的匿名数据。经过这种途径得到的信息量是其余方式没法匹及的,即便是硬件实验室测试也不行。多线程
Android vitals 能够向开发者发送如下三种警告:崩溃、应用程序没法响应以及渲染次数。这三种状况都会直接影响到用户体验以及他们对应用的评价。此外,用户可能不会将 “异常耗电事件” 这类不良行为与您的应用直接联系起来。工具
这篇文章将探讨其中如下两个问题:性能
1.过分唤醒:过分唤醒会对电池寿命形成影响,并且在没法及时充电的状况下,可能致使用户没法继续使用设备。此类行为可能会让用户迅速卸载您的应用;测试
2.应用程序没法响应 (ANR)事件:当应用的用户界面卡住时候,此类事件会被触发。在界面冻结时,若您的应用在前台运行,会出现对话框提醒用户 “关闭应用” 或者 “等待响应”。对用户而言,此类行为和应用崩溃同样糟糕。他们可能不会立刻卸载您的应用,可是若是 ANR 问题一直不解决,就颇有可能会寻找其它替代应用。大数据
为了延长电池续航时间,屏幕关闭后,Android 设备会禁用主 CPU 内核,进入深度睡眠模式。除非用户唤醒设备,设备最好能够尽量长地保持这种状态。不过,在发生某些事件的状况下,仍是颇有必要唤醒 CPU 并向用户发出警告 —— 好比说,闹钟触发或者收到新消息。开发者能够经过唤醒闹钟 (wakeup alarm) 来处理此类警告,不过也不必定非要这么操做,在下文中会对此稍加解释。到目前为止,唤醒看上去彷佛是个不错的东西,让重要事情能引发用户注意,不过要是唤醒太屡次就拔苗助长,电池寿命也会大打折扣。ui
Android vitals 可以帮助开发者了解本身的应用是否存在唤醒次数太多的问题。经过收集有关应用行为的匿名数据,Android vitals 能够显示有多少比例的用户在设备满电以后,每小时经历 10 次以上的设备唤醒。关键就是看有没有红色的图标出现,若图标出现,则说明应用已经越过了不良行为门槛,属于 Google Play 中表现最次的一档应用,而您则需要想办法改善应用行为了。 编码
开发者主要是经过 AlarmManager API 设定 RTC_WAKEUP 或 ELAPSED_REALTIME_WAKEUP 旗标,让应用在特定时间或者在某一时间间隔后唤醒设备。该功能须谨慎对待,仅在没有其它更优的任务调度和通知机制的状况下才可以使用。在使用唤醒闹钟的时候,您须要考虑如下几点:spa
-- 批量操做:批量操做任务而不是屡次唤醒系统进行操做,这使设备能更长时间处于睡眠状态。
-- 标准:您能够明确任务运行须知足的具体标准,如网络可用性或者电池充电状态。设定标准可以避免唤醒设备以及没必要要的应用运行。
-- 持续性以及自动退避 —— 继续执行任务 (即便在重启后) 而且在失败的状况能自动重试。
-- 低耗电模式 (doze) 兼容性 —— 仅在低耗电模式或者应用待机模式未设定任何限制的状况下,任务才能运行。
当且仅当消息推送以及任务调度对您的任务不适用时,您才能够利用 AlarmManager 设定唤醒闹钟。换个角度来讲就是,仅当您想要在特定时间触发闹钟,不考虑网络以及其它状况,唤醒闹钟才是必要的。
为了解决过分唤醒问题,您需要确认应用在什么地方设定了唤醒闹钟,而后下降这些闹钟的触发频率。
那么如何查看应用在哪些地方设了唤醒闹钟呢?您能够打开 Android Studio 中的 AlarmManager 类,右击 RTC_WAKEUP 或者 ELAPSED_REALTIME_WAKEUP 域,选择 "Find Usages (查找使用)",而后您就能看到项目中全部使用到此类旗标的事件了。仔细查看每一种事件,而后考虑可否改用更为智能的任务调度机制。
若您认为使用唤醒闹钟没法避免,那么若是您的闹钟标签知足如下要求,Play Console 能够提供更好的分析数据:
对用户而言,ANR 就是指当他们试图与应用进行交互时,但界面卡住的事件。界面卡屏几秒后,会出现对话框让用户选择继续等待或者强行中止应用。
从开发者的角度来看,ANR 则是指应用运行的操做耗时太久,如磁盘或网络 I/O,致使主线程阻塞。主线程 (有时候也被称为 UI 线程) 主要负责响应用户事件以及每秒刷新 60 次屏幕。所以很关键的一点将任何可能延时主线程工做的操做转到后台线程。
Android vitals 能收集并利用应用 ANR 事件的匿名数据,提供多个级别的 ANR 具体报告。主界面上概述了您应用中 ARN 活动的概览信息,显示用户至少经历一次 ANR 事件的日对话比重,而且提供前一天以及前 30 天的状况的单独报告。同时也提供了不良行为门槛。
如上文所述,当应用进程影响到主线程时,ANR 事件会被触发,而致使这种阻塞现象的缘由各有不一,较为常见的有:
寻找触发 ANR 的缘由不容易,咱们拿 URL 类举个例子:
这两种状况都极可能致使长时间阻塞操做。幸亏咱们有 StrictMode,不用再本身瞎猜是什么缘由致使 ARN 了。在调试构建的时候,您可使用这个工具捕捉主线程上的意外磁盘或网络访问。
您能够在应用中使用 StrictMode#setThreadPolicy,自定义检查项,包括磁盘和网络 I/O 以及您经过 StrictMode#noteSlowCall 在应用中触发的慢调用。同时,您也能够本身选择让 StrictMode 经过何种方式告知已检测到阻塞调用:应用崩溃、日志记录仍是显示对话框?您可参看 ThreadPolicy.Builder class 获取进一步信息。
一旦您消除主线程上的阻塞调用,请记得再上传应用至 Play Store 前,关闭 StrictMode。
解决过分唤醒以及 ANR 问题可以提高应用质量及稳定性,提升应用评分,获取更多好评,最终增长下载量。使用 Android vitals 让您轻松快速地了解应用中亟待解决的问题。发现并解决代码中的这些问题可能并不容易,可是您能够利用工具和技术有效地完成工做。
点击这里您可查看 Android 和 Google Play 相关内容信息