Google Play 对你的应用的评价从来不只是政策合规。Android vitals 已经是商店官方的技术质量信号,它的核心指标直接影响你的应用在搜索和浏览中的曝光。一旦越过不良行为阈值,Play 可能降低你的曝光,甚至在商店页面向用户显示警告。好消息是:这是整个平台上最好预测的一套规则——阈值是公开的,统计窗口是已知的,下面每一步都对应一个官方数字。

本文要解决的问题:当前不良行为阈值是多少、每个指标在 Play 管理中心的哪里看、决定命运的 28 天窗口怎么算、如何用邮件提醒与 Developer Reporting API 自动监控、按什么顺序修复才能真正把数字压下去,以及 2027 年 2 月起开始影响商店曝光的内存、位图与 DEX 阈值。


一、你被考核的具体数字

Google 把五个指标列为 core vitals(核心指标),因为它们会影响应用在 Google Play 上的曝光:用户可感知崩溃率、用户可感知 ANR 率、过度部分唤醒锁、内存用量、位图内存用量。多数开发者最先被卡住的是前两项。

注意用词。整体阈值是所有机型的平均值,所以单个机型的问题不会自动拖垮你;但它仍然危险,因为单机型阈值是 8%,比整体线宽约七倍。这个不对称直接告诉你该先看哪里:先修影响用户最多的簇,再清理机型特有的簇。Google 官方建议也很明确——如果同时存在整体和单机型问题,优先解决最大的整体崩溃与 ANR 簇。完整的阈值表在 Android vitals 官方文档

二、第一步——在 Play 管理中心读到自己的数字

这些数据不在你的构建里,而是来自 Android 设备。当用户允许后,设备会把稳定性、性能、耗电和权限相关指标回传给 Google,Play 汇总后呈现在 Play 管理中心的 Android vitals 面板。你不需要埋点就能看到,但要清楚它缺什么:Android vitals 只统计认证设备从 Google Play 安装的应用,且只包含同意共享诊断数据的用户。数据量不足时,簇会被隐藏——所以小体量应用和新上线的版本看起来会比真实情况「干净」。

建议的查看顺序:先看 vitals 总览,再打开 Crashes and ANRs,按受影响用户数排序而不是按错误条数排序。设备侧边栏会给出该机型的用户数、收入、评分和评论,帮你判断这个簇值不值得占用一周时间。如果簇的根源指向硬件或固件而不是你的代码,正确的做法可能是调整设备定向与排除规则,而不是硬发一个热修。

三、第二步——先搞清统计窗口,再决定要不要慌

Play 用最近 28 天的数据评估应用质量,并且每天重算关键指标。由此有两个后果:第一,修掉一波崩溃的版本不会隔夜解除警告,那些坏日子会一直留在平均值里,直到被时间移出窗口;第二,缓慢恶化在单日数据里几乎看不出来,所以要看趋势而不是看当天数值。

官方还留了一个明确的缓冲期。Android vitals 会标记 emerging issues(新出现的问题)——崩溃和 ANR 影响设备超过七天的问题——这个标记给了你 21 天处理窗口。请把第 7 天当作闹钟、第 21 天当作硬截止,而不是第 21 天才开始排查。

还有一个定义必须先弄清楚,否则你会和第三方分析工具吵架:一次用户会话是太平洋时间零点开始的 24 小时内的使用活动总和。Android vitals 按每日活跃用户计算问题率,而基于 SDK 的崩溃统计通常按会话计算。同一个用户当天打开三次、崩溃一次,Android vitals 记为 100%,第三方工具记为 33%。这是分母差异,不是谁算错了。

四、第三步——把监控自动化(提醒+报告 API)

靠人工每天看面板,一定会在你最忙的那几天失效。两个机制要同时用:

  1. Play 管理中心的邮件提醒。把运维邮箱登记进去,让回归在出现当天就送到人手上,而不是等到下个月的例行检查。
  2. Google Play Developer Reporting API。它会以编程方式返回同一批指标,适合手里不止一两个应用的人。按计划拉取每个包名的崩溃率与 ANR 率,自己保存历史,只在变化时告警,而不是按绝对值告警。

