Изменения в поведении: приложения для 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

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

Указатели кучи теперь имеют ненулевой тег в старшем байте. Приложения, которые неправильно используют указатели, в том числе изменяют старший значащий бит, могут работать со сбоями или другими проблемами. Это изменение необходимо для поддержки будущих устройств с включенным расширением ARM Memory Tagging Extension (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 поставщика Telephony. Попытка получить доступ к базе данных APN без этого разрешения приведет к ошибке безопасности.

Специальные возможности

Объявите о взаимодействии с системами синтеза речи в файле манифеста

Из-за изменений в видимости пакетов приложения, предназначенные для 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, только предустановленные системные приложения камеры могут реагировать на следующие действия intent:

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

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

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

Изменить сведения

Изменить название: 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 версии 2

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

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

Firebase

Firebase JobDispatcher и GCMNetworkManager

Если целевой уровень API вашего приложения – 30 или выше, вызовы API Firebase JobDispatcher и GcmNetworkManager будут отключены на устройствах с Android 6.0 (уровень API 23) или более поздней версией. Информацию о переносе можно найти в статьях Migrating from Firebase JobDispatcher to WorkManager и Migrating from GCMNetworkManager to 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…