核心应用程序质量

这是一个存档副本,上次更新时间为 2021 年 2 月 10 日。您也可以 查看当前指南

此清单定义了一组核心质量标准和相关测试,以帮助您评估应用程序的质量。某些标准可能很容易被忽略,而测试可以帮助您记住将它们包含在测试计划中。

此清单重点介绍了所有应用程序应满足的最低质量标准。您的测试很可能超出了这里描述的内容。

质量清单中的每个项目都有一个唯一的 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

通知遵循 Material Design 指南。特别是

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

对于消息/社交应用程序和对话

  1. 对对话使用 MessagingStyle 通知。
  2. 支持 直接回复操作
  3. 支持 对话快捷方式,并实施获取 最佳直接共享排名 的最佳实践。
  4. 支持 气泡
UI 和图形 VX-U1 CR-5 应用程序支持横向和纵向方向(如果可能)。

方向公开大部分相同的功能和操作,并保持功能等效性。内容或视图的微小更改是可以接受的。

VX-U2 CR-5 应用程序在两种方向上都使用整个屏幕,并且不使用信箱来适应方向变化。

为了补偿屏幕几何形状的微小差异,进行少量信箱处理是可以接受的。

VX-U3 CR-5 应用程序正确处理显示方向之间的快速转换,不会出现渲染问题或丢失状态。
视觉质量 VX-V1 CR-all

应用程序显示图形、文本、图像和其他 UI 元素,不会出现明显的失真、模糊或像素化。

  1. 应用程序应尽可能使用 矢量可绘制对象
  2. 应用程序为所有目标屏幕尺寸和外形尺寸提供高质量图形。
  3. 菜单、按钮和其他 UI 元素的边缘不可见任何锯齿。
VX-V2 CR-all

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

  1. 在所有支持的外形尺寸中,组合都应是可以接受的。
  2. 不可见任何被截断的字母或单词。
  3. 按钮或图标中不可见任何不当的文字换行。
  4. 文本和周围元素之间有足够的间距。
VX-V3 CR-all 应用程序的内容以及应用程序引用的所有网络内容都支持 深色主题

功能

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

区域 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 分享表 来分享内容。它可以建议自定义解决方案不可用的目标。
后台服务 FN-B1 CR-6 应用尽可能避免运行后台服务。为了确保用户设备的平稳运行,系统对后台服务应用了各种 限制。以下被认为不是后台服务的合理使用场景
  • 为通知维护网络连接
  • 维护蓝牙连接
  • 保持 GPS 开启

了解如何 选择适合您工作的解决方案

FN-B2 CR-10 应用应正确支持 Android 6.0(Doze 和 App Standby)中引入的电源管理功能。如果核心功能因电源管理而中断,只有合格的应用才能申请豁免。请参阅 Doze 和 App Standby 中的 对其他使用场景的支持

性能和稳定性

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

区域 ID 测试 描述
稳定性PS-S1 CR-all
SD-1
应用不会 崩溃阻塞 UI 线程 导致 ANR(Android 响应无响应)错误。利用 Google Play 的预发布报告 来识别潜在的稳定性问题。部署后,请注意 Google Play 开发者控制台中的 Android Vitals 页面。
性能 PS-P1 CR-all
SD-1
应用加载速度很快,或者如果应用加载时间超过两秒,则向用户提供屏幕反馈(进度指示器或类似提示)。
PS-P2 CR-all
SD-1
应用应每 16 毫秒渲染一帧,以实现每秒 60 帧。开发人员可以在测试中使用 分析 HWUI 渲染 选项。如果有问题,可以使用工具来帮助诊断 渲染缓慢
PS-P3 PM-1 在启用 StrictMode 的情况下(见下文 StrictMode 测试),测试应用时不会出现红色闪烁(StrictMode 的性能警告)。任何红色闪烁都表明存储、网络访问或内存泄漏方面存在不良行为。
SDK PS-T1 CR-0 应用在 Android 平台的最新公开版本上运行,不会崩溃或严重影响核心功能。
PS-T2 SP-1 应用通过设置 targetSdk 值来 定位最新的 Android SDK
PS-T3 SP-1 应用通过设置 compileSdk 值来使用最新的 SDK 构建。
PS-T4 SP-2
SP-3
所有使用的第三方 SDK 均已更新。对这些 SDK 的任何改进,例如稳定性、兼容性或安全性,都应及时提供给用户。

开发人员对整个应用代码库负责,包括使用的任何第三方 SDK。
PS-T5 CR-0 应用不使用 非 SDK 接口
电池 PS-B1 BA-1 应用应正确支持 Android 6.0(Doze 和 App Standby)中引入的电源管理功能。如果核心功能因电源管理而中断,只有合格的应用才能申请豁免。在开发过程中,开发人员可以使用 这些 ADB 命令 来测试应用待机和 Doze 行为。

在电池使用方面,开发人员可以使用 Android Studio 能量分析器电池历史记录 工具,结合计划的后台工作,来诊断意外的电池使用情况。

隐私和安全

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

除了此清单外,发布在 Google Play 商店上的应用还必须遵循 用户数据政策 来保护用户的隐私。

区域 ID 测试 描述
权限 SC-P1 SC-4 应用仅请求其使用场景所需的绝对最小数量的权限。对于某些权限(例如位置),如果可能,请使用粗略位置代替精细位置。
SC-P2

