Google Play 上的过滤器

当用户在 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> 屏幕尺寸

应用通过设置 <supports-screens> 元素的属性来指示其能够支持的屏幕尺寸。发布应用时,Google Play 会根据设备的屏幕尺寸使用这些属性来确定是否向用户显示应用。

通常,Google Play 假定设备上的平台可以将较小的布局调整到较大的屏幕,但不能将较大的布局调整到较小的屏幕。因此,如果应用仅声明支持“正常”屏幕尺寸,Google Play 会使该应用可用于正常屏幕和大屏幕设备,但会过滤该应用,使其无法用于小屏幕设备。

如果应用未声明 <supports-screens> 的属性,Google Play 将使用这些属性的默认值,这些值因 API 级别而异。具体来说:

  • 对于将 android: minSdkVersionandroid: targetSdkVersion 设置为 3 或更低的应用,<supports-screens> 元素本身未定义,且没有可用属性。在这种情况下,Google Play 假定该应用是为普通尺寸屏幕设计的,并向具有普通或更大屏幕的设备显示该应用。
  • android: minSdkVersionandroid: targetSdkVersion 设置为 4 或更高时,所有属性的默认值均为 "true"。这样,应用默认被认为支持所有屏幕尺寸。

示例 1
清单声明 <uses-sdk android:minSdkVersion="3"> 且不包含 <supports-screens> 元素。结果:Google Play 不会向小屏幕设备的用户显示该应用,但会向正常屏幕和大屏幕设备的用户显示,除非有其他过滤器适用。

示例 2
清单声明 <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"> 且不包含 <supports-screens> 元素。结果:Google Play 会向所有设备上的用户显示该应用,除非有其他过滤器适用。

示例 3
清单声明 <uses-sdk android:minSdkVersion="4"> 且不包含 <supports-screens> 元素。结果:Google Play 会向所有用户显示该应用,除非有其他过滤器适用。

有关如何在您的应用中声明对屏幕尺寸的支持的更多信息,请参阅 <supports-screens>支持多屏幕

<uses-configuration> 设备配置
键盘、导航、触摸屏

应用可以请求某些硬件功能,Google Play 将只在具有所需硬件的设备上显示该应用。

示例 1
清单包含 <uses-configuration android:reqFiveWayNav="true" />,并且用户正在没有五向导航控制的设备上搜索应用。结果:Google Play 将不会向用户显示该应用。

示例 2
清单不包含 <uses-configuration> 元素。结果:Google Play 将向所有用户显示该应用,除非有其他过滤器适用。

有关更多详细信息,请参阅 <uses-configuration>

<uses-feature> 设备功能
(name)

应用可以要求设备上存在某些设备功能。此功能是在 Android 2.0 (API Level 5) 中引入的。

示例 1
清单包含 <uses-feature android:name="android.hardware.sensor.light" />,并且用户正在没有光传感器的设备上搜索应用。结果:Google Play 将不会向用户显示该应用。

示例 2
清单不包含 <uses-feature> 元素。结果:Google Play 将向所有用户显示该应用,除非有其他过滤器适用。

有关完整信息,请参阅 <uses-feature>

基于隐式功能的过滤:在某些情况下,Google Play 会将通过 <uses-permission> 元素请求的权限解释为与 <uses-feature> 元素中声明的权限等效的功能要求。请参阅下面的 <uses-permission>

OpenGL-ES 版本
(openGlEsVersion)

应用可以使用 <uses-feature android:openGlEsVersion="int"> 属性要求设备支持特定的 OpenGL-ES 版本。

示例 1
一个应用通过在清单中多次指定 openGlEsVersion 来请求多个 OpenGL-ES 版本。结果:Google Play 假定该应用需要指示的最高版本。

示例 2
一个应用请求 OpenGL-ES 版本 1.1,并且用户正在支持 OpenGL-ES 版本 2.0 的设备上搜索应用。结果:Google Play 将向用户显示该应用,除非有其他过滤器适用。如果设备报告它支持 OpenGL-ES 版本 X,Google Play 假定它也支持早于 X 的任何版本。

示例 3
用户正在未报告 OpenGL-ES 版本的设备上搜索应用(例如,运行 Android 1.5 或更早版本的设备)。结果:Google Play 假定该设备仅支持 OpenGL-ES 1.0。Google Play 将仅向用户显示未指定 openGlEsVersion 的应用,或未指定高于 1.0 的 OpenGL-ES 版本的应用。

