Изменения в поведении: все приложения

В 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", ...).