核心应用质量

最后更新时间:2021 年 5 月 17 日

评估应用卓越性的一种实用方法是,浏览应用中的工作流并评估应用体验的流畅性和安全性。

本核对清单定义了一组核心质量标准及相关的测试,可帮助您评估应用的质量。其中的某些标准可能很容易被忽视,而相关测试可以帮助您记得将它们纳入测试计划。

该核对清单着重说明了所有应用都应达到的最低质量标准。您的测试可能涉及面更广,远不止于此处介绍的测试内容。

质量核对清单中的每项标准都有唯一 ID。当您与团队沟通时,也许就会发现这个 ID 非常实用。您也可以查看这些准则的旧版本

视觉体验

应用应在适当的地方提供标准的 Android 视觉设计和互动模式,以实现始终如一的直观用户体验。

领域 ID 测试 说明
导航 VX-N1 CR-3 应用支持标准返回按钮导航,不会在屏幕上使用任何自定义的“返回按钮”提示。
VX-N2 CR-3 应用支持用于返回/转到主屏幕的手势导航
VX-N3 CR-1
CR-3
CR-5

应用能够正确保留和恢复用户状态或应用状态。

应用在离开前台时能够保留用户状态或应用状态,并可防止因返回导航和其他状态更改而意外丢失数据。

返回前台时,应用应恢复保留的状态和待处理的任何重要的有状态事务。例如:对可编辑字段的更改、游戏进度、菜单、视频以及应用或游戏的其他部分。

  1. 当应用从“最近使用的应用”切换器恢复时,能够准确地让用户返回到上次使用的状态。
  2. 当设备从休眠(锁定)状态中被唤醒后,应用在恢复时能够准确地让用户返回到上次使用的状态。
  3. 当应用从主屏幕或“所有应用”重新启动时,应根据自上次使用以来已经过多长时间,执行以下某项操作:
    • 如果经过的时间不长(几分钟),则将应用恢复为与上一次运行状态最接近的状态。
    • 如果已经过去很长时间,则尝试将应用恢复为与上一次运行状态最接近的状态,或者从主屏幕或一些其他默认状态启动应用。
通知 VX-S1 CR-9

通知遵循设计指南。具体而言:

  1. 通知不用于交叉推介或宣传其他产品,因为 Play 商店严禁此类行为。
  2. 通知渠道是根据最佳实践定义的,而不是通过一个渠道提供所有通知。
  3. 选择正确的通知优先级
  4. 如果可能,将多个通知堆叠到一个通知组中。
  5. 在适当的情况下为通知设置超时
  6. 仅在与进行中的事件(例如音乐播放或通话)相关时,通知才持续保留。如需了解详情,请参阅“功能”部分
VX-S2 CR-9

对于即时通讯应用、社交应用和对话:

  1. 为对话使用 MessagingStyle 通知。
  2. 支持直接回复操作
  3. 支持对话快捷方式,并遵循获得最佳直接共享排名的最佳实践。
  4. 支持对话泡
界面和图形 VX-U1 CR-5

应用支持横屏和竖屏方向以及设备折叠和展开状态。

方向和折叠状态提供的功能和操作基本相同,并保持同等的功能。

VX-U2 CR-5

应用会在两种屏幕方向下填充应用窗口,并且不会因为配置更改(包括设备折叠和展开)而出现信箱模式。

可接受为补偿屏幕几何图形的细微差异而出现少许信箱模式现象。

VX-U3 CR-5 应用能够正确处理屏幕方向之间的快速转换以及设备折叠和展开,而不会出现显示屏呈现问题,也不会丢失状态。
画质 VX-V1 CR 全部

应用显示的图形、文字、图像和其他界面元素没有明显的失真、模糊或像素化现象。

  1. 应用应尽可能使用矢量可绘制对象
  2. 应用为所有适配的屏幕尺寸和设备类型提供高品质的图形。
  3. 菜单边缘、按钮和其他界面元素没有明显的走样。
VX-V2 CR 全部

应用能为应用支持的每种语言以可接受的方式显示文本和文本块。

  1. 所用构图在所有支持的设备类型上都适用。
  2. 没有明显的字母或词语截断。
  3. 按钮或图标中没有明显的不当文本换行。
  4. 文本与周围元素之间有足够的间距。
