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 中应用 ID 的深层链接专门请求该应用,Google Play 也会将其从搜索结果和类别浏览中隐藏。

您可以为您的应用使用任何可用过滤器的组合。例如,您可以设置 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 的应用程序,或未指定高于 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 Console 中的版权保护功能,也不再基于此功能过滤应用。要保护您的应用,请改用 应用许可。有关更多信息,请参阅 版权保护的替代方案

发布具有不同过滤器的多个 APK

某些特定的 Google Play 过滤器允许您发布同一应用的多个 APK,以便为不同的设备配置提供不同的 APK。例如,如果您正在创建一款使用高保真图形资源的视频游戏,您可能需要创建两个分别支持不同纹理压缩格式的 APK。这样,您可以通过仅包含每个设备配置所需的纹理来减小 APK 文件的大小。根据每个设备对您的纹理压缩格式的支持情况,Google Play 将向其提供您已声明支持该设备的 APK。

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

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

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

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

另请参阅

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