但提醒本身救不了一个矩阵。真正有用的是提前写死的阈值:明确写下「到哪个数字就停止发新功能、开始修稳定性」,并把这个判断交给脚本执行,而不是交给当天的心情。

五、第四步——先修最大的崩溃簇

  1. 先让堆栈可读。如果你用 R8 混淆,务必上传 mapping 文件。读不了的堆栈等于修不了的崩溃。
  2. 按根因聚类,而不是按报告条数。冷启动路径里的一个空指针,可以在几十个机型上产生成千上万条事件。修掉根因,整个簇会一起消失。
  3. 用现成的工具。Android Studio 的 App Quality Insights 可以在 IDE 里直接查看 Android vitals 报告;从 Android Studio Meerkat 起,它的 Insights 标签页会用 Gemini 总结崩溃、给出下一步建议并链接文档——如果你同时提供本地代码上下文,准确度会更高。
  4. 用分阶段发布落地修复。如果你已经在用百分比发布,先在小比例上跑到崩溃率走平,再扩大范围。

六、第五步——把 ANR 率压下去

ANR 几乎从来不是随机的,它就是主线程干了不该干的活:磁盘读写、同步网络请求、大 JSON 解析、位图解码,或者广播接收器在返回前做了太多事。先审计启动阶段和生命周期回调里的代码路径,因为这些会卡在用户眼前。然后用内测包里的 StrictMode 抓那些肉眼看不出来的问题。ANR 率与崩溃率是两套独立阈值分别考核,所以崩溃率舒服地停在 1% 并不能换来 ANR 的宽容——这条线是 0.47%。

七、第六步——把部分唤醒锁压在 5% 以下

过度部分唤醒锁是典型的后台服务痕迹:为了保住一个 socket 或同步循环而长期持锁。正确做法是改用 WorkManager 或 JobScheduler,让系统来调度你的工作;对于确实仍需持有的锁,务必用 try/finally 释放——被异常跳过的锁会一直持有到进程结束。这个指标只有一个整体数值、没有单机型逃生通道,所以一个不小心的 SDK 就能单独把整个应用打成不良行为,包括不是你写的广告或统计 SDK。

八、第七步——提前还清 2027 年 2 月的账

稳定性不再是降低曝光的唯一通道。Google 明确说明:超过内存用量、位图内存用量或代码优化阈值的应用,可能自 2027 年 2 月起开始受到商店曝光影响。这三个指标的算法各不相同,而且都有具体数字:

换句话说:为了调试方便而关掉 R8,现在已经是一项带到期账单的商业决策。先算清你的真实用户集中在哪个内存档位,并在 2027 年 2 月之前确认代码优化已开启且确实达到 25%,而不是等到 2 月再补救。

九、第八步——确认恢复,并长期保留护栏

  1. 等平均值,不要等版本上线。28 天平均值变好,警告才会消失。Play 的系统如果检测到改善,可能会更快撤下商店页警告,但不要把计划建立在这一点上。
  2. 修复后回看单机型视图。整体数字干净,仍可能有一个机型高于 8% 的单机型线。
  3. 明白为什么和其他工具数字不同。Android vitals 能看到 SDK 初始化之前发生的崩溃以及旧版 Android 上的 ANR,按每日活跃用户计数,且只覆盖认证设备。分母不同,结果自然不同。
  4. 危机过后保留提醒。真正伤人的是安静的那种:功能版本里新增的一个 SDK、慢慢膨胀的后台服务、从不释放的位图缓存。

如果你运营的是一个应用矩阵

质量是 Play 账号里唯一会安静复利的部分。一个应用长期高于 ANR 阈值,损失的不只是它自己的自然流量——它还会让 Play 的系统把这个开发者账号整体判定为质量较低的来源。如果你在一个账号下运营多个应用,请把 vitals 检查写进发版清单和监控脚本,把 emerging issue 的那一周当作停止发版的信号,并把 2027 年 2 月的内存与 DEX 阈值现在就放进日历,趁现在还便宜。


参考来源