VX-V3 CR 全部 应用的内容以及应用引用的所有网络内容都支持深色主题
无障碍功能 VX-A1 CR 全部

触摸目标的大小至少应为 48dp。了解详情

VX-A2 CR 全部

应用的文本和前景内容与其背景应保持足够高的色彩对比度:

  • 3.0:1,适用于大号文字/图形
  • 4.5:1,适用于小号文字(文字小于 18pt,或者如果文字为粗体且小于 14pt)

详细了解颜色和对比度

VX-A3 CR 全部 使用 contentDescription 描述每个界面元素TextView 除外)。

功能

应用应实现预期的功能行为。

领域 ID 测试 说明
音频 FN-A1 CR-1
CR-8
音频会在应用返回前台时恢复,或者提示用户播放已处于暂停状态。
FN-A2 CR-1
CR-2
CR-8
如果音频播放是核心功能,应用应支持后台播放
FN-A3 CR-0

当用户发起音频播放时,应用应在一秒钟内执行以下某项操作:

  1. 开始播放音频。
  2. 提供一个指示条,提示用户正在准备音频数据。
FN-A4 CR-0 应用应在音频开始播放时请求音频焦点,并在播放停止时放弃音频焦点。
FN-A5 CR-0 应用应处理其他应用对音频焦点的请求。例如,在其他应用播放语音时,应用可能会降低播放音量。
媒体 FN-M1 CR-0
CR-6
CR-8
如果应用在后台播放音频,必须创建通过 MediaStyle 来设置样式的通知
FN-M2 CR-0 如果应用播放视频,则应支持进行画中画播放。
FN-M3 CR-0 如果应用会对视频进行编码,则应使用 HEVC 视频压缩标准执行此操作。
共享 FN-S1 CR-0 如果共享内容,应用应使用 Android Sharesheet。该功能可以推荐自定义解决方案不可用的目标。
后台服务 FN-B1 CR-6 应用避免在后台运行不必要的长时间服务。为了确保用户设备能够平稳运行,系统会对后台服务应用各种限制。以下用例都不算是后台服务的正面教材:
  • 保持网络连接,以便接收通知
  • 保持蓝牙连接
  • 一直开启 GPS

不妨了解如何为工作选择合适的解决方案

性能和稳定性

应用应提供用户期望的性能、稳定性、兼容性和响应速度。

领域 ID 测试 说明
稳定性 PS-S1 CR 全部
SD-1
应用不会崩溃,也不会因阻塞界面线程而导致出现 ANR(Android 无响应)错误。请利用 Google Play 的发布前测试报告发现潜在的稳定性问题。部署后,请留意 Google Play 管理中心的 Android Vitals 页面。
性能 PS-P1 CR 全部
SD-1
应用能迅速加载,如果加载时间超过 2 秒,则在屏幕上向用户提供反馈(进度指示器或类似提示)。
PS-P2 CR 全部
SD-1
应用应每 16 毫秒渲染一帧,以实现每秒 60 帧。开发者可以在测试中使用 Profile HWUI rendering 选项。可使用相应工具来帮助诊断渲染速度缓慢问题(如果有)。
PS-P3 PM-1 启用 StrictMode 之后(详见下文的 StrictMode 测试),在测试应用期间,指示灯不会呈红色闪烁(StrictMode 的性能警告)。红色闪用于指示存储空间、网络访问或内存泄漏方面的不良行为。
SDK PS-T1 CR-0 应用在最新的公开版 Android 平台上运行,而不会崩溃或严重影响核心功能。
PS-T2 SP-1 应用通过设置 targetSdk 值来以最新的 Android SDK 为目标平台(为符合 Google Play 要求)。
PS-T3 SP-1 应用通过设置 compileSdk 值来使用最新 Android SDK 进行构建。
PS-T4 SP-2
SP-3
使用的所有 Google SDK 或第三方 SDK 均为最新版本。对这些 SDK 所做的任何改进(例如稳定性、兼容性或安全性)都应及时向用户提供。

对于 Google SDK,考虑使用由 Google Play 服务提供支持的 SDK(若有)。这些 SDK 可向后兼容、接收自动更新、缩减应用软件包的大小,以及高效利用设备上的资源。