示例 4
清单未指定 openGlEsVersion结果:Google Play 将向所有用户显示该应用,除非有其他过滤器适用。

有关更多详细信息,请参阅 <uses-feature>

<uses-library> 软件库

应用可以要求设备上存在特定的共享库。

示例 1
应用需要 com.google.android.maps 库,并且用户正在没有 com.google.android.maps 库的设备上搜索应用。结果:Google Play 将不会向用户显示该应用。

示例 2
清单不包含 <uses-library> 元素。结果:Google Play 将向所有用户显示该应用,除非有其他过滤器适用。

有关更多详细信息,请参阅 <uses-library>

<uses-permission>  

严格来说,Google Play 不会根据 <uses-permission> 元素进行过滤。但是,它会读取这些元素以确定应用程序是否具有可能未在 <uses-feature> 元素中正确声明的硬件功能要求。例如,如果应用程序请求 CAMERA 权限但未声明 android.hardware.camera<uses-feature> 元素,Google Play 则认为应用程序需要摄像头,不应向没有摄像头的用户设备显示。

通常,如果应用请求与硬件相关的权限,Google Play 会假定应用需要底层硬件功能,即使可能没有对应的 <uses-feature> 声明。然后,Google Play 会根据 <uses-feature> 声明所隐含的功能设置过滤。

有关隐含硬件功能的权限列表,请参阅 <uses-feature> 元素的文档。

<uses-sdk> 最低框架版本 (minSdkVersion)

应用可以要求最低 API 级别。

示例 1
清单包含 <uses-sdk android:minSdkVersion="3">,并且应用使用在 API 级别 3 中引入的 API。用户正在 API 级别 2 的设备上搜索应用。结果:Google Play 将不会向用户显示该应用。

示例 2
清单不包含 minSdkVersion,并且应用使用在 API 级别 3 中引入的 API。用户正在 API 级别 2 的设备上搜索应用。结果:Google Play 假定 minSdkVersion 为“1”,并且应用与所有版本的 Android 兼容。Google Play 向用户显示该应用并允许用户下载该应用。应用在运行时崩溃。

因为您希望避免第二种情况,我们建议您始终声明 minSdkVersion。有关详细信息,请参阅 android:minSdkVersion

最高框架版本 (maxSdkVersion)

已废弃。 Android 2.1 及更高版本不检查或强制执行 maxSdkVersion 属性,并且如果应用清单中设置了 maxSdkVersion,则 SDK 将无法编译。对于已编译包含 maxSdkVersion 的设备,Google Play 将遵守并将其用于过滤。

不推荐声明 maxSdkVersion。有关详细信息,请参阅 android:maxSdkVersion

高级清单过滤器

除了表 1 中的清单元素外,Google Play 还可以根据表 2 中的高级清单元素过滤应用程序。

这些清单元素及其触发的过滤仅适用于特殊用例。它们是为某些类型的高性能游戏和类似应用程序设计的,这些应用程序需要严格控制应用程序分发。大多数应用程序绝不应使用这些过滤器

表 2. 用于 Google Play 过滤的高级清单元素。

清单元素摘要
<compatible-screens>

如果设备的屏幕尺寸和密度与 <compatible-screens> 元素中声明的任何屏幕配置(由 <screen> 元素声明)不匹配,则 Google Play 会过滤该应用程序。

注意:通常,您不应使用此清单元素。使用此元素可能会大大减少您应用程序的潜在用户群,因为它会排除所有您未列出的屏幕尺寸和密度组合。您应该改用 <supports-screens> 清单元素(如上文表 1 中所述)来为您的替代资源未考虑的屏幕配置启用屏幕兼容模式。

<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:

所有其他过滤器的工作方式与往常一样,但这四种过滤器是 Google Play 上同一应用列表内区分不同 APK 的唯一过滤器。例如,如果 APK 仅因设备是否有摄像头而不同,则不能为同一应用发布多个 APK。

注意:为同一应用发布多个 APK 被认为是高级功能,并且大多数应用应只发布一个支持广泛设备配置的 APK。发布多个 APK 需要您遵循过滤器中的特定规则,并且需要特别注意每个 APK 的版本代码,以确保每种配置的正确更新路径。

如果您需要更多关于如何在 Google Play 上发布多个 APK 的信息,请阅读 多 APK 支持

另请参阅

  1. Android 兼容性
  2. 多 APK 支持