It's happening now, watch the livestream.

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 级别 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 的应用,或者没有指定 OpenGL-ES 1.0 以上版本的应用。

示例 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。

目前,只有在每个 APK 根据以下配置提供不同过滤时,Google Play 才允许您为同一应用发布多个 APK:

所有其他过滤器仍像平常一样工作,但只有这四个过滤器能够在 Google Play 的同一应用详情内将一个 APK 与另一个区分开来。例如,如果 APK 仅在设备是否有摄像头这一条件上不同,则您无法为同一应用发布多个 APK。

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

如需详细了解如何在 Google Play 上发布多个 APK,请阅读多 APK 支持

另请参阅

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