Google Play 筛选器

当用户在 Google Play 上搜索或浏览要下载的应用时,结果会根据哪些应用与设备兼容进行过滤。例如,如果应用需要摄像头,Google Play 不会将该应用显示给没有摄像头的设备。此过滤有助于开发者管理其应用的分发,并有助于确保为用户提供最佳体验。

Google Play 中的过滤基于多种类型的应用元数据和配置设置,包括清单声明、所需库、架构依赖项以及在 Google Play Console 中设置的分发控制,例如地理定位、定价等。

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的应用,或未指定高于 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 的版本代码,以确保每个配置的更新路径正确。

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

另请参阅

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