Изменения в поведении: приложения, ориентированные на 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 Memory Tagging Extension (MTE). Чтобы узнать больше, см. Tagged Pointers .

Чтобы отключить эту функцию, см. документацию манифеста 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 Signature Scheme v1, теперь должны быть подписаны с помощью APK Signature Scheme v2 или выше. Пользователи не могут устанавливать или обновлять приложения, подписанные только с помощью APK Signature Scheme v1, на устройствах под управлением Android 11.

Чтобы убедиться, что ваше приложение подписано с помощью схемы подписи APK v2 или выше, вы можете использовать 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 .