When a user searches or browses for apps to download on Google Play, the
results are filtered based on which applications are compatible with the device.
For example, if an app requires a camera, Google Play would not show the app to devices
that do not have a camera. This *filtering* helps developers manage the
distribution of their apps and helps ensure the best possible experience for
users.

Filtering in Google Play is based on several types of app metadata and
configuration settings, including manifest declarations, required
libraries,architecture dependencies, and distribution controls set in the Google
Play Console, such as geographic targeting, pricing, and more.

Google Play filtering is based in part on manifest declarations and other
aspects of the Android framework, but actual filtering behaviors are distinct
from the framework and are not bound to specific API levels. This document
specifies the current filtering rules used by Google Play.

## How filters work on Google Play

Google Play uses the filter restrictions described below to determine
whether to show your application to a user who is browsing or searching for
applications from the Google Play app.

When determining whether to display your app, Google Play checks the device's
hardware and software requirement, as well as its carrier, location, and other
characteristics. It then compares those against the restrictions and
dependencies expressed by the application's manifest file and publishing
details.

If the application is compatible with the device according to the filter
rules, Google Play displays the application to the user. Otherwise, Google Play
hides your application from search results and category browsing, even if a user
specifically requests the app by clicking a deep link that points directly to
the app's ID within Google Play.

You can use any combination of the available filters for your app. For example, you can set a
`minSdkVersion` requirement of `"4"` and set `smallScreens="false"`
in the app, then when uploading the app to Google Play you could target European countries (carriers)
only. Google Play's filters will thus prevent the application from being available on any device
that does not match all three of these requirements.

All filtering restrictions are associated with an application's version and can
change between versions. For example, if a user has installed your application and you publish an
update that makes the app invisible to the user, the user will not see that an update is
available.

#### Filtering on the Google Play web site

