Общие сведения о совместимости устройств

Android работает на самых разных устройствах, включая телефоны, планшеты и телевизоры. Разнообразие устройств обеспечивает огромную потенциальную аудиторию для вашего приложения. Чтобы оно было успешным на всех устройствах, оно должно поддерживать различные функции и предоставлять гибкий пользовательский интерфейс, который адаптируется к различным конфигурациям экрана.

Чтобы обеспечить совместимость с разными устройствами, в Android используется динамическая платформа приложений, в которой можно предоставлять ресурсы приложения для определенных конфигураций в статических файлах, например разные макеты XML для разных размеров экрана. Затем Android загружает соответствующие ресурсы на основе текущей конфигурации устройства. Если вы заранее продумаете дизайн приложения и добавите дополнительные ресурсы, то сможете опубликовать один пакет APK, который будет оптимизирован для разных устройств.

Однако при необходимости вы можете указать требования к функциям приложения и выбрать типы устройств, на которые его можно будет установить из Google Play. В этом документе рассказывается, как управлять доступом к приложениям и как подготовить их к публикации для нужной аудитории.

Что означает совместимость?

В разработке для Android есть два типа совместимости: совместимость устройств и совместимость приложений.

Поскольку Android – это проект с открытым исходным кодом, любой производитель оборудования может создать устройство, работающее на операционной системе Android. Однако устройство считается совместимым с Android, только если на нем корректно работают приложения, написанные для среды выполнения Android. Точные сведения о среде выполнения Android определяются Программой совместимости Android. Чтобы устройство считалось совместимым, оно должно пройти проверку Compatibility Test Suite (CTS).

Разработчикам приложений не нужно беспокоиться о совместимости устройств с Android, поскольку Google Play доступен только на совместимых устройствах. Поэтому, если пользователь устанавливает ваше приложение из Google Play Store, он использует устройство, совместимое с Android.

Однако необходимо учитывать, совместимо ли ваше приложение с каждой потенциальной конфигурацией устройства. Поскольку Android работает на устройствах с самыми разными конфигурациями, некоторые функции доступны не везде. Например, некоторые устройства могут не включать датчик компаса. Если для работы основных функций приложения нужен датчик компаса, то оно будет совместимо только с устройствами, где есть такой датчик.

Как управлять доступностью приложения для устройств

Android поддерживает множество функций, которые ваше приложение может использовать через API платформы. Некоторые функции основаны на аппаратном обеспечении, например датчик компаса; некоторые основаны на программном обеспечении, например виджеты приложений; а некоторые зависят от версии платформы. Не все устройства поддерживают все функции, поэтому вам может потребоваться контролировать доступность приложения для устройств в зависимости от необходимых функций приложения.

Чтобы охватить как можно больше пользователей, обеспечьте поддержку максимального количества конфигураций устройств в одном APK-файле или наборе App Bundle. В большинстве случаев для этого достаточно отключить необязательные функции во время выполнения и предоставить ресурсы приложения с альтернативными вариантами для разных конфигураций, например разные макеты для разных размеров экрана. При необходимости вы можете ограничить доступность приложения в Google Play для определенных устройств на основе следующих характеристик:

Функции устройства

Чтобы управлять доступностью приложения в зависимости от функций устройства, в Android определяются идентификаторы функций для любых аппаратных или программных функций, которые могут быть доступны не на всех устройствах. Например, идентификатор функции для датчика компаса – FEATURE_SENSOR_COMPASS, а для виджетов приложений – FEATURE_APP_WIDGETS.

При необходимости вы можете запретить пользователям устанавливать ваше приложение, если их устройства не поддерживают нужную функцию. Для этого объявите ее с помощью элемента <uses-feature> в файле манифеста приложения.

Например, если для работы приложения необходим датчик компаса, вы можете объявить это требование в манифесте с помощью следующего тега:

<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>

Google Play сравнивает функции, необходимые для работы приложения, с функциями, доступными на устройстве пользователя, чтобы определить, совместимо ли приложение с этим устройством. Если устройство не поддерживает все функции, необходимые для работы приложения, пользователь не сможет его установить.

Если же основная функция приложения не требует наличия определенного компонента, задайте для атрибута required значение "false" и проверяйте наличие компонента во время выполнения. Если функция приложения недоступна на текущем устройстве, постепенно сокращайте ее использование. Например, вы можете узнать, доступна ли функция, вызвав hasSystemFeature() следующим образом:

Kotlin

if (!packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
    // This device doesn't have a compass. Turn off the compass feature.
    disableCompassFeature()
}

Java

PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
    // This device doesn't have a compass. Turn off the compass feature.
    disableCompassFeature();
}

Подробную информацию о фильтрах, которые можно использовать для управления доступностью приложения в Google Play, вы найдете в документации.

Версия платформы

