Изменения в поведении: приложения, ориентированные на Android 11.

Как и в предыдущих версиях, в Android 11 внесены изменения в поведение, которые могут повлиять на ваше приложение. Следующие изменения в поведении применяются исключительно к приложениям, предназначенным для Android 11 и более поздних версий. Если в вашем приложении для targetSdkVersion задано значение 30 , вам следует изменить его для корректной поддержки этих изменений, где это применимо.

Обязательно ознакомьтесь со списком изменений поведения, которые касаются всех приложений, работающих на Android 11 .

Конфиденциальность

В Android 11 внесены изменения и ограничения для улучшения конфиденциальности пользователей, включая следующие:

Более подробную информацию см. на странице «Конфиденциальность» .

Безопасность

Тегирование указателя кучи

Изменить детали

Изменить имя : NATIVE_HEAP_POINTER_TAGGING

Изменить идентификатор : 135754954

Как переключить

При тестировании совместимости вашего приложения с Android 11 вы можете включить или отключить это изменение с помощью следующих команд ADB:

adb shell am compat enable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME
adb shell am compat disable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME

Дополнительную информацию о фреймворке совместимости и переключении изменений см. в разделе Тестирование и отладка изменений поведения платформы в вашем приложении .

Указатели кучи теперь имеют ненулевой тег в старшем байте (MSB). Приложения, которые неправильно используют указатели, в том числе те, которые изменяют MSB, теперь могут аварийно завершать работу или испытывать другие проблемы. Это изменение необходимо для поддержки будущего оборудования с включённым расширением тегирования памяти ARM (MTE). Подробнее см. в разделе «Тегированные указатели» .

Чтобы отключить эту функцию, см. документацию манифеста allowNativeHeapPointerTagging .

Обновления тостов

Пользовательские тосты из фона заблокированы.

В целях безопасности и для поддержания комфортного пользовательского опыта система блокирует уведомления с пользовательскими представлениями, если эти уведомления отправляются в фоновом режиме приложением, предназначенным для Android 11 или более поздних версий. Обратите внимание, что текстовые уведомления по-прежнему разрешены; это уведомления, созданные с помощью Toast.makeText() и не вызывающие setView() .

Если ваше приложение всё равно попытается опубликовать уведомление с пользовательским представлением в фоновом режиме, система не покажет сообщение пользователю. Вместо этого система запишет в logcat следующее сообщение:

W/NotificationService: Blocking custom toast from package \
  <package> due to package not in the foreground

Обратные вызовы тостов

Если вы хотите получать уведомления о появлении или исчезновении уведомления (текстового или пользовательского), используйте метод addCallback() , который был добавлен в Android 11.

Изменения API текстовых уведомлений

Приложения, предназначенные для Android 11 и выше, видят следующие побочные эффекты для текстовых уведомлений:

  • Метод getView() возвращает null .
  • Возвращаемые значения следующих методов не отражают фактические значения, поэтому вам не следует полагаться на них в своем приложении:
  • Следующие методы не являются операциями, поэтому ваше приложение не должно их использовать:

Связность

Ограниченный доступ на чтение к базе данных APN

Изменить детали

Изменить имя : APN_READING_PERMISSION_CHANGE_ID

Изменить идентификатор : 124107808

Как переключить

При тестировании совместимости вашего приложения с Android 11 вы можете включить или отключить это изменение с помощью следующих команд ADB:

adb shell am compat enable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME
adb shell am compat disable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME

Дополнительную информацию о фреймворке совместимости и переключении изменений см. в разделе Тестирование и отладка изменений поведения платформы в вашем приложении .

Приложениям, ориентированным на Android 11, теперь требуется привилегированное разрешение Manifest.permission.WRITE_APN_SETTINGS для чтения или доступа к базе данных APN поставщика телефонии . Попытка доступа к базе данных APN без этого разрешения приводит к возникновению исключения безопасности.

Доступность

Объявить взаимодействие с движками TTS в файле манифеста

Из-за изменений в видимости пакетов приложения, предназначенные для Android 11 и взаимодействующие с механизмом преобразования текста в речь (TTS), должны добавить следующий элемент <queries> в свои файлы манифеста:

<queries>
  <intent>
    <action
       android:name="android.intent.action.TTS_SERVICE" />
  </intent>
</queries>

Объявить использование кнопки доступности в файле метаданных

Изменить детали

Изменить имя : REQUEST_ACCESSIBILITY_BUTTON_CHANGE

Изменить идентификатор : 136293963

Как переключить

При тестировании совместимости вашего приложения с Android 11 вы можете включить или отключить это изменение с помощью следующих команд ADB:

adb shell am compat enable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME
adb shell am compat disable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME

Дополнительную информацию о фреймворке совместимости и переключении изменений см. в разделе Тестирование и отладка изменений поведения платформы в вашем приложении .

