当用户在 Google Play 上搜索或浏览应用以下载时,结果会根据哪些应用与设备兼容进行过滤。例如,如果一个应用需要摄像头,Google Play 将不会向没有摄像头的设备显示该应用。这种过滤有助于开发者管理其应用的分发,并有助于确保用户获得最佳体验。
Google Play 中的过滤基于多种类型的应用元数据和配置设置,包括清单声明、所需的库、架构依赖项以及在 Google Play 管理中心设置的分发控制(例如地理位置定位、定价等)。
Google Play 过滤部分基于清单声明和 Android 框架的其他方面,但实际过滤行为与框架不同,并且不受特定 API 级别的约束。本文档指定了 Google Play 当前使用的过滤规则。
Google Play 上的过滤器工作原理
Google Play 使用下述过滤限制来确定是否向通过 Google Play 应用浏览或搜索应用的用户显示您的应用。
在确定是否显示您的应用时,Google Play 会检查设备的硬件和软件要求,以及其运营商、位置和其他特征。然后,它会将这些与应用清单文件和发布详细信息中表达的限制和依赖项进行比较。
如果应用根据过滤规则与设备兼容,Google Play 会向用户显示该应用。否则,Google Play 会从搜索结果和类别浏览中隐藏您的应用,即使通过点击直接指向 Google Play 中应用 ID 的深层链接,用户明确请求该应用也是如此。
您可以为您的应用使用可用过滤器的任意组合。例如,您可以将应用中的 minSdkVersion
要求设置为 "4"
,并将 smallScreens="false"
,然后在将应用上传到 Google Play 时,您可以仅面向欧洲国家/地区(运营商)。因此,Google Play 的过滤器将阻止该应用在不符合所有这三个要求的任何设备上可用。
所有过滤限制都与应用的版本相关联,并且可以在版本之间更改。例如,如果用户已安装您的应用,并且您发布了一个更新使该应用对用户不可见,则用户将不会看到有可用的更新。
Google Play 网站上的过滤
当用户浏览 Google Play 网站时,他们可以看到所有已发布的应用。但是,Google Play 网站会将应用要求与用户注册的每个设备进行兼容性比较,并且只有在与设备兼容时才允许他们安装该应用。
基于应用清单的过滤
大多数过滤器由应用清单文件 AndroidManifest.xml 中的元素触发(尽管并非清单文件中的所有内容都能触发过滤)。表 1 列出了您应该用于触发过滤的清单元素,并解释了每个元素的过滤工作原理。
表 1. 在 Google Play 上触发过滤的清单元素。
清单元素 | 过滤器名称 | 工作原理 |
---|---|---|
<supports-screens>
|
屏幕尺寸 |
应用通过设置 通常,Google Play 假定设备上的平台可以将较小的布局调整到较大的屏幕,但不能将较大的布局调整到较小的屏幕。因此,如果应用仅声明支持“正常”屏幕尺寸,Google Play 会使该应用可用于正常屏幕和大屏幕设备,但会过滤该应用,使其无法用于小屏幕设备。 如果应用未声明
示例 1 示例 2 示例 3 有关如何在您的应用中声明对屏幕尺寸的支持的更多信息,请参阅 |
<uses-configuration>
|
设备配置 键盘、导航、触摸屏 |
应用可以请求某些硬件功能,Google Play 将只在具有所需硬件的设备上显示该应用。 示例 1 示例 2 有关更多详细信息,请参阅 |
<uses-feature>
|
设备功能 ( name ) |
应用可以要求设备上存在某些设备功能。此功能是在 Android 2.0 (API Level 5) 中引入的。 示例 1 示例 2 有关完整信息,请参阅 基于隐式功能的过滤:在某些情况下,Google Play 会将通过 |
OpenGL-ES 版本 ( openGlEsVersion ) |
应用可以使用 示例 1 示例 2 示例 3 示例 4 有关更多详细信息,请参阅 |
|
<uses-library> |
软件库 | 应用可以要求设备上存在特定的共享库。 示例 1 示例 2 有关更多详细信息,请参阅 |
<uses-permission> |
严格来说,Google Play 不会根据 通常,如果应用请求与硬件相关的权限,Google Play 会假定应用需要底层硬件功能,即使可能没有对应的 有关隐含硬件功能的权限列表,请参阅 |
|
<uses-sdk> |
最低框架版本 (minSdkVersion ) |
应用可以要求最低 API 级别。 示例 1 示例 2 因为您希望避免第二种情况,我们建议您始终声明 |
最高框架版本 (maxSdkVersion ) |
已废弃。 Android 2.1 及更高版本不检查或强制执行 不推荐声明 |
高级清单过滤器
除了表 1 中的清单元素外,Google Play 还可以根据表 2 中的高级清单元素过滤应用程序。
这些清单元素及其触发的过滤仅适用于特殊用例。它们是为某些类型的高性能游戏和类似应用程序设计的,这些应用程序需要严格控制应用程序分发。大多数应用程序绝不应使用这些过滤器。
表 2. 用于 Google Play 过滤的高级清单元素。
清单元素 | 摘要 |
---|---|
<compatible-screens> |
如果设备的屏幕尺寸和密度与 注意:通常,您不应使用此清单元素。使用此元素可能会大大减少您应用程序的潜在用户群,因为它会排除所有您未列出的屏幕尺寸和密度组合。您应该改用 |
<supports-gl-texture> |
除非设备也支持应用程序支持的一个或多个 GL 纹理压缩格式,否则 Google Play 会过滤该应用程序。 |
其他过滤器
Google Play 使用其他应用特性来确定是否向特定用户在给定设备上显示或隐藏应用,如下表所述。
表 3. 影响 Google Play 过滤的应用和发布特性。
过滤器名称 | 工作原理 |
---|---|
发布状态 | 只有已发布的应用程序才会出现在 Google Play 的搜索和浏览结果中。 即使未发布的应用程序,如果用户可以在其“下载”区域中(已购买、已安装或最近卸载的应用程序)看到它,也可以安装。 如果应用程序已被暂停,用户将无法重新安装或更新它,即使它出现在其“下载”中。 |
付费状态 | 并非所有用户都能看到付费应用。要显示付费应用,设备必须运行 Android 1.1 或更高版本,并且必须位于提供付费应用的国家/地区。如果设备有 SIM 卡,SIM 运营商决定是否提供付费应用。如果设备没有 SIM 卡,则使用设备的 IP 地址来确定设备是否位于提供付费应用的国家/地区。 |
国家/地区定向 | 当您将应用上传到 Google Play 时,您可以在定价和分发下选择分发应用的国家/地区。然后,该应用将仅对您选择的国家/地区的用户可用。 |
CPU 架构 (ABI) | 包含针对特定 CPU 架构(例如 ARM EABI v7 或 x86)的原生库的应用仅在支持该架构的设备上可见。有关 NDK 和使用原生库的详细信息,请参阅 什么是 Android NDK? |
受复制保护的应用程序 | Google Play 不再支持 Play 管理中心中的复制保护功能,也不再基于此功能过滤应用。为了保护您的应用,请改用 应用授权。有关更多信息,请参阅 复制保护的替代方案。 |
发布具有不同过滤器的多个 APK
某些特定的 Google Play 过滤器允许您为同一应用发布多个 APK,以便为不同的设备配置提供不同的 APK。例如,如果您正在创建一个使用高保真图形资产的视频游戏,您可能希望创建两个 APK,每个 APK 支持不同的纹理压缩格式。这样,您可以通过仅包含每个设备配置所需的纹理来减小 APK 文件的大小。根据每个设备对您的纹理压缩格式的支持,Google Play 将向其交付您声明支持该设备的 APK。
目前,Google Play 仅允许您在每个 APK 根据以下配置提供不同过滤器的情况下,为同一应用发布多个 APK:
- OpenGL 纹理压缩格式
通过使用
<supports-gl-texture>
元素。 - 屏幕尺寸(以及可选的屏幕密度)
通过使用
<supports-screens>
或<compatible-screens>
元素。 - API 级别
通过使用
<uses-sdk>
元素。 - CPU 架构 (ABI)
通过包含使用 Android NDK 构建的针对特定 CPU 架构(例如 ARM EABI v7 或 x86)的原生库。
所有其他过滤器的工作方式与往常一样,但这四种过滤器是 Google Play 上同一应用列表内区分不同 APK 的唯一过滤器。例如,如果 APK 仅因设备是否有摄像头而不同,则不能为同一应用发布多个 APK。
注意:为同一应用发布多个 APK 被认为是高级功能,并且大多数应用应只发布一个支持广泛设备配置的 APK。发布多个 APK 需要您遵循过滤器中的特定规则,并且需要特别注意每个 APK 的版本代码,以确保每种配置的正确更新路径。
如果您需要更多关于如何在 Google Play 上发布多个 APK 的信息,请阅读 多 APK 支持。