如果应用与应用的核心使用场景直接相关,则应仅请求访问敏感数据(例如 短信、通话记录位置)或需要付费的服务(例如拨号器或短信)。应向用户明确披露与这些权限相关的含义。

根据您使用权限的方式,可能存在 替代方法 来满足您的应用的使用场景,而无需依赖对敏感信息的访问权限。例如,与其请求与用户联系人相关的权限,不如使用 隐式意图 请求访问权限。

SC-P3 CR-0 应用在请求功能时(而不是在应用启动时)以上下文方式请求运行时权限。
SC-P4 CR-0

应用应设计其 UX 以清楚地传达为什么需要某些权限。如果不可能,则应遵循推荐流程来 解释应用中的功能为什么需要权限

当用户拒绝或撤销权限时,应用应 优雅降级。应用不应完全阻止用户访问应用。

数据和文件 SC-DF1 SC-1 所有敏感数据都 存储在应用的内部存储中
SC-DF2 SC-10 不会 将任何个人或敏感用户数据记录到系统日志或应用特定的日志中。
SC-DF3 应用不应使用任何 不可重置的硬件 ID(例如 IMEI)来进行识别。
身份 SC-ID1 CR-0 为自动填充 帐户凭据和其他敏感信息(例如信用卡信息、物理地址和电话号码)提供提示。
SC-ID2 CR-0 集成 适用于 Android 的 One Tap,以提供无缝的登录体验。
SC-ID3 CR-0 集成 生物识别身份验证 来保护金融交易或敏感信息,例如重要的用户文档。
应用组件 SC-AC1 SC-5 只有与其他应用共享数据的应用组件,或应由其他应用调用的组件才会 导出

这包括 活动服务广播接收器,尤其是 内容提供者

始终明确设置 android:exported 属性,以最大程度地减少对默认值的混淆。

SC-AC2 CR-0
SC-4

所有意图和广播都遵循最佳实践

  1. 使用显式意图,如果目标应用程序已明确定义。
  2. 使用意图将权限推迟到已拥有该权限的不同应用程序。
  3. 跨应用程序安全地共享数据.
  4. 包含有效负载的意图会在 使用前进行验证
  5. 如果您需要将意图传递给另一个应用程序,以便接收应用程序可以调用并期望在调用应用程序中进行回调,请不要在 extras 中包含嵌套意图。使用 PendingIntent。
  6. 在设置 PendingIntents 时,在适用情况下显式设置 不可变标志
SC-AC3 SC-3 所有在您的应用之间共享内容的内容提供者都使用 android:protectionLevel="signature" 来创建 自定义权限。这包括 活动服务广播接收器,尤其是 内容提供者。大多数应用程序不应依赖于访问已安装软件包的列表。从 Android 11 开始,访问权限已受到限制。
网络 SC-N1 SC-9 所有网络流量都通过 SSL 发送。
SC-N2 SC-6 应用程序声明了一个 网络安全配置
SC-N3 如果应用程序使用 Google Play 服务,则会在应用程序启动时 初始化安全提供者
SC-U1 SP-2 所有库、SDK 和依赖项均已更新.
SC-U2 生产应用程序中不包含任何调试库。这会导致性能和安全问题。
WebViewsSC-W1 SC-6 不要使用 setAllowUniversalAccessFromFileURLs() 来访问本地内容。相反,请使用 WebViewAssetLoader
SC-W2 SC-7 WebViews 不应使用 addJavaScriptInterface() 与不受信任的内容一起使用。

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

执行 SC-E1 应用不会从应用程序 APK 之外的外部 动态加载 代码。开发人员应使用 Android App Bundles,其中包括 Play Feature DeliveryPlay Asset Delivery

从 2021 年 8 月开始,Google Play 商店中所有新应用都将强制使用 Android App Bundles。

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

Google Play

确保您的应用可以在 Google Play 上发布。

区域 ID 测试 描述
策略 GP-P1 GP-all 应用严格遵守 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)来代表目标用户群最常见的形状因素和硬件/软件组合。
  • 硬件设备 - 您的测试环境应包含少量代表目前消费者可用的关键形状因素和硬件/软件组合的实际硬件设备。不必在所有市售设备上进行测试 - 相反,您应该专注于少量代表性设备,甚至每个形状因素使用一到两台设备。
  • 设备测试实验室 - 您还可以使用第三方服务(例如Firebase Test Lab)在更多种类的设备上测试应用程序。
  • 使用最新版 Android 进行测试 - 除了测试目标用户群的代表性 Android 版本外,您还应始终针对最新版 Android(目前为 Android 11)进行测试。这样可以确保最新的行为变更不会对用户的体验产生负面影响。

有关包括单元测试、集成测试和 UI 测试在内的更全面的测试指南,请查看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 查看对 Doze 和应用待机中其他用例的支持。
安装到 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 在 Doze 和应用待机周期中重复核心套件

密切注意闹钟、计时器、通知、同步等。请参阅使用 Doze 和应用待机进行测试,了解要求和指南。

安全性 SC-1 查看存储在外部存储器中的所有数据。
SC-2 查看如何处理和处理从外部存储器加载的数据。
SC-3 查看 Android 清单文件中定义的所有内容提供者。确保每个提供者都具有适当的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 设置每个线程的监控策略,并在ThreadPolicy 中使用detectAll() 启用所有支持的监控。

确保使用penaltyFlashScreen()ThreadPolicy 启用视觉通知,以指示策略违规。