Инструменты тестирования на совместимость

В Android 11 появились новые инструменты разработчика для тестирования и отладки приложений с учетом изменений в поведении новых версий платформы Android. Эти инструменты входят в платформу совместимости, которая позволяет разработчикам приложений включать и отключать критические изменения по отдельности, используя параметры для разработчиков или ADB. Используйте эту возможность, когда готовитесь перейти на последнюю стабильную версию API и тестируете приложение с предварительным выпуском следующей версии Android.

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

Как определить, какие изменения включены

Когда изменение поведения включено, оно может повлиять на то, как ваше приложение обращается к API платформы, затронутым этим изменением. Проверить, какие изменения поведения включены, можно в разделе "Для разработчиков", а также с помощью Logcat или команд ADB.

Как определить, какие изменения включены, в настройках для разработчиков

Рисунок 1. "Изменения в совместимости приложений" в настройках для разработчиков.

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

  1. Если параметры для разработчиков не включены, включите их.
  2. Откройте приложение "Настройки" и выберите Система > Дополнительно > Для разработчиков > Изменения совместимости приложений.
  3. Выберите приложение из списка.

Каждое изменение поведения обычно относится к одной из двух следующих категорий:

  • Изменения, которые затрагивают все приложения, работающие на этой версии Android, независимо от значения targetSdkVersion.

    Эти изменения включены по умолчанию в тестировании на совместимость и перечислены в разделе Изменения, включенные по умолчанию.

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

    Эти изменения включены по умолчанию в тестировании на совместимость, если ваше приложение предназначено для более высокой версии, чем указанная версия API. Например, изменение в поведении, которое в Android 13 (уровень API 33) зависит от targetSDKVersion, будет указано в разделе Включено для targetSdkVersion >=33. В некоторых более ранних версиях Android этот раздел называется "Включено после SDK API_LEVEL".

На рисунке 1 также есть раздел Default Disabled Changes (Изменения, отключенные по умолчанию). Изменения, которые попадают в этот раздел, могут служить различным целям. Прежде чем включить эти изменения, прочитайте их описание в списке изменений для тестирования на совместимость для этой версии Android.

Как определить включенные изменения с помощью logcat

При первом вызове затронутого API в процессе работы приложения система выводит сообщение logcat, подобное следующему:

D CompatibilityChangeReporter: Compat change id reported: 194833441; UID 10265; state: ENABLED

Каждое сообщение logcat содержит следующую информацию:

Идентификатор изменения
Указывает, какое изменение влияет на приложение. Это значение сопоставляется с одним из изменений в поведении, перечисленных на экране App Compatibility Changes (Изменения совместимости приложений) (см. рис. 1). В этом примере 194833441 сопоставляется с NOTIFICATION_PERM_CHANGE_ID.
Уникальный идентификатор
Указывает, на какое приложение влияет изменение.
Штат

Указывает, влияет ли изменение на приложение.

Возможные значения:

Штат Значение
ENABLED Изменение включено и повлияет на работу приложения, если оно использует измененные API.
DISABLED

Изменение отключено и не повлияет на приложение.

Примечание. Если изменение отключено, потому что значение targetSDKVersion приложения ниже требуемого, оно будет включено по умолчанию, когда вы повысите targetSDKVersion до нужного уровня.

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

Как определить включенные изменения с помощью ADB

Чтобы посмотреть полный список изменений (как включенных, так и отключенных) на всем устройстве, выполните следующую команду ADB:

adb shell dumpsys platform_compat

В выходных данных для каждого изменения указывается следующая информация:

Идентификатор изменения
Уникальный идентификатор изменения в поведении. например 194833441.
Название
Название изменения в поведении. например NOTIFICATION_PERM_CHANGE_ID.
Критерии targetSDKVersion

Каким targetSDKVersion ограничено изменение (если ограничено).

Например, если изменение включено только для приложений, использующих SDK версии 33 или выше, будет выведено enableAfterTargetSdk=32. Если изменение не ограничено правилом targetSDKVersion, выводится enableAfterTargetSdk=0.

Переопределение пакетов

Название каждого пакета, в котором было переопределено состояние изменения по умолчанию (включено или отключено).

Например, если это изменение включено по умолчанию, название пакета вашего приложения будет указано, если вы отключили изменение с помощью параметров Для разработчиков или ADB. В этом случае результат будет следующим:

packageOverrides={com.my.package=false}

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

packageOverrides={com.my.package=true, com.another.package=false}

Подробнее об изменениях

Полный список изменений в поведении, связанных с тестированием на совместимость, приведен в документации для каждой версии Android. Дополнительную информацию можно найти по ссылкам ниже (в зависимости от версии Android, для которой вы тестируете приложение):