开发者对整个应用的代码库(包括使用的所有第三方 SDK)负责。

PS-T5 SP-3 应用不会使用非 SDK 接口
PS-T6 SP-2 正式版应用中不包含任何调试库。这可能会导致性能和安全问题。
电池 PS-B1 BA-1 应用能正确支持 Android 6.0 中引入的电源管理功能(低电耗模式和应用待机模式)。如果核心功能被电源管理功能中断,则只有符合条件的应用才能请求豁免。请参阅低电耗模式和应用待机模式下对其他用例的支持

在开发过程中,开发者可以使用这些 adb 命令测试应用待机和低电耗模式行为。

对于电池用量,开发者可以使用 Android Studio 能耗性能分析器Battery Historian 工具,然后结合计划的后台工作,来诊断非预期的电池使用情况。

隐私与安全

应用应以适当的权限级别安全地处理用户数据和个人信息。

除了本核对清单以外,在 Google Play 商店中发布的应用还必须遵循用户数据政策以保护用户的隐私。

领域 ID 测试 说明
权限 SC-P1 SC-4 应用仅请求支持其当前用例所需的绝对最低数量的权限。对于某些权限(如位置信息),如果可能,请使用粗略位置信息代替精确位置信息。
SC-P2

仅当与应用的核心使用情形直接相关时,应用才会请求获取访问敏感数据(例如短信、通话记录位置信息)或者付费服务(例如拨号器或短信)的权限。应以醒目的方式向用户披露使用这些权限所产生的影响。

根据您使用权限的方式,您可以通过替代方式实现应用的用例,而无需依赖于访问敏感信息。例如,与请求与用户联系人相关的权限相比,使用隐式 intent 来请求访问权限可能会更合适一些。

SC-P3 CR-0 应用应在提出功能使用请求时视情况请求运行时权限,而不是在应用启动期间提前请求权限。
SC-P4 CR-0

应用会清晰地传达需要特定权限的原因,或者按照建议的流程说明它需要某项权限的原因

SC-P5 CR-0 当用户拒绝或撤消某项权限时,应用应优雅降级,不应完全阻止用户访问该应用。
数据和文件 SC-DF1 SC-1 所有敏感数据都存储于应用的内部存储空间中
SC-DF2 SC-10 未将个人或敏感用户数据记录到系统日志或应用特有的日志中。
SC-DF3 应用不会出于识别身份的目的而使用任何不可重置的硬件 ID(例如 IMEI)。
身份信息 SC-ID1 CR-0 应用会提供提示以自动填充账号凭据和其他敏感信息(例如:信用卡信息、实际地址和电话号码)。
SC-ID2 CR-0 集成 Android 版凭据管理器,以统一对通行密钥、联合身份和传统密码的支持,从而获得无缝的登录体验。
SC-ID3 CR-0 应用支持生物识别身份验证功能,可保护财务交易或敏感信息(例如重要的用户文档)。
应用组件 SC-AC1 SC-5

应用会为所有 activityservice广播接收器,尤其是 content provider 显示设置 android:exported 属性。

导出与其他应用共享数据的应用组件,或应由其他应用调用的组件。

SC-AC2 CR-0
SC-4

所有 intent 和广播遵循以下最佳做法:

  1. 如果明确定义了目标应用,请使用显式 intent
  2. 使用 intent 将权限转给已具有相应权限的其他应用。
  3. 在应用之间安全地共享数据
  4. 包含荷载的 intent 需经过验证才能使用
  5. 如果您需要将 intent 传递给另一应用,以便接收方应用能够在调用方应用中调用并获得回调,那么就不要在 extra 中添加嵌套的 intent,而请使用 PendingIntent。
  6. 在设置 PendingIntent 时,请显式设置不可变标志(如果适用)。
SC-AC3 SC-3 在应用之间共享内容的所有组件均针对自定义权限使用 android:protectionLevel="signature"。这包括 activityservice广播接收器,尤其是 content provider

应用不应依赖于访问已安装软件包的列表。从 Android 11 开始,访问权限已受到限制。

