В 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 по умолчанию используют движок Conscrypt SSL
Реализация SSLSocket по умолчанию в Android основана на Conscrypt.
Начиная с Android 11, эта реализация основана на SSLEngine из Conscrypt.
Scudo Hardened Allocator
В Android 11 для выделения памяти в куче используется Scudo Hardened Allocator. Scudo может обнаруживать и устранять некоторые типы нарушений безопасности памяти. Если в отчетах о сбоях на уровне ОС вы видите сбои, связанные со Scudo (например, Scudo ERROR:), ознакомьтесь с документацией по устранению неполадок со Scudo.
Статистика использования приложений
Чтобы лучше защитить пользователей, Android 11 хранит статистику использования приложений каждым пользователем в хранилище, зашифрованном с помощью учетных данных. Поэтому ни система, ни приложения не могут получить доступ к этим данным, пока метод isUserUnlocked() не вернет значение true. Это происходит в следующих случаях:
- Пользователь впервые разблокирует устройство после запуска системы.
- Пользователь переключается на свой аккаунт на устройстве.
Если ваше приложение уже привязано к экземпляру UsageStatsManager, убедитесь, что вы вызываете методы этого объекта после того, как пользователь разблокирует устройство.
В противном случае API возвращает нулевые или пустые значения.
Поддержка 5G в эмуляторе
В Android 11 добавлены API 5G, которые позволяют внедрять в приложения передовые функции. Чтобы протестировать функции, которые вы добавляете, можно использовать новые возможности эмулятора Android SDK. Новая функциональность была добавлена в Emulator версии 30.0.22. При выборе сети 5G для параметра TelephonyDisplayInfo устанавливается значение OVERRIDE_NETWORK_TYPE_NR_NSA, изменяется расчетная пропускная способность и появляется возможность задать лимитное подключение, чтобы проверить, правильно ли приложение реагирует на изменения статуса NET_CAPABILITY_TEMPORARILY_NOT_METERED.

Производительность и отладка
Отладка ограничений на вызовы JobScheduler API
В Android 11 есть поддержка отладки для приложений, которая позволяет выявлять потенциальные вызовы API JobScheduler, превысившие определенные ограничения частоты запросов.
Разработчики могут использовать эту функцию для выявления потенциальных проблем производительности. Если в манифесте приложения атрибут debuggable имеет значение true, то при вызовах API JobScheduler, превышающих ограничение частоты запросов, будет возвращаться ошибка RESULT_FAILURE.
Ограничения установлены таким образом, чтобы не влиять на законные варианты использования.
Санитайзер дескрипторов файлов (fdsan)
В Android 10 появился fdsan (file descriptor sanitizer).
fdsan обнаруживает неправильное обращение с дескрипторами файлов, например использование после закрытия и двойное закрытие. В Android 11 режим по умолчанию для fdsan изменится. Теперь при обнаружении ошибки 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…
Общая библиотека Maps v1 удалена
Общая библиотека Maps версии 1 полностью удалена в 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", ...).