When users browse the [Google Play web
site](http://play.google.com/apps), they can see all published applications. The Google Play web site
compares the application requirements to each of the user's registered devices
for compatibility, though, and only allows them to install the application if
it's compatible with their device.

## Filtering based on the app manifest

Most filters are triggered by elements within an application's
manifest file, [AndroidManifest.xml](https://developer.android.com/guide/topics/manifest/manifest-intro)
(although not everything in the manifest file can trigger filtering).
Table 1 lists the manifest elements that you should use to trigger
filtering, and explains how the filtering for each element works.

**Table 1.** Manifest elements that
trigger filtering on Google Play.

| Manifest Element | Filter Name | How It Works |
|---|---|---|
| [<supports-screens>](https://developer.android.com/guide/topics/manifest/supports-screens-element) | Screen Size | An application indicates the screen sizes that it is capable of supporting by setting attributes of the `<supports-screens>` element. When the application is published, Google Play uses those attributes to determine whether to show the application to users, based on the screen sizes of their devices. As a general rule, Google Play assumes that the platform on the device can adapt smaller layouts to larger screens, but cannot adapt larger layouts to smaller screens. Thus, if an application declares support for "normal" screen size only, Google Play makes the application available to both normal- and large-screen devices, but filters the application so that it is not available to small-screen devices. If an application does not declare attributes for `<supports-screens>`, Google Play uses the default values for those attributes, which vary by API Level. Specifically: - For applications that set either the [android: minSdkVersion](https://developer.android.com/guide/topics/manifest/uses-sdk-element#min) or [android: targetSdkVersion](https://developer.android.com/guide/topics/manifest/uses-sdk-element#target) to 3 or lower, the `<supports-screens>` element itself is undefined and no attributes are available. In this case, Google Play assumes that the application is designed for normal-size screens and shows the application to devices that have normal or larger screens. - When the either the [android: minSdkVersion](https://developer.android.com/guide/topics/manifest/uses-sdk-element#min) or [android: targetSdkVersion](https://developer.android.com/guide/topics/manifest/uses-sdk-element#target) is set to 4 or higher, the default for all attributes is `"true"`. In this way, the application is considered to support all screen sizes by default. **Example 1** The manifest declares `<uses-sdk android:minSdkVersion="3">` and does not include a `<supports-screens>` element. **Result**: Google Play will not show the app to a user of a small-screen device, but will show it to users of normal and large-screen devices, unless other filters apply. **Example 2** The manifest declares `<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4">` and does not include a `<supports-screens>` element. **Result**: Google Play will show the app to users on all devices, unless other filters apply. **Example 3** The manifest declares `<uses-sdk android:minSdkVersion="4">` and does not include a `<supports-screens>` element. **Result**: Google Play will show the app to all users, unless other filters apply. For more information on how to declare support for screen sizes in your application, see [<supports-screens>](https://developer.android.com/guide/topics/manifest/supports-screens-element) and [Supporting Multiple Screens](https://developer.android.com/guide/practices/screens_support). |
| [<uses-configuration>](https://developer.android.com/guide/topics/manifest/uses-configuration-element) | Device Configuration: keyboard, navigation, touch screen | An application can request certain hardware features, and Google Play will show the app only on devices that have the required hardware. **Example 1** The manifest includes `<uses-configuration android:reqFiveWayNav="true" />`, and a user is searching for apps on a device that does not have a five-way navigational control. **Result**: Google Play will not show the app to the user. **Example 2** The manifest does not include a `<uses-configuration>` element. **Result**: Google Play will show the app to all users, unless other filters apply. For more details, see [`<uses-configuration>`](https://developer.android.com/guide/topics/manifest/uses-configuration-element). |
| [<uses-feature>](https://developer.android.com/guide/topics/manifest/uses-feature-element)` ` | Device Features (`name`) | An application can require certain device features to be present on the device. This functionality was introduced in Android 2.0 (API Level 5). **Example 1** The manifest includes `<uses-feature android:name="android.hardware.sensor.light" />`, and a user is searching for apps on a device that does not have a light sensor. **Result**: Google Play will not show the app to the user. **Example 2** The manifest does not include a `<uses-feature>` element. **Result**: Google Play will show the app to all users, unless other filters apply. For complete information, see [<uses-feature>](https://developer.android.com/guide/topics/manifest/uses-feature-element)` `. *Filtering based on implied features:* In some cases, Google Play interprets permissions requested through `<uses-permission>` elements as feature requirements equivalent to those declared in `<uses-feature>` elements. See [`<uses-permission>`](https://developer.android.com/google/play/filters#uses-permission-filtering), below. |
| [<uses-feature>](https://developer.android.com/guide/topics/manifest/uses-feature-element)` ` | OpenGL-ES Version (`openGlEsVersion`) | An application can require that the device support a specific OpenGL-ES version using the `<uses-feature android:openGlEsVersion="int">` attribute. **Example 1** An app requests multiple OpenGL-ES versions by specifying `openGlEsVersion` multiple times in the manifest. **Result**: Google Play assumes that the app requires the highest of the indicated versions. **Example 2** An app requests OpenGL-ES version 1.1, and a user is searching for apps on a device that supports OpenGL-ES version 2.0. **Result** : Google Play will show the app to the user, unless other filters apply. If a device reports that it supports OpenGL-ES version *X* , Google Play assumes that it also supports any version earlier than *X*. **Example 3** A user is searching for apps on a device that does not report an OpenGL-ES version (for example, a device running Android 1.5 or earlier). **Result** : Google Play assumes that the device supports only OpenGL-ES 1.0. Google Play will only show the user apps that do not specify `openGlEsVersion`, or apps that do not specify an OpenGL-ES version higher than 1.0. **Example 4** The manifest does not specify `openGlEsVersion`. **Result**: Google Play will show the app to all users, unless other filters apply. For more details, see [`<uses-feature>`](https://developer.android.com/guide/topics/manifest/uses-feature-element). |
| [<uses-library>](https://developer.android.com/guide/topics/manifest/uses-library-element) | Software Libraries | An application can require specific shared libraries to be present on the device. **Example 1** An app requires the `com.google.android.maps` library, and a user is searching for apps on a device that does not have the `com.google.android.maps` library. **Result**: Google Play will not show the app to the user. **Example 2** The manifest does not include a `<uses-library>` element. **Result**: Google Play will show the app to all users, unless other filters apply. For more details, see [`<uses-library>`](https://developer.android.com/guide/topics/manifest/uses-library-element). |
| [<uses-permission>](https://developer.android.com/guide/topics/manifest/uses-permission-element) |   | Strictly, Google Play does not filter based on `<uses-permission>` elements. However, it does read the elements to determine whether the application has hardware feature requirements that may not have been properly declared in `<uses-feature>` elements. For example, if an application requests the `CAMERA` permission but does not declare a `<uses-feature>` element for `android.hardware.camera`, Google Play considers that the application requires a camera and should not be shown to users whose devices do not offer a camera. In general, if an application requests hardware-related permissions, Google Play assumes that the application requires the underlying hardware features, even though there might be no corresponding to `<uses-feature>` declarations. Google Play then sets up filtering based on the features implied by the `<uses-feature>` declarations. For a list of permissions that imply hardware features, see the documentation for the [`<uses-feature>`](https://developer.android.com/guide/topics/manifest/uses-feature-element#permissions-features) element. |
| [<uses-sdk>](https://developer.android.com/guide/topics/manifest/uses-sdk-element) | Minimum Framework Version (`minSdkVersion`) | An application can require a minimum API level. **Example 1** The manifest includes `<uses-sdk android:minSdkVersion="3">`, and the app uses APIs that were introduced in API Level 3. A user is searching for apps on a device that has API Level 2. **Result**: Google Play will not show the app to the user. **Example 2** The manifest does not include `minSdkVersion`, and the app uses APIs that were introduced in API Level 3. A user is searching for apps on a device that has API Level 2. **Result** : Google Play assumes that `minSdkVersion` is "1" and that the app is compatible with all versions of Android. Google Play shows the app to the user and allows the user to download the app. The app crashes at runtime. Because you want to avoid this second scenario, we recommend that you always declare a `minSdkVersion`. For details, see [`android:minSdkVersion`](https://developer.android.com/guide/topics/manifest/uses-sdk-element#min). |
| [<uses-sdk>](https://developer.android.com/guide/topics/manifest/uses-sdk-element) | Maximum Framework Version (`maxSdkVersion`) | *Deprecated.* Android 2.1 and later do not check or enforce the `maxSdkVersion` attribute, and the SDK will not compile if `maxSdkVersion` is set in an app's manifest. For devices already compiled with `maxSdkVersion`, Google Play will respect it and use it for filtering. Declaring `maxSdkVersion` is *not* recommended. For details, see [`android:maxSdkVersion`](https://developer.android.com/guide/topics/manifest/uses-sdk-element#max). |

### Advanced manifest filters

In addition to the manifest elements in [table 1](https://developer.android.com/google/play/filters#table1), Google Play can also
filter applications based on the advanced manifest elements in table 2.

These manifest elements and the filtering they trigger are for exceptional use-cases
only. These are designed for certain types of high-performance games and similar applications that
require strict controls on application distribution. **Most applications should never use
these filters**.

**Table 2.** Advanced manifest elements for
Google Play filtering.

| Manifest Element | Summary |
|---|---|
| [`<compatible-screens>`](https://developer.android.com/guide/topics/manifest/compatible-screens-element) | Google Play filters the application if the device screen size and density does not match any of the screen configurations (declared by a `<screen>` element) in the `<compatible-screens>` element. **Caution:** Normally, **you should not use this manifest element** . Using this element can dramatically reduce the potential user base for your application, by excluding all combinations of screen size and density that you have not listed. You should instead use the [`<supports-screens>`](https://developer.android.com/guide/topics/manifest/supports-screens-element) manifest element (described above in [table 1](https://developer.android.com/google/play/filters#table1)) to enable screen compatibility mode for screen configurations you have not accounted for with alternative resources. |
| [`<supports-gl-texture>`](https://developer.android.com/guide/topics/manifest/supports-gl-texture-element) | Google Play filters the application unless one or more of the GL texture compression formats supported by the application are also supported by the device. |

## Other filters

Google Play uses other application characteristics to determine whether to show or hide an application for a particular user on a given device, as described in the table below.

**Table 3.** Application and publishing
characteristics that affect filtering on Google Play.

| Filter Name | How It Works |
|---|---|
| Publishing Status | Only published applications will appear in searches and browsing within Google Play. Even if an app is unpublished, it can be installed if users can see it in their Downloads area among their purchased, installed, or recently uninstalled apps. If an application has been suspended, users will not be able to reinstall or update it, even if it appears in their Downloads. |
| Priced Status | Not all users can see paid apps. To show paid apps, a device must be running Android 1.1 or later, and it must be in a country where paid apps are available. If a device has a SIM card, the SIM carrier determines whether paid apps are available. If a device doesn't have a SIM card, the device's IP address is used to determine whether the device is in a country where paid apps are available. |
| Country Targeting | When you upload your app to Google Play, you can select the countries in which to distribute your app under **Pricing and Distribution**. The app will then be available to users in only the countries you select. |
| CPU Architecture (ABI) | An application that includes native libraries that target a specific CPU architecture (ARM EABI v7 or x86, for example) are visible only on devices that support that architecture. For details about the NDK and using native libraries, see [What is the Android NDK?](https://developer.android.com/tools/sdk/ndk#overview) |
| Copy-Protected Applications | Google Play no longer supports the Copy Protection feature in the Play Console and no longer filters apps based on it. To secure your app, please use [Application Licensing](https://developer.android.com/google/play/licensing) instead. See [Replacement for Copy Protection](https://developer.android.com/google/play/licensing/overview#CopyProtection) for more information. |

## Publishing multiple APKs with different filters

Some specific Google Play filters allow you to publish multiple APKs for the same
application in order to provide a different APK to different device configurations. For example, if
you're creating a video game that uses high-fidelity graphic assets, you might want to create
two APKs that each support different texture compression formats. This way, you can reduce the
size of the APK file by including only the textures that are required for each device
configuration. Depending on each device's support for your texture compression formats, Google
Play will deliver it the APK that you've declared to support that device.

Currently, Google Play allows you to publish multiple APKs for the same application only
when each APK provides different filters based on the following configurations:

- OpenGL texture compression formats By using the [`<supports-gl-texture>`](https://developer.android.com/guide/topics/manifest/supports-gl-texture-element) element.

- Screen size (and, optionally, screen density) By using the [`<supports-screens>`](https://developer.android.com/guide/topics/manifest/supports-screens-element) or [`<compatible-screens>`](https://developer.android.com/guide/topics/manifest/compatible-screens-element) element.

- API level By using the [`<uses-sdk>`](https://developer.android.com/guide/topics/manifest/uses-sdk-element) element.

- CPU Architecture (ABI) By including native libraries built with the [Android
  NDK](https://developer.android.com/tools/sdk/ndk) that target a specific CPU architecture (ARM EABI v7 or x86, for example).

All other filters still work the same as usual, but these four are the only filters that can
distinguish one APK from another within the same application listing on Google Play. For example,
you *cannot* publish multiple APKs for the same application if the APKs differ only based on
whether the device has a camera.

**Caution:** Publishing multiple APKs for the same application is
considered an advanced feature and **most application should publish only one
APK that supports a wide range of device configurations**. Publishing multiple APKs
requires that you follow specific rules within your filters and that you pay extra attention to the
version codes for each APK to ensure proper update paths for each configuration.

If you need more information about how to publish multiple APKs on Google Play, read [Multiple APK Support](https://developer.android.com/google/play/publishing/multiple-apks).

## See also

1. [Android compatibility](https://developer.android.com/guide/practices/compatibility)
2. [Multiple APK support](https://developer.android.com/google/play/publishing/multiple-apks)