网络 SC-N1 SC-9 所有网络流量均通过 SSL 发送。
SC-N2 SC-6 应用会声明网络安全配置
SC-N3 如果应用使用 Google Play 服务,则安全提供程序在应用启动时进行初始化
WebView SC-W1 SC-6 不使用 setAllowUniversalAccessFromFileURLs() 访问本地内容,而是改为使用 WebViewAssetLoader
SC-W2 SC-7 WebView 不应搭配使用 addJavaScriptInterface() 与不受信任的内容。

在 Android 6.0 及更高版本上,请改用 HTML 消息通道

执行 SC-E1 应用不会从应用 APK 外部动态加载代码。开发者应使用 Android App Bundle,其中包括 Play Feature DeliveryPlay Asset Delivery

从 2021 年 8 月开始,在 Google Play 商店中发布的所有新应用都必须使用 Android App Bundle。

加密 SC-C1 应用能使用平台提供的强大加密算法和随机数生成器。此外,应用不会实现自定义算法。

Google Play

请确保应用可在 Google Play 上发布。

领域 ID 测试 说明
政策 GP-P1 GP 全部 应用会严格遵守 Google Play 开发者内容政策的条款,并且不会提供不当内容,也不会使用其他方的知识产权或品牌等。
GP-P2 GP-1 根据内容分级指南恰当设置应用的心智成熟度。
应用详情页面 GP-D1 GP-1
GP-2

应用的置顶大图遵循这篇博文中介绍的准则。请确保:

  1. 应用详情包括高品质的置顶大图。
  2. 置顶大图不包含设备图片、屏幕截图,也不包含缩小后以及在应用适配的最小尺寸屏幕上显示时难以辨认的小文字。
  3. 置顶大图看起来不能像广告。
GP-D2 GP-1 应用的屏幕截图和视频不会显示或提及非 Android 设备。
GP-D3 GP-1 应用的屏幕截图或视频未以误导性方式展示应用的内容和体验。
用户支持 GP-X1 GP-1 对于 Google Play 页面的“评价”标签页中常见的用户报告的错误,如果错误可重现而且在多种不同的设备上发生,则应予以解决。如果错误只在少数设备上出现,但是这些设备十分受欢迎或者是新设备,您还是应该予以解决。

设置测试环境

若要根据本核对清单设置测试环境,我们的建议如下:

  • 关注模拟器测试 - Android 模拟器是一种可在不同 Android 版本和屏幕分辨率下测试应用的绝佳方式。您应该设置模拟设备 (AVD),以代表目标用户群最常用的设备类型和硬件/软件组合。除了针对手机进行测试之外,我们还建议您至少使用以下模拟器测试其他外形规格的设备:
    • Foldables - 7.6” Fold-in with outer display(这列在 AVD 管理器中的“Phones”下)。
    • Tablet - Pixel C 9.94” (2,560px x 1,800px)。
    • 对于移动应用通知测试,请将移动设备/模拟器与 Wear OS 模拟器 - Wear OS Round 1.84”配对。
  • 硬件设备 - 您的测试环境应包括少量实际硬件设备,并且这些设备能够代表目前消费者可用的主要设备类型和硬件/软件组合。您不需要测试市场上的每种设备,只需关注少量代表性的设备,甚至仅针对每种外形规格选用一两个设备即可。
  • 设备测试实验室 - 您也可以使用第三方服务(例如 Firebase Test Lab)在更多类型的设备上测试应用。
  • 使用最新的 Android 版本进行测试:除了测试面向目标用户群的代表性 Android 版本之外,您还应始终针对最新版 Android(目前为 Android 14)进行测试。这样可以确保最新的行为变更不会对用户体验产生负面影响。

如需更全面的测试指导(包括单元测试、集成测试和界面测试),请参阅 Android 测试基础知识

测试流程

这些测试流程有助于您发现应用中的各类质量问题。您可以在自己的测试计划中组合各项测试或综合运用各组测试。请参阅上述各个部分,了解将标准与这些测试流程相关联的参考资料。

类型 测试 说明
核心套件 CR-0

导航到应用的所有部分 - 所有屏幕、对话框、设置和所有用户流程。

  1. 如果应用允许运行修改或创建内容、播放游戏或媒体,请务必测试这些流程。
  2. 在测试应用时,引入来自其他应用的中断(例如:接到通知或来电);然后对设备属性(例如:网络连接、电池功能、GPS 可用性和系统负载)应用临时更改。
  3. 进入并测试所有应用内购买流程