Начиная с Android 11, ваша служба специальных возможностей не может объявлять во время выполнения, что у неё есть связь с кнопкой специальных возможностей системы . Если вы добавляете AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON к свойству flags объекта AccessibilityServiceInfo , фреймворк не передаёт события обратного вызова кнопки специальных возможностей вашей службе.

Чтобы получать события обратного вызова специальных возможностей в вашей службе специальных возможностей, используйте файл метаданных службы специальных возможностей для объявления связи службы с кнопкой специальных возможностей. Включите значение flagRequestAccessibilityButton в определение атрибута accessibilityFlags . Файл метаданных службы специальных возможностей обычно располагается в res/raw/accessibilityservice.xml .

Камера

Для действий в медиа-намерениях требуется системная камера по умолчанию

Начиная с Android 11, только предустановленные системные приложения камеры могут реагировать на следующие действия намерений:

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

Упаковка и установка приложения

Сжатые файлы ресурсов

Изменить детали

Изменить имя : RESOURCES_ARSC_COMPRESSED

Изменить идентификатор : 132742131

Как переключить

При тестировании совместимости вашего приложения с Android 11 вы можете включить или отключить это изменение с помощью следующих команд ADB:

adb shell am compat enable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME
adb shell am compat disable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME

Дополнительную информацию о фреймворке совместимости и переключении изменений см. в разделе Тестирование и отладка изменений поведения платформы в вашем приложении .

Приложения для Android 11 (API уровня 30) и выше не могут быть установлены, если они содержат сжатый файл resources.arsc или если этот файл не выровнен по 4-байтовой границе. Система не может отобразить этот файл в память при наличии любого из этих условий. Таблицы ресурсов, которые невозможно отобразить в память, должны быть считаны в буфер в оперативной памяти, что приводит к ненужной нагрузке на систему и значительному увеличению использования оперативной памяти устройства.

Если ранее вы использовали сжатый файл resources.arsc , попробуйте альтернативные стратегии, такие как сжатие ресурсов приложения или другие методы сжатия, сокрытия и оптимизации вашего приложения .

Теперь требуется схема подписи APK v2

Приложения для Android 11 (API уровня 30), которые в настоящее время подписаны только с помощью схемы подписи APK v1, теперь также должны быть подписаны с помощью схемы подписи APK v2 или выше. Пользователи не смогут устанавливать или обновлять приложения, подписанные только с помощью схемы подписи APK v1, на устройствах под управлением Android 11.

Чтобы проверить, подписано ли ваше приложение с помощью схемы подписи APK версии 2 или выше, вы можете использовать Android Studio или инструмент apksigner в командной строке.

Firebase

Firebase JobDispatcher и GCMNetworkManager

Если ваше приложение ориентировано на API уровня 30 или выше, вызовы API Firebase JobDispatcher и GcmNetworkManager отключены на устройствах под управлением Android 6.0 (уровень API 23) или выше. Сведения о миграции см. в разделах «Миграция с Firebase JobDispatcher на WorkManager» и «Миграция с GCMNetworkManager на WorkManager» .

Распознавание речи

Из-за изменений в видимости пакетов приложения, предназначенные для Android 11 и взаимодействующие со службой распознавания речи, должны добавить следующий элемент <queries> в свои файлы манифеста:

<queries>
  <intent>
    <action
       android:name="android.speech.RecognitionService" />
  </intent>
</queries>

Изменения обратного вызова для OnSharedPreferenceChangeListener

Изменить детали

Изменить имя : CALLBACK_ON_CLEAR_CHANGE

Изменить идентификатор : 119147584

Как переключить

При тестировании совместимости вашего приложения с Android 11 вы можете включить или отключить это изменение с помощью следующих команд ADB:

adb shell am compat enable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME
adb shell am compat disable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME

Дополнительную информацию о фреймворке совместимости и переключении изменений см. в разделе Тестирование и отладка изменений поведения платформы в вашем приложении .

Для приложений, ориентированных на Android 11 (уровень API 30), при каждом вызове Editor.clear теперь выполняется обратный вызов OnSharedPreferenceChangeListener.onSharedPreferenceChanged с ключом null .

Ограничения интерфейса, не входящего в SDK

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

Если ваше приложение не предназначено для Android 11, некоторые из этих изменений могут не сразу вас затронуть. Однако, хотя в настоящее время вы можете использовать некоторые интерфейсы, не относящиеся к SDK ( в зависимости от целевого уровня API вашего приложения ), использование любого метода или поля, не относящегося к SDK, всегда сопряжено с высоким риском выхода приложения из строя.

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

Подробнее об изменениях в этой версии Android см. в разделе Обновления ограничений интерфейсов, не относящихся к SDK, в Android 11. Подробнее об интерфейсах, не относящихся к SDK, в целом см. в разделе Ограничения интерфейсов, не относящихся к SDK .