Как и предыдущие выпуски, 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). Приложения, которые неправильно используют указатели, в том числе те, которые изменяют старший бит, теперь могут аварийно завершить работу или столкнуться с другими проблемами. Это изменение необходимо для поддержки будущего оборудования с включенным расширением маркировки памяти 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, только предустановленные приложения системной камеры могут реагировать на следующие действия:
-
android.media.action.VIDEO_CAPTURE
-
android.media.action.IMAGE_CAPTURE
-
android.media.action.IMAGE_CAPTURE_SECURE
Если доступно более одного предустановленного приложения системной камеры, система отображает диалоговое окно, в котором пользователь может выбрать приложение. Если вы хотите, чтобы ваше приложение использовало определенное стороннее приложение камеры для захвата изображений или видео от его имени, вы можете явно указать эти намерения, указав имя пакета или компонент для намерения.
Упаковка и установка приложения
Сжатые файлы ресурсов
Изменить детали
Имя изменения : 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 Signature Scheme v1, на устройствах под управлением Android 11.
Чтобы убедиться, что ваше приложение подписано с помощью схемы подписи APK v2 или более поздней версии, вы можете использовать Android Studio или инструмент apksigner
в командной строке.
Огневая база
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 .