Платформа 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 обновляет платформу с учетом Exposure Notifications System . Теперь пользователи могут запускать приложения Exposure Notifications на Android 11 без необходимости включать настройку местоположения устройства. Это исключение только для Exposure Notifications System, учитывая, что она была разработана таким образом, что приложения, использующие ее, не могут определять местоположение устройства посредством сканирования Bluetooth.
Для защиты конфиденциальности пользователя всем другим приложениям по-прежнему запрещено выполнять сканирование Bluetooth, если только настройка определения местоположения устройства не включена и пользователь не предоставил им разрешение на определение местоположения. Подробнее можно прочитать в нашей публикации Update on Exposure Notifications .
Безопасность
Сокеты SSL по умолчанию используют механизм Conscrypt SSL.
Реализация SSLSocket
в Android по умолчанию основана на Conscrypt . Начиная с Android 11, эта реализация внутренне построена поверх SSLEngine
от Conscrypt .
Scudo Hardened Распределитель
Android 11 использует Scudo Hardened Allocator для обслуживания выделений кучи. Scudo способен обнаруживать и смягчать некоторые типы нарушений безопасности памяти. Если вы видите сбои, связанные со Scudo (например, Scudo ERROR:
) в собственных отчетах о сбоях, обратитесь к документации по устранению неполадок Scudo .
Статистика использования приложения
Для лучшей защиты пользователей Android 11 сохраняет статистику использования приложений каждого пользователя в зашифрованном хранилище учетных данных . Таким образом, ни система, ни какие-либо приложения не могут получить доступ к этим данным, если только isUserUnlocked()
не возвращает true
, что происходит после одного из следующих событий:
- Пользователь впервые разблокирует свое устройство после запуска системы.
- Пользователь переключается на свою учетную запись на устройстве.
Если ваше приложение уже привязывается к экземпляру UsageStatsManager
, проверьте, что вы вызываете методы этого объекта после того, как пользователь разблокирует свое устройство. В противном случае API теперь возвращает null или пустые значения.
Поддержка эмулятора для 5G
Android 11 добавляет 5G API , чтобы ваши приложения могли добавлять передовые функции. Чтобы протестировать функции по мере их добавления, вы можете использовать новые возможности эмулятора 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 удалена
Версия 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", ...)
.