В Android 11 появились новые инструменты разработчика для тестирования и отладки приложений с учетом изменений в поведении новых версий платформы Android. Эти инструменты входят в платформу совместимости, которая позволяет разработчикам приложений включать и отключать критические изменения по отдельности, используя параметры для разработчиков или ADB. Используйте эту возможность, когда готовитесь перейти на последнюю стабильную версию API и тестируете приложение с предварительным выпуском следующей версии Android.
При использовании инструментов тестирования на совместимость платформа Android автоматически адаптирует свою внутреннюю логику, поэтому вам не нужно менять targetSDKVersion или перекомпилировать приложение для выполнения базового тестирования. Поскольку изменения можно включать по отдельности, вы можете изолировать, протестировать и отладить одно изменение поведения за раз или отключить одно изменение, вызывающее проблемы, если вам нужно сначала протестировать что-то другое.
Как определить, какие изменения включены
Когда изменение поведения включено, оно может повлиять на то, как ваше приложение обращается к API платформы, затронутым этим изменением. Проверить, какие изменения поведения включены, можно в разделе "Для разработчиков", а также с помощью Logcat или команд ADB.
Как определить, какие изменения включены, в настройках для разработчиков
Рисунок 1. "Изменения в совместимости приложений" в настройках для разработчиков.
Вы можете посмотреть, какие изменения включены, и включить или отключить их в настройках для разработчиков на устройстве. Чтобы перейти к этим настройкам, выполните следующие действия:
- Если параметры для разработчиков не включены, включите их.
- Откройте приложение "Настройки" и выберите Система > Дополнительно > Для разработчиков > Изменения совместимости приложений.
Выберите приложение из списка.
Каждое изменение поведения обычно относится к одной из двух следующих категорий:
Изменения, которые затрагивают все приложения, работающие на этой версии 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 16 (уровень API 36)
- Android 15 (уровень API 35)
- Android 14 (уровень API 34)
- Android 13 (уровень API 33)
- Android 12 (уровни API 31 и 32)
- Android 11 (уровень API 30)
Когда нужно переключать изменения
Основная цель тестирования на совместимость – предоставить вам контроль и гибкость при тестировании приложения с новыми версиями Android. В этом разделе описаны некоторые стратегии, которые можно использовать, чтобы определить, когда следует включать или отключать изменения при тестировании и отладке приложения.
Когда следует отключить изменения
Решение о том, когда отключить изменения, обычно зависит от того, управляется ли изменение с помощью targetSDKVersion.
- Изменения включены для всех приложений
Изменения, которые затрагивают все приложения, по умолчанию включены для определенной версии платформы независимо от значения
targetSDKVersionв вашем приложении. Чтобы узнать, затронуто ли оно, запустите его на этой версии платформы.Например, если вы готовитесь к переходу на Android 16 (уровень API 36), вы можете установить приложение на устройство с Android 16 и протестировать его, используя обычные рабочие процессы тестирования. Если в приложении возникнут проблемы, вы сможете отключить изменение, которое их вызывает, и продолжить тестирование.
Эти изменения могут повлиять на все приложения, независимо от
targetSDKVersion, поэтому протестируйте и обновите свое приложение с учетом этих изменений, прежде чем вносить изменения, ограниченныеtargetSDKVersion. Это позволяет убедиться, что после обновления платформы у пользователей не возникнет проблем.Рекомендуем уделить особое внимание тестированию этих изменений, поскольку их нельзя отключить в общедоступной конечной сборке Android. В идеале тестирование следует проводить для каждой версии Android, пока она находится на этапе предварительной версии.
- Изменения, ограниченные
targetSDKVersion Если ваше приложение предназначено для определенной версии
targetSDKVersion, все изменения, связанные с этой версией, включены по умолчанию. Поэтому, когда вы перейдете на новую версиюtargetSDKVersion, на ваше приложение сразу повлияет множество изменений.Поскольку на ваше приложение может повлиять несколько изменений, вам может потребоваться отключить некоторые из них по отдельности во время тестирования и отладки приложения.
Когда включать изменения
Изменения, связанные с определенной версией targetSDKVersion, по умолчанию отключены, если приложение предназначено для более ранней версии SDK.
Обычно при подготовке к переходу на новую targetSdkVersion у вас есть список изменений в поведении, которые необходимо протестировать и отладить в приложении.
Например, вы можете тестировать приложение на совместимость с изменениями платформы, которые будут внедрены в следующей версии targetSdkVersion. Используя настройки для разработчиков или команды ADB, вы можете включать и тестировать каждое изменение по отдельности, а не менять манифест приложения и включать все изменения сразу.
Это позволит вам тестировать изменения по отдельности, а не отлаживать и обновлять сразу несколько частей приложения.
После включения изменения вы можете протестировать и отладить свое приложение, используя обычные рабочие процессы тестирования. Если у вас возникли проблемы, проверьте журналы, чтобы определить причину. Если неясно, вызвана ли проблема изменением платформы, попробуйте отключить это изменение и повторно протестировать эту область приложения.
Как включить или отключить изменения
Тестирование на совместимость позволяет включать и отключать каждое изменение с помощью настроек для разработчиков или команд ADB. Поскольку включение или отключение изменений может привести к сбою приложения или отключению важных изменений безопасности, существуют некоторые ограничения на то, когда вы можете переключать изменения.
Как включить или отключить изменения в параметрах для разработчиков
Чтобы включить или отключить изменения, используйте настройки для разработчиков. Чтобы найти их, выполните следующие действия:
- Если параметры для разработчиков не включены, включите их.
- Откройте приложение "Настройки" и выберите Система > Дополнительно > Для разработчиков > Изменения совместимости приложений.
- Выберите приложение из списка.
- Найдите в списке нужное изменение и нажмите на переключатель.
Как включить или отключить изменения с помощью ADB
Чтобы включить или отключить изменение с помощью ADB, выполните одну из следующих команд:
adb shell am compat enable (CHANGE_ID|CHANGE_NAME) PACKAGE_NAMEadb 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 | Не удается переключить |