На разных устройствах могут быть установлены разные версии платформы Android, например Android 12 или Android 13. В каждой новой версии платформы часто добавляются API, недоступные в предыдущей. Чтобы указать, какой набор API доступен, в каждой версии платформы задается уровень API. Например, Android 12 – это уровень API 31, а Android 13 – уровень API 33.

В файле build.gradle необходимо указать значения minSdkVersion и targetSdkVersion.

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"

        // Defines the minimum API level required to run the app.
        minSdkVersion(30)

        // Specifies the API level used to test the app.
        targetSdkVersion(36)
        ...
    }
}

Яркий

android {
    defaultConfig {
        applicationId 'com.example.myapp'

        // Defines the minimum API level required to run the app.
        minSdkVersion 30

        // Specifies the API level used to test the app.
        targetSdkVersion 36
        ...
    }
}

Подробные сведения о файле build.gradle можно найти в статье Настройка сборки.

Каждая последующая версия Android обеспечивает совместимость с приложениями, созданными с использованием API из предыдущих версий платформы. Таким образом, ваше приложение будет совместимо с будущими версиями Android, если вы используете документированные API Android.

Однако если в вашем приложении используются API, добавленные в более поздней версии платформы, но они не требуются для его основной функциональности, проверяйте уровень API во время выполнения и постепенно сокращайте соответствующие функции, если уровень API слишком низкий. В этом случае задайте для minSdkVersion минимальное значение, возможное для основной функции приложения, а затем сравните текущую версию системы SDK_INT с константой кодового названия в Build.VERSION_CODES, которая соответствует уровню API, который вы хотите проверить, как показано в следующем примере:

Kotlin

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    // Running on something older than API level 11, so disable
    // the drag and drop features that use ClipboardManager APIs.
    disableDragAndDrop()
}

Java

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    // Running on something older than API level 11, so disable
    // the drag and drop features that use ClipboardManager APIs.
    disableDragAndDrop();
}

Конфигурация экрана

Android работает на устройствах разных размеров, таких как телефоны, планшеты и телевизоры. Чтобы классифицировать устройства по типу экрана, Android определяет две характеристики для каждого устройства: размер экрана (физический размер экрана) и плотность экрана (физическая плотность пикселей на экране, известная как DPI). Чтобы упростить работу с различными конфигурациями, Android объединяет эти варианты в группы, на которые проще настраивать таргетинг:

  • Четыре обобщенных размера: маленький, обычный, большой и очень большой.
  • Несколько обобщенных плотностей: mdpi (средняя), hdpi (высокая), xhdpi (сверхвысокая), xxhdpi (очень высокая) и т. д.

По умолчанию приложение совместимо со всеми размерами и плотностями экранов, поскольку система корректирует макет пользовательского интерфейса и ресурсы изображений в соответствии с каждым экраном. Предоставьте оптимизированные растровые изображения для распространенных плотностей экрана.

Чтобы сделать сайт удобнее для пользователей, по возможности используйте гибкие макеты. Если у вас есть макеты для значительных изменений конфигурации, например портретной и альбомной ориентации или больших и маленьких размеров окон, подумайте о том, чтобы предоставить альтернативные макеты, которые можно адаптировать к меньшим изменениям в конфигурации. Это улучшает пользовательский опыт на таких форм-факторах, как планшеты, телефоны и складные устройства. Это также помогает, когда окна меняют размер в многооконном режиме.

Информацию о том, как создавать альтернативные ресурсы для разных экранов и как при необходимости ограничить работу приложения на экранах определенных размеров, можно найти в обзоре совместимости экранов и рекомендациях по обеспечению качества приложений для больших экранов.

Как управлять доступностью приложения в коммерческих целях

Помимо ограничений, связанных с характеристиками устройств, вам может потребоваться ограничить доступность приложения по коммерческим или юридическим причинам. Для таких ситуаций в Google Play Console предусмотрены параметры фильтрации, которые позволяют управлять доступностью приложения по нетехническим причинам, например в зависимости от местоположения пользователя или оператора мобильной связи.

Фильтрация по технической совместимости, например по требуемым аппаратным компонентам, всегда выполняется на основе информации, содержащейся в файле APK или AAB. Фильтрация по нетехническим причинам, например по географическому местоположению, всегда выполняется в Google Play Console.

Дополнительные ресурсы

Обзор ресурсов приложения
Информация о том, как устроены приложения для Android, чтобы отделять ресурсы приложения от кода приложения, включая то, как вы можете предоставлять альтернативные ресурсы для определенных конфигураций устройств.
Фильтры в Google Play
Информация о том, как Google Play может предотвратить установку вашего приложения на разные устройства.
Разрешения на устройствах Android
Как Android ограничивает доступ приложений к определенным API с помощью системы разрешений, которая требует согласия пользователя на использование этих API.