CR-1 在每个应用屏幕上,按下设备的“主屏幕”键或使用手势导航中的向上滑动,然后从“所有应用”屏幕重新启动应用。
CR-2 从每个应用屏幕,使用“最近使用的应用”切换器切换到其他正在运行的应用,然后返回正在测试的应用。
CR-3 从每个应用屏幕(和对话框),按下“返回”按钮或使用用于返回的滑动手势。
CR-5 从每个应用界面,旋转设备使其在横屏和竖屏方向以及折叠和展开状态之间切换至少三次。
CR-6 切换到其他应用,以将测试应用转至后台。转到“设置”,检查测试应用在后台时是否有服务在运行。在 Android 4.0 及更高版本中,转到“应用”屏幕并找到“正在运行”标签页中的应用。
CR-7 按下电源按钮,让设备进入休眠状态,然后再次按下电源按钮唤醒屏幕。
CR-8 在设备上设置屏幕锁定。按下电源按钮让设备进入休眠状态(锁定设备);接着,再次按下电源按钮唤醒屏幕,然后解锁设备。
CR-9 在通知抽屉式导航栏中触发并查看应用能够显示的所有通知类型。如果适用(Android 4.1 及更高版本)展开通知并点按提供的所有操作。
CR-10 查看低电耗模式和应用待机模式下对其他用例的支持。
安装在 SD 卡上 SD-1 对安装到设备的 SD 卡的应用(如果应用支持此安装方法)重复核心套件测试。

如需将应用移动到 SD 卡,您可以使用“设置”>“应用信息”>“移至 SD 卡”。

性能和稳定性 SP-1 查看 Android 清单文件和构建配置,以确保针对可用的最新版 SDKtargetSdkcompileSdk)构建应用。
SP-2 查看 build.gradle 文件中是否存在任何过时的依赖项。
SP-3 使用 Android Studio lint 工具检测非 SDK 接口使用情况。也可以使用其他替代测试方法
性能监控 PM-1 启用 StrictMode 性能分析功能的情况下重复核心套件测试。

密切关注垃圾回收及其对用户体验的影响。

电池BA-1 在各低电耗模式和应用待机模式周期内重复执行核心套件测试。

密切注意闹铃、定时器、通知、同步等等。如需了解相关要求和准则,请参阅在低电耗模式和应用待机模式下进行测试

安全性 SC-1 查看外部存储空间中存储的所有数据。
SC-2 查看如何处理从外部存储空间加载的数据。
SC-3 查看 Android 清单文件中定义的所有 Content Provider。确保每个提供程序都设置了适当的 protectionLevel
SC-4 查看应用在设备上使用清单文件、运行时以及使用应用设置屏幕(“设置”>“应用信息”)需要的所有权限。
SC-5 查看 Android 清单文件中为相应导出状态定义的所有应用组件。必须为所有组件显式设置导出的属性。
SC-6 查看应用的网络安全配置,确保配置失败时不执行 lint 检查。
SC-7 对于每个 WebView,导航到需要使用 JavaScript 的页面。
SC-8 在每个 WebView 中,尝试导航至应用未直接加载的网站和内容。
SC-9 声明停用明文流量的网络安全配置,然后测试应用。
SC-10 运行应用并执行所有核心功能,同时观察设备日志。不记录任何用户私有信息。
Google Play GP-1 登录到 Google Play 管理中心以查看您的开发者资料、应用说明、屏幕截图、置顶大图、内容分级和用户反馈。
GP-2 下载置顶大图和屏幕截图,将其缩小以匹配设备上的显示屏尺寸以及您适配的设备类型。
GP-3 查看所有图形化资源、媒体、文本、代码库,以及应用中打包的其他内容或下载的扩展文件。

使用 StrictMode 进行测试

对于性能测试,建议在应用中启用 StrictMode,并用来捕获可能影响性能、网络访问、文件读/写等的操作。在主线程和其他线程上查找可能存在问题的操作。

您可以使用 StrictMode.ThreadPolicy.Builder 设置每个线程的监控政策,并使用 detectAll()ThreadPolicy 中启用所有受支持的监控。

请务必使用 penaltyFlashScreen()ThreadPolicy 启用有关违反政策问题的可视通知