Платформа Android 11 включает изменения поведения, которые могут повлиять на ваше приложение. Следующие изменения поведения применяются ко всем приложениям , работающим на Android 11, независимо от targetSdkVersion
. Вам следует протестировать своё приложение и затем внести необходимые изменения для корректной поддержки этих изменений, где это применимо.
Обязательно ознакомьтесь со списком изменений поведения, которые касаются только приложений, предназначенных для Android 11 .
Конфиденциальность
В Android 11 введены изменения и ограничения для улучшения конфиденциальности пользователей, включая следующие:
- Одноразовые разрешения : дают пользователям возможность предоставлять больше временных разрешений на доступ к местоположению, микрофону и камере.
- Видимость диалогового окна разрешений : повторные отказы в предоставлении разрешения подразумевают «больше не спрашивайте».
- Аудит доступа к данным : получите представление о том, где ваше приложение обращается к личным данным, как в коде вашего приложения, так и в коде зависимых библиотек.
- Разрешения для окна системного оповещения : некоторым классам приложений автоматически предоставляется разрешение
SYSTEM_ALERT_WINDOW
по запросу. Кроме того, намерения, включающие действие намеренияACTION_MANAGE_OVERLAY_PERMISSION
, всегда перенаправляют пользователей на экран в системных настройках. - Постоянные идентификаторы SIM-карт : в Android 11 и более поздних версиях доступ к несбрасываемым ICCID через метод
getIccId()
ограничен. Этот метод возвращает ненулевую пустую строку. Для уникальной идентификации установленной SIM-карты на устройстве используйте методgetSubscriptionId()
. Идентификатор подписки представляет собой индексное значение (начинающееся с 1) для уникальной идентификации установленных SIM-карт, включая физические и электронные. Значение этого идентификатора остается неизменным для данной SIM-карты, пока устройство не будет сброшено до заводских настроек.
Более подробную информацию см. на странице «Конфиденциальность» .
Уведомления о воздействии
Android 11 обновляет платформу с учётом системы уведомлений о воздействии . Теперь пользователи могут запускать приложения с уведомлениями о воздействии на Android 11 без необходимости включать определение местоположения устройства. Это исключение касается только системы уведомлений о воздействии, поскольку она разработана таким образом, что приложения, использующие её, не могут определять местоположение устройства посредством сканирования Bluetooth.
Для защиты конфиденциальности пользователей всем остальным приложениям по-прежнему запрещено выполнять сканирование Bluetooth, если только не включена настройка определения местоположения устройства и пользователь не предоставил им разрешение на определение местоположения. Подробнее об этом можно узнать в нашей публикации «Обновление системы уведомлений о риске инфицирования» .
Безопасность
SSL-сокеты по умолчанию используют SSL-движок Conscrypt.
Реализация SSLSocket
в Android по умолчанию основана на Conscrypt . Начиная с Android 11, эта реализация построена на основе SSLEngine
от Conscrypt.
Scudo Hardened Allocator
В Android 11 используется встроенный аллокатор Scudo Hardened Allocator для обслуживания выделения кучи. Scudo способен обнаруживать и устранять некоторые нарушения безопасности памяти. Если в отчётах о сбоях Scudo вы видите сбои, связанные со Scudo (например, Scudo ERROR:
, обратитесь к документации по устранению неполадок Scudo .
Статистика использования приложения
Для лучшей защиты пользователей Android 11 хранит статистику использования приложений каждым пользователем в зашифрованном хранилище с учётными данными . Таким образом, ни система, ни приложения не смогут получить доступ к этим данным, если только isUserUnlocked()
не вернёт true
, что происходит после одного из следующих событий:
- Пользователь разблокирует свое устройство в первый раз после запуска системы.
- Пользователь переключается на свою учетную запись на устройстве.
Если ваше приложение уже привязано к экземпляру UsageStatsManager
, убедитесь, что вы вызываете методы этого объекта после разблокировки устройства пользователем. В противном случае API будет возвращать значения null или пустые значения.
Поддержка эмулятора 5G
В Android 11 добавлены API 5G , позволяющие вашим приложениям добавлять передовые функции. Для тестирования функций по мере их добавления вы можете использовать новые возможности эмулятора Android SDK . Новая функциональность была добавлена в версии эмулятора 30.0.22. Выбор настройки сети 5G устанавливает для параметра TelephonyDisplayInfo
значение OVERRIDE_NETWORK_TYPE_NR_NSA
, изменяет предполагаемую пропускную способность и позволяет настроить тарифицируемость, чтобы убедиться, что ваше приложение правильно реагирует на изменения статуса NET_CAPABILITY_TEMPORARILY_NOT_METERED
.
Производительность и отладка
Отладка ограничений вызовов API JobScheduler
В Android 11 реализована поддержка отладки приложений для выявления потенциальных вызовов API JobScheduler
, превысивших определённые ограничения. Разработчики могут использовать эту возможность для выявления потенциальных проблем с производительностью. Для приложений с атрибутом манифеста debuggable
, установленным в значение true, вызовы API JobScheduler
, превышающие ограничения, будут возвращать RESULT_FAILURE
. Ограничения установлены таким образом, чтобы не влиять на допустимые сценарии использования.
Санитайзер файловых дескрипторов (fdsan)
В Android 10 появился fdsan
(дезинфектор файловых дескрипторов). fdsan
обнаруживает неправильное обращение с владением файловыми дескрипторами, например, использование после закрытия и двойное закрытие. Режим по умолчанию для fdsan
меняется в Android 11. Теперь fdsan
прерывает работу при обнаружении ошибки; ранее он регистрировал предупреждение и продолжал работу. Если в вашем приложении наблюдаются сбои из-за fdsan
, обратитесь к fdsan documentation
.
Ограничения интерфейса, не входящего в SDK
В Android 11 включены обновлённые списки ограниченных интерфейсов, не входящих в SDK, основанные на результатах сотрудничества с разработчиками Android и последних внутренних тестов. По возможности мы проверяем наличие общедоступных альтернатив, прежде чем ограничивать интерфейсы, не входящие в SDK.
Если ваше приложение не предназначено для Android 11, некоторые из этих изменений могут не сразу вас затронуть. Однако, хотя в настоящее время вы можете использовать некоторые интерфейсы, не относящиеся к SDK ( в зависимости от целевого уровня API вашего приложения ), использование любого метода или поля, не относящегося к SDK, всегда сопряжено с высоким риском выхода приложения из строя.
Если вы не уверены, использует ли ваше приложение интерфейсы, не относящиеся к SDK, вы можете протестировать его , чтобы выяснить это. Если ваше приложение использует интерфейсы, не относящиеся к SDK, вам следует начать планировать миграцию на альтернативы SDK. Тем не менее, мы понимаем, что в некоторых приложениях есть обоснованные примеры использования интерфейсов, не относящихся к SDK. Если вы не можете найти альтернативу использованию интерфейса, не относящегося к SDK, для какой-либо функции вашего приложения, вам следует запросить новый публичный API .
Подробнее об изменениях в этой версии Android см. в разделе Обновления ограничений интерфейсов, не относящихся к SDK, в Android 11. Подробнее об интерфейсах, не относящихся к SDK, в целом см. в разделе Ограничения интерфейсов, не относящихся к SDK .
Удалена общая библиотека Maps v1
Первая версия общей библиотеки Карт была полностью удалена в Android 11. Ранее эта библиотека была объявлена устаревшей и перестала функционировать для приложений в Android 10. Приложения, которые ранее использовали эту общую библиотеку для устройств под управлением Android 9 (уровень API 28) или ниже, должны вместо этого использовать Maps SDK для Android .
Взаимодействие с другими приложениями
URI общего доступа к контенту
Если ваше приложение использует общий URI контента с другим приложением, намерение должно предоставить разрешения на доступ к URI , установив хотя бы один из следующих флагов намерения: FLAG_GRANT_READ_URI_PERMISSION
и FLAG_GRANT_WRITE_URI_PERMISSION
. Таким образом, если другое приложение предназначено для Android 11, оно по-прежнему сможет получить доступ к URI контента. Ваше приложение должно включать флаги намерения, даже если URI контента связан с поставщиком контента, которым ваше приложение не владеет.
Если ваше приложение владеет поставщиком контента, связанным с URI контента, убедитесь, что поставщик контента не экспортирован . Мы уже рекомендуем эту передовую практику безопасности.
Загрузка библиотеки
Загрузка общей библиотеки ICU по абсолютному пути
Приложения, ориентированные на API 28 и ниже, не могут использовать dlopen(3)
для загрузки libicuuc
по абсолютному пути "/system/lib/libicuuc.so". Для таких приложений dlopen("/system/lib/libicuuc.so", ...)
вернёт нулевой дескриптор.
Вместо этого, чтобы загрузить библиотеку, используйте имя библиотеки в качестве имени файла, например dlopen("libicuuc.so", ...)
.