Когда нужно переключать изменения

Основная цель тестирования на совместимость – предоставить вам контроль и гибкость при тестировании приложения с новыми версиями Android. В этом разделе описаны некоторые стратегии, которые можно использовать, чтобы определить, когда следует включать или отключать изменения при тестировании и отладке приложения.

Когда следует отключить изменения

Решение о том, когда отключить изменения, обычно зависит от того, управляется ли изменение с помощью targetSDKVersion.

Изменения включены для всех приложений

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

Например, если вы готовитесь к переходу на Android 16 (уровень API 36), вы можете установить приложение на устройство с Android 16 и протестировать его, используя обычные рабочие процессы тестирования. Если в приложении возникнут проблемы, вы сможете отключить изменение, которое их вызывает, и продолжить тестирование.

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

Рекомендуем уделить особое внимание тестированию этих изменений, поскольку их нельзя отключить в общедоступной конечной сборке Android. В идеале тестирование следует проводить для каждой версии Android, пока она находится на этапе предварительной версии.

Изменения, ограниченные targetSDKVersion

Если ваше приложение предназначено для определенной версии targetSDKVersion, все изменения, связанные с этой версией, включены по умолчанию. Поэтому, когда вы перейдете на новую версию targetSDKVersion, на ваше приложение сразу повлияет множество изменений.

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

Когда включать изменения

Изменения, связанные с определенной версией targetSDKVersion, по умолчанию отключены, если приложение предназначено для более ранней версии SDK. Обычно при подготовке к переходу на новую targetSdkVersion у вас есть список изменений в поведении, которые необходимо протестировать и отладить в приложении.

Например, вы можете тестировать приложение на совместимость с изменениями платформы, которые будут внедрены в следующей версии targetSdkVersion. Используя настройки для разработчиков или команды ADB, вы можете включать и тестировать каждое изменение по отдельности, а не менять манифест приложения и включать все изменения сразу.

Это позволит вам тестировать изменения по отдельности, а не отлаживать и обновлять сразу несколько частей приложения.

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

Как включить или отключить изменения

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

Как включить или отключить изменения в параметрах для разработчиков

Чтобы включить или отключить изменения, используйте настройки для разработчиков. Чтобы найти их, выполните следующие действия:

  1. Если параметры для разработчиков не включены, включите их.
  2. Откройте приложение "Настройки" и выберите Система > Дополнительно > Для разработчиков > Изменения совместимости приложений.
  3. Выберите приложение из списка.
  4. Найдите в списке нужное изменение и нажмите на переключатель.
Список изменений, которые можно включить или отключить
Рисунок 2. Включить или отключить изменения.

Как включить или отключить изменения с помощью ADB

Чтобы включить или отключить изменение с помощью ADB, выполните одну из следующих команд:

adb shell am compat enable (CHANGE_ID|CHANGE_NAME) PACKAGE_NAME
adb shell am compat disable (CHANGE_ID|CHANGE_NAME) PACKAGE_NAME

Передайте CHANGE_ID (например, 194833441) или CHANGE_NAME (например, NOTIFICATION_PERM_CHANGE_ID) и PACKAGE_NAME вашего приложения.

Вы также можете использовать следующую команду, чтобы сбросить изменение до состояния по умолчанию, удалив все переопределения, заданные с помощью ADB или параметров для разработчиков:

adb shell am compat reset (CHANGE_ID|CHANGE_NAME) PACKAGE_NAME

Ограничения на переключение

По умолчанию каждое изменение поведения включено или отключено. Изменения, которые затрагивают все приложения, включены по умолчанию. Другие изменения требуют targetSdkVersion. Эти изменения по умолчанию включены, если приложение предназначено для соответствующей или более поздней версии SDK, и отключены, если приложение предназначено для более ранней версии SDK. Когда вы включаете или отключаете изменение, вы переопределяете его состояние по умолчанию.

Чтобы предотвратить злоупотребление тестированием на совместимость, мы ввели некоторые ограничения на переключение изменений. Возможность переключения зависит от типа изменения, от того, доступно ли приложение для отладки, и от типа сборки, запущенной на устройстве. В таблице ниже указано, когда можно переключать разные типы изменений.

Тип сборки Приложение, не поддерживающее отладку Отладочное приложение
Все изменения Изменения, связанные с targetSDKVersion Все остальные изменения
Предварительная версия для разработчиков или бета-версия Не удается переключить Can toggle Can toggle
Общедоступная сборка Не удается переключить Can toggle Не удается переключить