核心应用程序质量

上次更新:2021 年 5 月 17 日

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

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

本清单突出了所有应用程序都应达成的最低质量要求。您的测试很可能超出这里描述的内容。

质量清单中的每个项目都有一个唯一的 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. 支持 气泡
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 应用程序的内容和应用程序引用的所有 Web 内容都支持 深色主题
可访问性 VX-A1 CR-all

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

VX-A2 CR-all

应用程序的文本和前景内容应与其背景保持足够高的颜色对比度。

  • 大文本/图形的对比度为 3.0:1
  • 小文本(小于 18pt 的文本,或如果文本为粗体且小于 14pt 的文本)的对比度为 4.5:1

了解更多关于 颜色和对比度的信息。

VX-A3 CR-all 描述每个 UI 元素(除 TextView 外),使用 contentDescription

功能

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

领域 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 开启

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

性能和稳定性

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

领域 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 应用程序 定位最新的 Android SDK,以符合 Google Play 的要求,方法是设置 targetSdk 值。
PS-T3 SP-1 应用程序使用最新的 Android SDK 构建,方法是设置 compileSdk 值。
PS-T4 SP-2
SP-3
使用的任何 Google 或第三方 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 中引入的电源管理功能(Doze 和应用程序待机)。如果核心功能因电源管理而中断,只有符合条件的应用程序才能请求豁免。请参阅 Doze 和应用程序待机中的 对其他用例的支持

在开发过程中,开发人员可以使用 这些 ADB 命令 来测试应用程序待机和 Doze 行为。

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

隐私和安全

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

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

领域 ID 测试 描述
权限 SC-P1 SC-4 应用程序仅请求它为了支持手头的用例而绝对需要的最少权限。对于某些权限(如位置),如果可能,请使用粗略位置代替精细位置。
SC-P2

应用程序仅在直接与应用程序的核心用例相关时,才请求访问敏感数据(如 短信、通话记录位置)或需要付费的服务(如拨号器或短信)。应向用户明确告知与这些权限相关的含义。

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

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

应用程序为所有 活动服务广播接收器,尤其是 内容提供者 明确设置 android:exported 属性。

只有与其他应用程序共享数据的应用程序组件或应由其他应用程序调用的组件才是 导出的

SC-AC2 CR-0
SC-4

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

  1. 使用显式意图,如果目标应用程序已定义。
  2. 使用意图将权限推迟到已经拥有权限的另一个应用程序。
  3. 在应用程序之间安全地共享数据.
  4. 包含有效负载的意图会在 使用前进行验证
  5. 如果您需要将意图传递给另一个应用程序,以便接收应用程序可以调用并在调用应用程序中预期回调,请不要在附加信息中包含嵌套意图。使用 PendingIntent。
  6. 在设置 PendingIntent 时,请在适用时明确设置 不可变标志
SC-AC3 SC-3 所有在您的应用之间共享内容的组件都使用 android:protectionLevel="signature" 用于 自定义权限。这包括 活动服务广播接收器,尤其是 内容提供者

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

网络 SC-N1 SC-9 所有网络流量都通过 SSL 发送。
SC-N2 SC-6 应用程序声明了一个 网络安全配置
SC-N3 如果应用程序使用 Google Play 服务,则在应用程序启动时 初始化安全提供程序
WebViewsSC-W1 SC-6 不要使用 setAllowUniversalAccessFromFileURLs() 访问本地内容。相反,请使用 WebViewAssetLoader
SC-W2 SC-7 WebViews 不应使用 addJavaScriptInterface() 处理不受信任的内容。

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

执行 SC-E1 应用程序不会从应用程序 APK 之外的来源 动态加载 代码。开发者应使用 Android 应用捆绑包,其中包括 Play 功能交付Play 资源交付

截至 2021 年 8 月,在 Google Play 商店中,所有新应用都必须使用 Android 应用捆绑包。

加密 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) 来代表目标用户群最常见的形状尺寸和硬件/软件组合。除了测试手机外,我们还建议您使用以下模拟器至少测试其他形状尺寸
    • 折叠式设备 - 带外屏的 7.6 英寸可折叠设备(这在 AVD 管理器中的手机类别下列出)。
    • 平板电脑 - Pixel C 9.94 英寸(2,560 像素 x 1,800 像素)。
    • 对于移动应用通知测试,请将移动设备/模拟器与 Wear OS 模拟器配对 - Wear OS Round 1.84 英寸。
  • 硬件设备 - 您的测试环境应包含少量代表目前消费者可用的关键形状尺寸和硬件/软件组合的实际硬件设备。不需要在所有市售设备上进行测试 - 相反,您应该重点关注少量具有代表性的设备,甚至每个形状尺寸使用一到两台设备。
  • 设备测试实验室 - 您还可以使用第三方服务(例如 Firebase Test Lab)在更多种类的设备上测试您的应用。
  • 使用最新版 Android 进行测试 - 除了针对目标用户群测试具有代表性的 Android 版本外,您还应该始终针对最新版 Android(当前为 Android 14)进行测试。这将确保 最新的行为变更 不会对用户的体验产生负面影响。

有关包括单元测试、集成测试和 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 和 App Standby 中其他用例的支持。
安装到 SD 卡 SD-1 将应用安装到 设备的 SD 卡 上后(如果应用支持这种安装方法),重复核心套件

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

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

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

电池BA-1 在 Doze 和 App Standby 周期中重复核心套件

密切注意警报、计时器、通知、同步等。有关要求和指南,请参见 使用 Doze 和 App Standby 进行测试

安全 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 启用视觉通知以显示策略违规行为。