В Android 11 представлены замечательные новые функции и API для разработчиков. Разделы ниже помогут вам узнать о функциях ваших приложений и начать работу с соответствующими API.
Подробный список новых, измененных и удаленных API можно найти в отчете о различиях API . Подробную информацию о новых API см. в справочнике по API Android — новые API выделены для наглядности. Кроме того, чтобы узнать об областях, в которых изменения платформы могут повлиять на ваши приложения, обязательно ознакомьтесь с изменениями в поведении Android 11 для приложений, ориентированных на Android R , и для всех приложений , а также с изменениями конфиденциальности .
Новые впечатления
Элементы управления устройством
Android 11 включает новый API ControlsProviderService
, который можно использовать для предоставления элементов управления подключенным внешним устройствам. Эти элементы управления отображаются в разделе «Элементы управления устройством» в меню питания Android. Дополнительную информацию см. в разделе Управление внешними устройствами .
Средства управления медиа
В Android 11 обновлен способ отображения элементов управления мультимедиа. Элементы управления мультимедиа отображаются рядом с быстрыми настройками. Сеансы из нескольких приложений организованы в пролистываемую карусель, которая включает потоки, воспроизводимые локально на телефоне, удаленные потоки, например обнаруженные на внешних устройствах или сеансах трансляции, а также предыдущие возобновляемые сеансы в том порядке, в котором они воспроизводились в последний раз.
Пользователи могут перезапустить предыдущие сеансы из карусели, не запуская приложение. Когда начинается воспроизведение, пользователь взаимодействует с элементами управления мультимедиа обычным способом.
Для получения дополнительной информации см. элементы управления мультимедиа .
Экраны
Улучшенная поддержка отображения водопада.
Android 11 предоставляет несколько API для поддержки каскадных дисплеев — дисплеев, которые обтекают края устройства. Эти дисплеи рассматриваются как вариант дисплеев с вырезами для дисплея. Существующие методы DisplayCutout
.getSafeInset…()
теперь возвращают безопасную вставку, чтобы избежать областей водопада, а также вырезов. Чтобы отобразить контент вашего приложения в области водопада, выполните следующие действия:
Вызовите
DisplayCutout.getWaterfallInsets()
чтобы получить точные размеры вставки водопада.Установите для атрибута макета окна
layoutInDisplayCutoutMode
значениеLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
, чтобы позволить окну расширяться до областей выреза и каскада на всех краях экрана. Вы должны убедиться, что никакой важный контент не находится в области вырезов или водопада.
Датчик угла поворота петли и складные элементы
Android 11 позволяет приложениям, работающим на устройствах с шарнирными конфигурациями экрана, определять угол шарнира, предоставляя новый датчик с TYPE_HINGE_ANGLE
и новый SensorEvent
, который может отслеживать угол шарнира и обеспечивает измерение в градусах между двумя целыми числами. части устройства. Вы можете использовать эти необработанные измерения для создания детальной анимации по мере того, как пользователь манипулирует устройством.
См. Складные устройства .
Разговоры
Улучшения разговора
В Android 11 внесен ряд улучшений в обработку разговоров . Разговоры — это двунаправленное общение в реальном времени между двумя или более людьми. Этим разговорам уделяется особое внимание, и у пользователей появляется несколько новых возможностей взаимодействия с ними.
Дополнительные сведения о беседах и о том, как ваше приложение может их поддерживать, см. в разделе Люди и беседы .
Чат-пузыри
Теперь разработчикам доступны пузырьки , которые помогают отображать диалоги в системе. Bubbles — это экспериментальная функция в Android 10, которая была включена с помощью опции разработчика; в Android 11 в этом больше нет необходимости.
Если приложение предназначено для Android 11 (уровень API 30) или выше, его уведомления не отображаются в виде пузырьков, если они не соответствуют новым требованиям к диалогу . В частности, уведомление должно быть связано с ярлыком.
До Android 11, если вы хотели, чтобы уведомление отображалось в виде пузырьков, вам нужно было явно указать, что уведомление всегда должно запускаться в режиме пользовательского интерфейса документа. Начиная с Android 11, вам больше не нужно явно задавать этот параметр; если уведомление всплывает, платформа автоматически устанавливает уведомление так, чтобы оно всегда запускалось в режиме пользовательского интерфейса документа.
Внесен ряд улучшений в производительность пузырьков, и пользователи получают больше гибкости при включении и отключении пузырьков в каждом приложении. Для разработчиков, реализовавших экспериментальную поддержку, в API-интерфейсах Android 11 есть несколько изменений:
- Конструктор
BubbleMetadata.Builder()
без параметров устарел. Вместо этого используйте любой из двух новых конструкторовBubbleMetadata.Builder(PendingIntent, Icon)
илиBubbleMetadata.Builder(String)
. - Создайте
BubbleMetadata
из идентификатора ярлыка, вызвавBubbleMetadata.Builder(String)
. Передаваемая строка должна соответствовать идентификатору ярлыка, предоставленномуNotification.Builder
. - Создайте пузырьковые значки с помощью
Icon.createWithContentUri()
или с помощью нового методаcreateWithAdaptiveBitmapContentUri()
.
Визуальные индикаторы 5G
Информацию об отображении индикаторов 5G на устройствах пользователей см. в разделе «Сообщайте пользователям, когда они используют 5G» .
Конфиденциальность
В Android 11 представлено большое количество изменений и ограничений для повышения конфиденциальности пользователей. Чтобы узнать больше, посетите страницу Конфиденциальность .
Безопасность
Обновления биометрической аутентификации
Чтобы помочь вам контролировать уровень безопасности данных вашего приложения, Android 11 предлагает несколько улучшений биометрической аутентификации. Эти изменения также появляются в биометрической библиотеке Jetpack .
Типы аутентификации
В Android 11 представлен интерфейс BiometricManager.Authenticators
, который можно использовать для объявления типов аутентификации, поддерживаемых вашим приложением .
Определите, какой тип аутентификации использовался
После аутентификации пользователя вы можете проверить, прошел ли пользователь аутентификацию с использованием учетных данных устройства или биометрических учетных данных, вызвав getAuthenticationType()
.
Дополнительная поддержка ключей аутентификации по мере использования.
Android 11 обеспечивает дополнительную поддержку аутентификации с использованием ключей авторизации по мере использования .
Устаревшие методы
В Android 11 исключены следующие методы:
- Метод
setDeviceCredentialAllowed()
. - Метод
setUserAuthenticationValidityDurationSeconds()
. - Перегруженная версия
canAuthenticate()
, не принимающая аргументов.
Безопасный обмен большими наборами данных
В некоторых ситуациях, например, связанных с машинным обучением или воспроизведением мультимедиа, вашему приложению может потребоваться использовать тот же большой набор данных, что и другому приложению. В предыдущих версиях Android вашему приложению и другому приложению приходилось загружать отдельные копии одного и того же набора данных.
Чтобы уменьшить избыточность данных как в сети, так и на диске, Android 11 позволяет кэшировать эти большие наборы данных на устройстве с помощью общих блоков данных . Дополнительную информацию о совместном использовании наборов данных см. в подробном руководстве по совместному использованию больших наборов данных .
Выполнить шифрование файлов после перезапуска OTA без учетных данных пользователя.
После того как устройство завершит OTA-обновление и перезапустится, ключи шифрования учетных данных (CE), помещенные в хранилище, защищенное учетными данными, сразу же станут доступны для операций шифрования на основе файлов (FBE) . Это означает, что после OTA-обновления ваше приложение может возобновить операции, для которых требуются ключи CE, прежде чем пользователь введет свой PIN-код, шаблон или пароль.
Производительность и качество
Беспроводная отладка
Android 11 поддерживает развертывание и отладку вашего приложения по беспроводной сети с вашей рабочей станции через Android Debug Bridge (adb). Например, вы можете развернуть отлаживаемое приложение на нескольких удаленных устройствах, не подключая его физически через USB и не сталкиваясь с распространенными проблемами USB-подключения, такими как установка драйвера. Дополнительную информацию см. в разделе Запуск приложений на аппаратном устройстве .
Инкрементальная установка APK ADB
Установка больших APK-файлов (более 2 ГБ) на устройство может занять много времени, даже если в приложение внесены лишь небольшие изменения. Дополнительная установка APK ADB (Android Debug Bridge) ускоряет этот процесс, устанавливая достаточное количество APK для запуска приложения, одновременно передавая оставшиеся данные в фоновом режиме. adb install
будет использовать эту функцию автоматически, если она поддерживается устройством и у вас установлена последняя версия SDK Platform-Tools . Если он не поддерживается, используется метод установки по умолчанию.
Используйте следующую команду adb, чтобы использовать эту функцию. Если устройство не поддерживает добавочную установку, команда завершится неудачно и выведет подробное объяснение.
adb install --incremental
Прежде чем запускать инкрементальную установку APK ADB, вы должны подписать свой APK и создать файл схемы подписи APK v4 . Для работы этой функции файл подписи v4 должен быть размещен рядом с APK.
Обнаружение ошибок с использованием встроенного распределителя памяти
GWP-ASan — это встроенная функция распределения памяти, которая помогает находить ошибки использования после освобождения и переполнения буфера кучи. Вы можете включить эту функцию глобально или для определенных подпроцессов вашего приложения. Дополнительную информацию см. в руководстве GWP-Asan .
API нейронных сетей 1.3
Android 11 расширяет и улучшает API нейронных сетей (NNAPI) .
Новые операции
В NNAPI 1.3 представлен новый тип операнда TENSOR_QUANT8_ASYMM_SIGNED
для поддержки новой схемы квантования TensorFlow Lite .
Кроме того, в NNAPI 1.3 представлены следующие новые операции:
-
QUANTIZED_LSTM
-
IF
-
WHILE
-
ELU
-
HARD_SWISH
-
FILL
-
RANK
Новые элементы управления машинным обучением
В NNAPI 1.3 представлены новые элементы управления, которые помогают машинному обучению работать бесперебойно:
QoS API: новый API качества обслуживания включает поддержку определения приоритетов и сроков выполнения задач в NNAPI со следующими новыми функциями:
Ввод/вывод домена памяти: NNAPI 1.3 включает поддержку доменов памяти в качестве ввода и вывода для выполнения. Это удаляет ненужные копии одних и тех же данных среди различных компонентов системы, улучшая производительность нейронных сетей Android во время выполнения. Эта функция добавляет набор новых API-интерфейсов NDK для использования с объектами
ANeuralNetworksMemoryDesc
иANeuralNetworkMemory
, включая следующие функции:-
ANeuralNetworksMemoryDesc_create()
-
ANeuralNetworksMemoryDesc_free()
-
ANeuralNetworksMemoryDesc_addInputRole()
-
ANeuralNetworksMemoryDesc_addOutputRole()
-
ANeuralNetworksMemoryDesc_setDimensions()
-
ANeuralNetworksMemoryDesc_finish()
-
ANeuralNetworksMemory_createFromDesc()
-
ANeuralNetworksMemory_copy()
Дополнительные сведения см. в примере домена памяти нейронной сети .
-
Поддержка API зависимостей и ограничения синхронизации: NNAPI 1.3 включает поддержку асинхронных вычислений с зависимостями, что позволяет значительно снизить накладные расходы при вызове небольших цепочек моделей. Эта функция добавляет следующие новые функции:
Поток управления: NNAPI 1.3 включает поддержку общего потока управления с помощью новых графических операций
ANEURALNETWORKS_IF
иANEURALNETWORKS_WHILE
, которые принимают другие модели в качестве аргументов, используя новый тип операндаANEURALNETWORKS_MODEL
. Кроме того, эта функция добавляет следующие новые функции:
Термальный API НДК
Когда устройства перегреваются, они могут замедлить работу процессора и/или графического процессора, и это может неожиданным образом повлиять на приложения. Приложения или игры, включающие сложную графику, тяжелые вычисления или постоянную сетевую активность, чаще сталкиваются с проблемами.
Используйте NDK Thermal API в Android 11, чтобы отслеживать изменения температуры на устройстве, а затем принимать меры для поддержания более низкого энергопотребления и более низкой температуры устройства. Этот API похож на Java Thermal API ; вы можете использовать его для получения уведомлений о любых изменениях теплового статуса или для непосредственного опроса текущего статуса.
Текст и ввод
Улучшенные переходы IME.
В Android 11 представлены новые API для улучшения переходов для редакторов методов ввода (IME), таких как экранные клавиатуры. Эти API-интерфейсы упрощают настройку содержимого вашего приложения синхронно с появлением и исчезновением IME, а также с другими элементами, такими как панели состояния и навигации.
Чтобы отобразить IME, когда любой EditText
находится в фокусе, вызовите view.getInsetsController(). show(Type.ime())
. (Вы можете вызвать этот метод для любого представления в той же иерархии, что и выделенный EditText
, вам не обязательно вызывать его специально для EditText
.) Чтобы скрыть IME, вызовите view.getInsetsController(). hide(Type.ime())
. Вы можете проверить, виден ли IME в данный момент, вызвав view.getRootWindowInsets(). isVisible(Type.ime())
.
Чтобы синхронизировать представления вашего приложения с появлением и исчезновением IME, настройте прослушиватель для представления, предоставив WindowInsetsAnimation.Callback
для View.setWindowInsetsAnimationCallback()
. (Вы можете установить этот прослушиватель для любого представления, это не обязательно должен быть EditText
.) IME вызывает метод onPrepare()
вашего прослушивателя, а затем вызывает onStart()
в начале перехода. Затем он вызывает onProgress()
на каждом этапе перехода. По завершении перехода IME вызывает onEnd()
. В любой момент перехода вы можете узнать, насколько продвинулся переход, вызвав WindowInsetsAnimation.getFraction()
.
Пример использования этих API см. в новом примере кода WindowInsetsAnimation .
Управление анимацией IME
Вы также можете управлять анимацией IME или анимацией другой системной панели, например панели навигации. Для этого сначала вызовите setOnApplyWindowInsetsListener()
, чтобы установить новый прослушиватель для изменений вставки окна:
Котлин
rootView.setOnApplyWindowInsetsListener { rootView, windowInsets -> val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime()) rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom) // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. WindowInsets.CONSUMED }
Ява
mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime()); mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom); // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. return WindowInsets.CONSUMED; } });
Чтобы переместить IME или другую системную панель, вызовите метод контроллера controlWindowInsetsAnimation()
:
Котлин
view.windowInsetsController.controlWindowInsetsAnimation( Type.ime(), 1000, LinearInterpolator(), cancellationSignal, object : WindowInsetsAnimationControlListener() { fun onReady(controller: WindowInsetsAnimationController, types: Int) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */) } } );
Ява
mRoot.getWindowInsetsController().controlWindowInsetsAnimation( Type.ime(), 1000, new LinearInterpolator(), cancellationSignal, new WindowInsetsAnimationControlListener() { @Override public void onReady( @NonNull WindowInsetsAnimationController controller, int types ) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */); } @Override public void onCancelled() {} });
Обновления библиотек ICU
Android 11 обновляет пакет android.icu
для использования версии 66 библиотеки ICU по сравнению с версией 63 в Android 10. Новая версия библиотеки включает обновленные данные локали CLDR и ряд улучшений поддержки интернационализации в Android.
Заметные изменения в новых версиях библиотеки включают следующее:
- Многие API форматирования теперь поддерживают новый тип возвращаемого объекта, который расширяет
FormattedValue
. - API
LocaleMatcher
расширен за счет класса компоновщика, поддержки типаjava.util.Locale
и класса результатов, содержащего дополнительные данные о совпадении. - Юникод 13 теперь поддерживается.
СМИ
Выделение буферов MediaCodec
Android 11 включает в себя новые API-интерфейсы MediaCodec
, которые дают приложениям больше контроля при распределении входных и выходных буферов. Это позволяет вашему приложению более эффективно управлять памятью.
Новые классы:
Новые методы:
-
MediaCodec.getQueueRequest()
-
MediaCodec.getOutputFrame()
-
MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
Кроме того, изменилось поведение двух методов MediaCodec.Callback()
:
-
onInputBufferAvailable()
- Вместо вызова
MediaCodec.getInputBuffer()
иMediaCodec.queueInputBuffer()
с индексом, если оно настроено на использование API блочной модели, приложения должны использоватьMediaCodec.getQueueRequest
с индексом, присоединяя к слоту LinearBlock/HardwareBuffer. -
onOutputBufferAvailable()
- Вместо вызова
MediaCodec.getOutputBuffer()
с индексом приложения могут использоватьMediaCodec.getOutputFrame()
с индексом, чтобы получить объектOutputFrame
с дополнительной информацией и буферами LinearBlock/HardwareBuffer.
Декодирование с малой задержкой в MediaCodec
В Android 11 MediaCodec
улучшен для поддержки декодирования с малой задержкой для игр и других приложений реального времени. Вы можете проверить, поддерживает ли кодек декодирование с малой задержкой, передав FEATURE_LowLatency
в MediaCodecInfo.CodecCapabilities.isFeatureSupported()
.
Чтобы включить или выключить декодирование с малой задержкой, выполните одно из следующих действий:
- Установите для нового ключа
KEY_LOW_LATENCY
значение 0 или 1 с помощьюMediaCodec.configure()
. - Установите для нового ключа параметра
PARAMETER_KEY_LOW_LATENCY
значение 0 или 1 с помощьюMediaCodec.setParameters()
.
Новая функция AAudio AAudioStream_release()
Функция AAudioStream_close()
одновременно освобождает и закрывает аудиопоток. Это может быть опасно. Если другой процесс попытается получить доступ к потоку после его закрытия, процесс выйдет из строя.
Новая функция AAudioStream_release()
освобождает поток, но не закрывает его. Это освобождает его ресурсы и оставляет поток в известном состоянии. Объект сохраняется до тех пор, пока вы не вызовете AAudioStream_close()
.
МедиаПарсер API
MediaParser — это новый низкоуровневый API для извлечения мультимедиа. Он более гибок, чем MediaExtractor , и обеспечивает дополнительный контроль над функциями извлечения мультимедиа.
Захват звука с USB-устройства
Когда приложение без разрешения RECORD_AUDIO
использует UsbManager
для запроса прямого доступа к аудиоустройству USB с возможностью захвата звука (например, USB-гарнитуре), появляется новое предупреждающее сообщение с просьбой подтвердить разрешение на использование устройства. Система игнорирует любой вариант «всегда использовать», поэтому пользователь должен подтвердить предупреждение и предоставить разрешение каждый раз, когда приложение запрашивает доступ.
Чтобы избежать такого поведения, ваше приложение должно запросить разрешение RECORD_AUDIO
.
Одновременный доступ к микрофону
В Android 11 добавлены новые методы в API AudioRecord
, MediaRecorder
и AAudioStream
. Эти методы включают и отключают возможность одновременного захвата независимо от выбранного варианта использования. См. раздел «Совместное использование аудиовхода» .
Выходной переключатель
В Android 11 реализовано новое поведение для приложений, использующих API-интерфейсы cast и mediarouter.
Помимо доступа к параметрам кастинга из приложения, параметры переключения также отображаются в системном медиаплеере. Это помогает пользователю беспрепятственно перемещаться между устройствами, когда они меняют контексты просмотра и прослушивания, например, просмотр видео на кухне по сравнению с телефоном или прослушивание звука дома или в машине. См. выходной переключатель .
Возможности подключения
Улучшения точки доступа Wi-Fi
Информацию о возможностях Passpoint, добавленных в Android 11, см. в разделе Passpoint .
Расширен API предложений Wi-Fi.
В Android 11 расширен API предложений Wi-Fi, чтобы расширить возможности управления сетью вашего приложения, включая следующие:
- Приложения для управления подключением могут управлять своими сетями, разрешая запросы на отключение.
- Сети точек доступа интегрированы в API предложений и могут быть предложены пользователю.
- API-интерфейсы аналитики позволяют вам получать информацию о качестве ваших сетей.
Обновления службы CallScreeningService
Начиная с Android 11, CallScreeningService может запрашивать информацию о статусе проверки STIR/SHAKEN (verstat) для входящих вызовов. Эта информация предоставляется как часть сведений о входящих вызовах.
Если CallScreeningService
имеет разрешение READ_CONTACTS
, приложение уведомляется о входящих или исходящих вызовах с номера в контактах пользователя.
Дополнительные сведения см. в разделе Предотвращение подмены идентификатора вызывающего абонента .
Открыть обновления мобильного API
Информацию о поддержке OMAPI в Android 11 и более поздних версиях см. в разделе Поддержка чтения Open Mobile API .
Производительные VPN
Приложения, ориентированные на уровень API 30 и выше или работающие на устройствах, запущенных на уровне API 29 и выше, могут применять IKEv2/IPsec к VPN как для VPN, настраиваемых пользователем, так и для VPN на основе приложений.
VPN работают как встроенные в операционную систему, что упрощает код, необходимый для установки VPN-подключений IKEv2/IPsec в приложении.
Попроцессный контроль доступа к сети
Информацию о включении доступа к сети для каждого процесса см. в разделе Управление использованием сети .
Разрешить несколько установленных конфигураций Passpoint с одним и тем же полным доменным именем.
Начиная с Android 11, вы можете использовать PasspointConfiguration.getUniqueId()
для получения уникального идентификатора объекта PasspointConfiguration
, который позволяет пользователям вашего приложения устанавливать несколько профилей с одним и тем же полным доменным именем (FQDN).
Эта функция полезна, когда оператор развертывает в своей сети более одной комбинации мобильного кода страны (MCC) и кода мобильной сети (MNC), но имеет только одно полное доменное имя. В Android 11 и более поздних версиях можно установить несколько профилей с одним и тем же полным доменным именем, которое будет соответствовать сети домашнего провайдера, когда пользователь устанавливает SIM-карту с MCC или MNC.
Поддержка антенны ГНСС
В Android 11 представлен класс GnssAntennaInfo
, который позволяет вашему приложению более эффективно использовать позиционирование с точностью до сантиметра, которое может обеспечить Глобальная навигационная спутниковая система (GNSS).
Подробную информацию о калибровке антенны можно найти в руководстве.
Графика
декодер изображений NDK
API NDK ImageDecoder
предоставляет стандартный API для приложений Android C/C++ для прямого декодирования изображений. Разработчикам приложений больше не нужно использовать API-интерфейсы платформы (через JNI) или связывать сторонние библиотеки декодирования изображений. Дополнительные сведения см. в руководстве разработчика декодера изображений .
API частоты кадров
Android 11 предоставляет API, который позволяет приложениям сообщать системе предполагаемую частоту кадров, чтобы уменьшить дрожание на устройствах, поддерживающих несколько частот обновления. Информацию о том, как использовать этот API, см. в руководстве по частоте кадров .
Запрос и проверка поддержки низкой задержки
Некоторые дисплеи, например некоторые внешние дисплеи и телевизоры, могут выполнять постобработку графики. Эта постобработка улучшает графику, но может увеличить задержку. Новые дисплеи, поддерживающие HDMI 2.1, имеют автоматический режим низкой задержки ( ALLM , также известный как игровой режим ), который минимизирует задержку за счет отключения постобработки. Более подробную информацию о ALLM см. в спецификации HDMI 2.1 .
Окно может запросить использование автоматического режима низкой задержки, если он доступен. ALLM особенно полезен для таких приложений, как игры и видеоконференции, где низкая задержка важнее, чем наилучшая графика.
Чтобы включить или выключить минимальную постобработку, вызовите Window.setPreferMinimalPostProcessing()
или установите для атрибута preferMinimalPostProcessing
окна значение true
. Не все дисплеи поддерживают минимальную постобработку; чтобы узнать, поддерживает ли его конкретный дисплей, вызовите новый метод Display.isMinimalPostProcessingSupported()
.
Высокопроизводительное внедрение слоя отладки графики
Приложения теперь могут загружать внешние графические слои ( GLES , Vulkan ) в собственный код приложения, чтобы предоставлять ту же функциональность, что и отлаживаемое приложение, но без снижения производительности. Эта функция особенно важна при профилировании вашего приложения с помощью таких инструментов, как GAPID . Чтобы профилировать свое приложение, включите следующий элемент метаданных в файл манифеста приложения вместо того, чтобы делать приложение доступным для отладки:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
Изображения и камера
Отключение звуков уведомлений и вибрации во время активной съемки
Начиная с Android 11, при активном использовании камеры ваше приложение может отключать только вибрацию (как звуки, так и вибрацию) или ни то, ни другое с помощью setCameraAudioRestriction()
.
Расширенная поддержка камеры в эмуляторе Android.
Информацию о расширенной поддержке камер в эмуляторе, начиная с Android 11, см. в разделе Поддержка камер .
Поддержка одновременного использования более чем одной камеры.
В Android 11 добавлены API-интерфейсы для запроса поддержки одновременного использования нескольких камер, включая как фронтальную, так и заднюю камеру.
Чтобы проверить поддержку на устройстве, на котором работает ваше приложение, используйте следующие методы:
-
getConcurrentCameraIds()
возвращаетSet
комбинаций идентификаторов камер, которые могут осуществлять потоковую передачу одновременно с гарантированными комбинациями потоков, если они настроены одним и тем же процессом приложения. -
isConcurrentSessionConfigurationSupported()
запрашивает, могут ли устройства камеры одновременно поддерживать соответствующие конфигурации сеанса.
Улучшенная поддержка изображений HEIF с несколькими кадрами.
Начиная с Android 11, если вы вызываете ImageDecoder.decodeDrawable()
и передаете изображение HEIF, содержащее последовательность кадров (например, анимацию или серийную фотографию), метод возвращает AnimatedImageDrawable
, содержащий всю последовательность изображений. В более ранних версиях Android метод возвращал BitmapDrawable
только из одного кадра.
Если изображение HEIF содержит несколько кадров, которые не находятся в последовательности, вы можете получить отдельный кадр, вызвав MediaMetadataRetriever.getImageAtIndex()
.
Доступность
Обновления для разработчиков служб доступности
Если вы создадите собственную службу специальных возможностей, вы сможете использовать следующие функции Android 11:
- Объяснение службы специальных возможностей, ориентированное на пользователя, теперь позволяет использовать HTML и изображения в дополнение к простому тексту. Такая гибкость позволяет объяснить конечным пользователям, что делает ваш сервис и как он может им помочь.
- Чтобы работать с описанием состояния элемента пользовательского интерфейса, которое более семантически значимо, чем
contentDescription
, вызовите методgetStateDescription()
. - Чтобы запросить, чтобы события касания обходили обозреватель касаний системы, вызовите
setTouchExplorationPassthroughRegion()
. Аналогично, чтобы запросить, чтобы жесты обходили системный детектор жестов, вызовитеsetGestureDetectionPassthroughRegion()
. - Вы можете запросить действия IME, такие как «ввод» и «далее», а также снимки экрана окон, в которых не включен флаг
FLAG_SECURE
.
Дополнительные возможности
Причины завершения процесса приложения
В Android 11 представлен метод ActivityManager.getHistoricalProcessExitReasons()
, который сообщает о причинах недавнего завершения процессов. Приложения могут использовать этот метод для сбора диагностической информации о сбоях, например о том, вызвано ли завершение процесса ошибками ANR, проблемами с памятью или другими причинами. Кроме того, вы можете использовать новый метод setProcessStateSummary()
для хранения информации о пользовательском состоянии для последующего анализа.
Метод getHistoricalProcessExitReasons()
возвращает экземпляры класса ApplicationExitInfo
, который содержит информацию, связанную с завершением процесса приложения. Вызвав getReason()
для экземпляра этого класса, вы можете определить, почему процесс вашего приложения был остановлен. Например, возвращаемое значение REASON_CRASH
указывает на то, что в вашем приложении произошло необработанное исключение. Если вашему приложению необходимо обеспечить уникальность событий выхода, оно может поддерживать идентификатор, специфичный для приложения, например хэш-значение, основанное на метке времени из метода getTimestamp()
.
Дополнительные ресурсы
Для получения дополнительной информации прочитайте статью о новых инструментах Android 11, которые сделают приложения более конфиденциальными и стабильными на Medium.
Загрузчики ресурсов
В Android 11 представлен новый API, который позволяет приложениям динамически расширять возможности поиска и загрузки ресурсов. Новые классы API ResourcesLoader
и ResourcesProvider
в первую очередь отвечают за предоставление новой функциональности. Вместе они предоставляют возможность предоставлять дополнительные ресурсы и активы или изменять стоимость существующих ресурсов и активов.
Объекты ResourcesLoader
— это контейнеры, которые предоставляют объекты ResourcesProvider
экземпляру Resources
приложения. В свою очередь, объекты ResourcesProvider
предоставляют методы для загрузки данных ресурсов из APK и таблиц ресурсов.
Одним из основных вариантов использования этого API является загрузка пользовательских ресурсов. Вы можете использовать loadFromDirectory()
для создания ResourcesProvider
, который перенаправляет разрешение файловых ресурсов и активов, заставляя его искать в определенном каталоге, а не в APK приложения. Вы можете получить доступ к этим ресурсам через семейство методов open()
из класса API AssetManager
, как и к активам, включенным в APK.
Схема подписи APK v4
В Android 11 добавлена поддержка схемы подписи APK v4 . Эта схема создает новый тип подписи в отдельном файле ( apk-name .apk.idsig
), но в остальном аналогична версиям 2 и 3. В APK не вносится никаких изменений. Эта схема поддерживает инкрементную установку APK ADB , что ускоряет установку APK.
Динамические фильтры намерений
Чтобы получать намерения, приложение должно объявить во время компиляции, какие типы данных оно может получать, определив фильтр намерений в манифесте приложения. В Android 10 и более ранних версиях приложения не имеют возможности изменять свои фильтры намерений во время выполнения. Это проблема для приложений виртуализации (таких как виртуальные машины и удаленные рабочие столы), поскольку они не могут точно знать, какое программное обеспечение пользователь установит в них.
В Android 11 представлены группы MIME — новый элемент манифеста, который позволяет приложению объявлять динамический набор типов MIME в фильтре намерений и программно изменять его во время выполнения. Чтобы использовать группу MIME, включите элемент данных в манифест вашего приложения с новым атрибутом android:mimeGroup
:
<intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeGroup="myMimeGroup"/> </intent-filter>
Значение атрибута android:mimeGroup
— это произвольный строковый идентификатор, который идентифицирует группу MIME во время выполнения. Вы можете получить доступ к содержимому группы MIME и обновить его, передав ее идентификатор следующим новым методам в классе API PackageManager
:
Когда вы программно добавляете тип MIME в группу MIME, он работает точно так же, как статический тип MIME, явно объявленный в манифесте.
Улучшения автозаполнения
В Android 11 представлены улучшения для служб автозаполнения.
Идентификаторы подсказок в AssistStructure.ViewNode
Службам автозаполнения часто бывает полезно вычислить хэш подписи для представления на основе свойств представления. Подсказка представления — это особенно хорошее свойство, которое можно включить при вычислении хеша подписи, но строка подсказки может меняться в зависимости от языкового стандарта телефона. Чтобы решить эту проблему, Android 11 расширяет AssistStructure.ViewNode
новым методом getHintIdEntry()
, который возвращает идентификатор ресурса для текста подсказки представления. Этот метод предоставляет независимое от локали значение, которое можно использовать для вычисления хэшей подписей.
Наборы данных, показывающие события
Чтобы помочь службам автозаполнения улучшить свои предложения, в Android 11 предусмотрена возможность выявлять случаи, когда служба автозаполнения представляла наборы данных, но пользователь не выбирал ни один из них. В Android 11 FillEventHistory
сообщает о новом типе событий TYPE_DATASETS_SHOWN
. FillEventHistory
регистрирует событие этого типа каждый раз, когда служба автозаполнения предоставляет пользователю один или несколько наборов данных. Службы автозаполнения могут использовать эти события в сочетании с существующим событием TYPE_DATASET_SELECTED
чтобы определить, выбрал ли пользователь какой-либо из предоставленных параметров автозаполнения.
Интеграция IME
Клавиатуры и другие IME теперь могут отображать предложения автозаполнения в строке предложений или аналогичном интерфейсе, а не в раскрывающемся меню. Чтобы защитить конфиденциальную информацию, такую как пароли и номера кредитных карт, предложения отображаются пользователю, но не известны IME, пока пользователь не выберет одно из них. Сведения о том, как IME и менеджеры паролей могут поддерживать эту функцию, см. в разделе Интеграция автозаполнения с клавиатурой .
Обмен данными с сервисом захвата контента
Начиная с Android 11, ваше приложение может обмениваться данными со службой захвата контента устройства. Эта возможность облегчает устройству предоставление контекстной информации, например отображение названия песни, которая в данный момент воспроизводится в среде пользователя.
Чтобы сделать данные из вашего приложения доступными для службы захвата контента, вызовите метод shareData()
в экземпляре ContentCaptureManager
. Если система принимает запрос на совместное использование данных, ваше приложение получает дескриптор файла, доступный только для записи, для обмена со службой захвата контента.
В Android 11 представлены замечательные новые функции и API для разработчиков. Разделы ниже помогут вам узнать о функциях ваших приложений и начать работу с соответствующими API.
Для получения подробного списка новых, модифицированных и удаленных API, прочитайте отчет API DIFF . Для получения подробной информации о новых API -интерфейсах посетите ссылку API Android - новые API выделены для видимости. Кроме того, чтобы узнать о областях, где изменения платформы могут повлиять на ваши приложения, обязательно ознакомьтесь с изменениями поведения Android 11 для приложений, которые нацелены на Android R и для всех приложений , а также изменения конфиденциальности .
Новые впечатления
Управление устройством
Android 11 включает в себя новую API ControlsProviderService
, который вы можете использовать для выставки элементов управления для подключенных внешних устройств. Эти элементы управления появляются под управлением устройства в меню Android Power. Для получения дополнительной информации см. Управление внешними устройствами .
СМИ Элементы управления
Android 11 обновляет, как отображаются элементы управления носителями. Управление среды появляются почти быстрыми настройками. Сеансы из нескольких приложений расположены в пролистываемой карусели, которая включает в себя потоки, играющие локально по телефону, удаленные потоки, такие как те, которые обнаружены на внешних устройствах или сеансах актеров, и предыдущие, возобновляемые сеансы в порядке, в котором они были в последний раз.
Пользователи могут перезапустить предыдущие сеансы из карусели без необходимости запуска приложения. Когда начинается воспроизведение, пользователь взаимодействует с управлением носителем обычным способом.
Для получения дополнительной информации см. Управление среды .
Экраны
Лучшая поддержка водопадов
Android 11 предоставляет несколько API для поддержки дисплеев водопада , дисплеи, которые обертываются вокруг края устройства. Эти дисплеи рассматриваются как вариант дисплеев с вырезоми дисплеев. Существующие методы DisplayCutout
.getSafeInset…()
теперь возвращают безопасную вставку, чтобы избежать водопадов, а также вырезов. Чтобы представить содержание приложения в зоне водопада, сделайте следующее:
Вызовы
DisplayCutout.getWaterfallInsets()
чтобы получить точные размеры вставки водопада.Установите атрибут атрибута Window
layoutInDisplayCutoutMode
наLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
, чтобы окно расширилось в области выреза и водопада на всех краях экрана. Вы должны убедиться, что в зонах выреза или водопада нет существенного содержания.
Датчик угла шарнира и складываемые
Android 11 позволяет приложениям, работающим на устройствах с конфигурациями экрана на основе шарниров, определять угол шарнира, предоставляя новый датчик с помощью TYPE_HINGE_ANGLE
, и новый SensorEvent
, который может контролировать угол шарнира и обеспечивает измерение в градусах между двумя интегральными части устройства. Вы можете использовать эти необработанные измерения для выполнения гранулированных анимаций, поскольку пользователь манипулирует устройством.
Смотрите складки .
Разговоры
Улучшения разговора
Android 11 вносит ряд улучшений в том, как обрабатываются разговоры . Разговоры-это в режиме реального времени, двунаправленные коммуникации между двумя или более человек. Эти разговоры дают особую известность, и у пользователей есть несколько новых вариантов в том, как взаимодействовать с ними.
Для получения дополнительной информации о разговорах и о том, как ваше приложение может поддержать их, см. Люди и разговоры .
Чат -пузырьки
Разработчики теперь доступны для разработчиков, чтобы помочь разговорам по поверхности по всей системе. Bubbles был экспериментальной функцией в Android 10, которая была включена через опцию разработчика; В Android 11 это больше не нужно.
Если приложение предназначено для Android 11 (API уровня 30) или выше, его уведомления не представлены в виде пузырьков, если они не выполняют новые требования к разговору . В частности, уведомление должно быть связано с ярлыком.
Перед Android 11, если вы хотите, чтобы уведомление было пузырьлось, вам нужно было явно указать, что уведомление было установлено для всегда запуска в режиме пользовательского интерфейса документов. Начиная с Android 11, вам больше не нужно явно делать такую настройку; Если уведомление пузырится, платформа автоматически устанавливает уведомление для всегда запуска в режиме пользовательского интерфейса документов.
Существует ряд улучшений в производительности пузыря, и пользователи имеют большую гибкость в обеспечении и отключении пузырьков из каждого приложения. Для разработчиков, которые внедрили экспериментальную поддержку, есть несколько изменений в API в Android 11:
- Конструктор
BubbleMetadata.Builder()
без параметров устарел. Вместо этого используйте любое из двух новых конструкторовBubbleMetadata.Builder(PendingIntent, Icon)
илиBubbleMetadata.Builder(String)
. - Создайте
BubbleMetadata
из ярлыка, вызываяBubbleMetadata.Builder(String)
. Продолжаемая строка должна соответствовать идентификатору сочетания, предоставленногоNotification.Builder
. Строитель. - Создайте иконки пузырьков с
Icon.createWithContentUri()
или с новым методомcreateWithAdaptiveBitmapContentUri()
.
5G визуальные индикаторы
Информацию об отображении индикаторов 5G на устройствах пользователей см. В сообщении, когда они находятся на 5G .
Конфиденциальность
Android 11 представляет большое количество изменений и ограничений для повышения конфиденциальности пользователей. Чтобы узнать больше, посмотрите страницу конфиденциальности .
Безопасность
Обновления биометрической аутентификации
Чтобы помочь вам контролировать уровень безопасности для данных вашего приложения, Android 11 обеспечивает несколько улучшений для биометрической аутентификации. Эти изменения также появляются в биометрической библиотеке JetPack .
Типы аутентификации
Android 11 представляет интерфейс BiometricManager.Authenticators
, который вы можете использовать, чтобы объявить типы аутентификации, которые поддерживает ваше приложение .
Определите, какой тип аутентификации был использован
После аутентификации пользователя вы можете проверить, аутентифицировал ли пользователь с помощью учетных данных устройства или биометрических учетных данных, вызывая getAuthenticationType()
.
Дополнительная поддержка ключей Auth-Usee
Android 11 обеспечивает большую поддержку аутентификации с использованием клавиш Auth-Per Use .
Устаревшие методы
Android 11 контролирует следующие методы:
- Метод
setDeviceCredentialAllowed()
. - Метод
setUserAuthenticationValidityDurationSeconds()
. - Перегруженная версия
canAuthenticate()
, которая не принимает аргументов.
Безопасный обмен большими наборами данных
В некоторых ситуациях, таких как те, которые включают машинное обучение или воспроизведение средств массовой информации, ваше приложение может захотеть использовать тот же большой набор данных, что и другое приложение. В предыдущих версиях Android ваше приложение и другое приложение нужно будет загрузить отдельную копию одного и того же набора данных.
Чтобы помочь уменьшить избыточность данных, как по сети, так и на диске, Android 11 позволяет кэшировать эти большие наборы данных на устройстве с помощью общих качков данных . Чтобы узнать больше о обмене наборами данных, см. В углубленном руководстве по обмену большими наборами данных .
Выполнить шифрование на основе файлов после перезапуска OTA без учетных данных пользователя
После того, как устройство завершает обновление OTA и перезагрузку, зашифрованные клавиши (CE), которые размещены в хранилище, защищенном учетными данными, немедленно доступны для операций шифрования на основе файлов (FBE) . Это означает, что после обновления OTA ваше приложение может возобновить операции, которые требуют клавиш CE, прежде чем пользователь введет свой PIN -код, шаблон или пароль.
Производительность и качество
Беспроводная отладка
Android 11 поддерживает развертывание и отладку вашего приложения по беспроводной связи с вашей рабочей станции через Android Debug Bridge (ADB). Например, вы можете развернуть свое отзываемое приложение на несколько удаленных устройств, не подключая вашего устройства через USB и бороться с общими проблемами USB -соединения, такими как установка драйверов. Для получения дополнительной информации см. Запуск приложений на аппаратном устройстве .
Адгрементная установка ADB APK
Установка больших (2 ГБ+) APK на устройство может занять много времени, даже если в приложение внесено только небольшое изменение. ADB (Adrod Debug Bridge) Инкрементная установка APK ускоряет этот процесс, установив достаточно APK для запуска приложения при потоковой передаче оставшихся данных в фоновом режиме. adb install
будет использовать эту функцию автоматически, если она поддерживается устройством, и у вас есть новейшие установленные платформы SDK . Если он не поддерживается, метод установки по умолчанию молча используется.
Используйте следующую команду ADB, чтобы использовать функцию. Если устройство не поддерживает инкрементную установку, команда не удается и печатает словесное объяснение.
adb install --incremental
Перед запуском инкрементной установки ADB APK вы должны подписать свой APK и создать файл V4 Signature APK . Файл подписи V4 должен быть размещен рядом с APK для работы этой функции.
Обнаружение ошибок с использованием нативного распределения памяти
GWP-ASAN-это нативная функция распределения памяти, которая помогает найти ошибки без использования и без куча. Вы можете включить эту функцию по всему миру или для конкретных подпроцессов вашего приложения. Чтобы узнать больше, см. Руководство GWP-ASAN .
Нейронные сети API 1.3
Android 11 расширяет и улучшает API нейронных сетей (NNAPI) .
Новые операции
NNAPI 1.3 представляет новый тип операнда, TENSOR_QUANT8_ASYMM_SIGNED
, для поддержки новой схемы квантования TensorFlow Lite .
Кроме того, NNAPI 1.3 представляет следующие новые операции:
-
QUANTIZED_LSTM
-
IF
-
WHILE
-
ELU
-
HARD_SWISH
-
FILL
-
RANK
Новые элементы управления ML
NNAPI 1.3 вводит новые элементы управления, чтобы помочь машинному обучению работать гладко:
QoS API: Новое API качества обслуживания включает в себя поддержку приоритетов и сроков задач в NNAPI со следующими новыми функциями:
Ввод домена памяти/вывод: NNAPI 1.3 включает в себя поддержку доменов памяти в качестве ввода и вывода для выполнения. Это удаляет ненужные копии одних и тех же данных между различными компонентами системы, улучшая производительность времени выполнения Android Neural Networks. Эта функция добавляет набор новых API NDK для использования с объектами
ANeuralNetworksMemoryDesc
иANeuralNetworkMemory
, включая следующие функции:-
ANeuralNetworksMemoryDesc_create()
-
ANeuralNetworksMemoryDesc_free()
-
ANeuralNetworksMemoryDesc_addInputRole()
-
ANeuralNetworksMemoryDesc_addOutputRole()
-
ANeuralNetworksMemoryDesc_setDimensions()
-
ANeuralNetworksMemoryDesc_finish()
-
ANeuralNetworksMemory_createFromDesc()
-
ANeuralNetworksMemory_copy()
Чтобы узнать больше, см. Образец домена памяти нейронной сети .
-
API зависимости и поддержка забора синхронизации: NNAPI 1.3 включает в себя поддержку асинхронного вычисления с зависимостями, что позволяет значительно уменьшить накладные расходы при вызове небольших цепных моделей. Эта функция добавляет следующие новые функции:
Поток управления: NNAPI 1.3 включает в себя поддержку общего потока управления с новыми графическими операциями
ANEURALNETWORKS_IF
иANEURALNETWORKS_WHILE
, которые принимают другие модели в качестве аргументов с использованием нового типа операндаANEURALNETWORKS_MODEL
. Кроме того, эта функция добавляет следующие новые функции:
NDK Thermal API
Когда устройства становятся слишком теплыми, они могут заложить процессор и/или графический процессор, и это может повлиять на приложения неожиданным образом. Приложения или игры, которые включают в себя сложную графику, тяжелые вычисления или устойчивую сетевую деятельность, с большей вероятностью столкнутся с проблемами.
Используйте тепловой API NDK в Android 11, чтобы контролировать изменения температуры на устройстве, а затем принять действие для поддержания более низкой температуры использования мощности и более охлаждения. Этот API похож на Thermal API Java ; Вы можете использовать его для получения уведомлений для любого изменения теплового статуса или для непосредственного опроса.
Текст и ввод
Улучшенные переходы IME
Android 11 представляет новые API для улучшения переходов для редакторов метода ввода (IME), таких как клавиатуры на экране. Эти API облегчают корректировку контента вашего приложения с синхронизацией с внешним видом и исчезновением IME, а также с другими элементами, такими как статус и навигационные бары.
Чтобы показать IME, в то время как любой EditText
имеет фокус, Call view.getInsetsController(). show(Type.ime())
. (Вы можете вызвать этот метод в любом представлении в той же иерархии, что и сфокусированный EditText
, вам не нужно называть его в конкретно EditText
.) Чтобы скрыть ime, call view.getInsetsController(). hide(Type.ime())
. Вы можете проверить, виден ли в настоящее время IME, вызовов view.getRootWindowInsets(). isVisible(Type.ime())
.
Чтобы синхронизировать представления вашего приложения с помощью внешнего вида и исчезновения IME, установите слушателя на представление, предоставив WindowInsetsAnimation.Callback
to View.setWindowInsetsAnimationCallback()
. (Вы можете установить этот слушатель в любом представлении, он не должен быть EditText
.) IME вызывает метод вашего слушателя onPrepare()
, затем он вызывает onStart()
в начале перехода. Затем он вызывает onProgress()
при каждом прогрессе в переходе. Когда переход закончится, IME вызывает onEnd()
. В любой точке перехода вы можете выяснить, сколько прогресса достиг перехода, вызывая WindowInsetsAnimation.getFraction()
.
Для примера того, как использовать эти API, см. Пример нового кода WindownInsetSemation .
Управление анимацией IME
Вы также можете взять под контроль анимацию IME или анимацию другой системной панели, такой как навигационная панель. Для этого сначала вызовите setOnApplyWindowInsetsListener()
чтобы установить нового слушателя для изменений вставки в окне:
Котлин
rootView.setOnApplyWindowInsetsListener { rootView, windowInsets -> val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime()) rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom) // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. WindowInsets.CONSUMED }
Ява
mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime()); mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom); // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. return WindowInsets.CONSUMED; } });
Чтобы переместить IME или другую системную панель, вызовите метод контроллера controlWindowInsetsAnimation()
:
Котлин
view.windowInsetsController.controlWindowInsetsAnimation( Type.ime(), 1000, LinearInterpolator(), cancellationSignal, object : WindowInsetsAnimationControlListener() { fun onReady(controller: WindowInsetsAnimationController, types: Int) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */) } } );
Ява
mRoot.getWindowInsetsController().controlWindowInsetsAnimation( Type.ime(), 1000, new LinearInterpolator(), cancellationSignal, new WindowInsetsAnimationControlListener() { @Override public void onReady( @NonNull WindowInsetsAnimationController controller, int types ) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */); } @Override public void onCancelled() {} });
Обновления библиотек ICU
Android 11 обновляет пакет android.icu
для использования версии 66 библиотеки ICU по сравнению с версией 63 в Android 10. Новая версия библиотеки включает в себя обновленные данные локали CLDR и ряд улучшений поддержки интернационализации в Android.
Примечательные изменения в новой библиотечной версиях включают следующее:
- Многие форматирование API теперь поддерживают новый тип объекта возврата, который расширяет
FormattedValue
. - API
LocaleMatcher
улучшен с помощью класса Builder, поддержкиjava.util.Locale
, а также класс результатов с дополнительными данными о совпадении. - Unicode 13 теперь поддерживается.
СМИ
Распределение буферов MediaCodec
Android 11 включает в себя новые API -интерфейсы MediaCodec
, которые дают приложениям большее управление при распределении буферов ввода и вывода. Это позволяет вашему приложению более эффективно управлять памятью.
Новые классы:
Новые методы:
-
MediaCodec.getQueueRequest()
-
MediaCodec.getOutputFrame()
-
MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
Кроме того, поведение двух методов в MediaCodec.Callback()
изменилось:
-
onInputBufferAvailable()
- Вместо вызова
MediaCodec.getInputBuffer()
иMediaCodec.queueInputBuffer()
с помощью индекса, если он настроен для использования API модели блоков, приложения должны использоватьMediaCodec.getQueueRequest
с индексом, прикрепляя линейный блок/аппаратный подключен к слоту. -
onOutputBufferAvailable()
- Вместо вызова
MediaCodec.getOutputBuffer()
с помощью индекса, приложения могут использоватьMediaCodec.getOutputFrame()
с индексом, чтобы получить объектOutputFrame
с дополнительной информацией и буферами LinearBlock/AddwareBuffer.
Декодирование с низкой задержкой в MediaCodec
Android 11 улучшает MediaCodec
для поддержки декодирования с низкой задержкой для игр и других приложений в реальном времени. Вы можете проверить, поддерживает ли кодек декодирование с низкой задержкой путем передачи FEATURE_LowLatency
в MediaCodecInfo.CodecCapabilities.isFeatureSupported()
.
Чтобы включить или выключить декодирование с низкой задержкой, сделайте любое из следующих:
- Установите новый ключ
KEY_LOW_LATENCY
на 0 или 1 с помощьюMediaCodec.configure()
. - Установите новый параметр параметра
PARAMETER_KEY_LOW_LATENCY
на 0 или 1 с помощьюMediaCodec.setParameters()
.
Новая функция Aaudio aaudiostream_release ()
Функция AAudioStream_close()
выпускает и одновременно закрывает аудио -поток. Это может быть опасно. Если другой процесс попытается получить доступ к потоку после его закрытия, процесс будет терпеть неудачу.
Новая функция AAudioStream_release()
выпускает поток, но не закрывает его. Это освобождает свои ресурсы и оставляет поток в известном состоянии. Объект сохраняется до тех пор, пока вы не позвоните AAudioStream_close()
.
MediaParser API
MediaParser - это новый API низкого уровня для извлечения медиа. Он более гибкий, чем MediaExtractor , и обеспечивает дополнительный контроль над функциональностью извлечения носителя.
Аудио захват с USB -устройства
Когда приложение без разрешения RECORD_AUDIO
использует UsbManager
для запроса прямого доступа к аудиоустройству USB с возможностью захвата звука (например, USB -гарнитуры), появляется новое предупреждающее сообщение с просьбой подтвердить разрешение на использование устройства. Система игнорирует любую опцию «Всегда использование», поэтому пользователь должен подтвердить предупреждение и предоставлять разрешение каждый раз, когда приложение запрашивает доступ.
Чтобы избежать такого поведения, ваше приложение должно запросить разрешение RECORD_AUDIO
.
Одновременный доступ к микрофону
Android 11 добавляет новые методы APIS AudioRecord
, MediaRecorder
и AAudioStream
. Эти методы позволяют и отключить способность захватывать одновременно независимо от выбранного варианта использования. См. Обмен аудиовнатами .
Выходной переключатель
Android 11 реализует новое поведение для приложений, которые используют API актерского состава и Mediarouter.
В дополнение к доступу к параметрам кастинга из приложения, параметры переключения также появляются в системном медиаплеере. Это помогает предоставить пользователю плавное путешествие при перемещении между устройствами, когда они меняют свои контексты просмотра и прослушивания, такие как просмотр видео на кухне по сравнению с телефоном или прослушивание звука в доме или в машине. Смотрите выходной переключатель .
Возможности подключения
Улучшения Wi-Fi Passpoint
Для получения информации о возможностях Passpoint, добавленной в Android 11, см. Passpoint .
API предложения Wi-Fi расширяется
Android 11 расширяет API предложения Wi-Fi для увеличения возможностей управления сетью вашего приложения, включая следующее:
- Приложения для управления подключением могут управлять своими собственными сетями, позволяя запросам отключения.
- Сети Passpoint интегрированы в API предложения и могут быть предложены пользователю.
- АПИС Analytics позволяет вам получить информацию о качестве ваших сетей.
Обновления Callscreeningservice
Начиная с Android 11, вызов ScreeningService может запросить информацию о статусе проверки перемешивания/потрясения (Verstat) для входящих вызовов. Эта информация предоставляется в рамках сведения о вызовах для входящих звонков.
Если CallScreeningService
содержит разрешение READ_CONTACTS
, приложение уведомляется, когда входящие вызовы или исходящие вызовы по номеру в контактах пользователя.
Для получения дополнительной информации см. Предотвращение подготовки идентификатора вызывающего абонента .
Откройте мобильные обновления API
Для получения информации о поддержке OMAPI на Android 11 и выше см. Поддержку Open Mobile API Reader .
Исполнительные VPNS
Приложения, которые нацелены на уровень API 30 и выше, или которые работают на устройствах, запущенных на уровне 29 API и выше, могут применять IKEV2/IPSEC к VPN как для пользовательских, так и для приложений на основе приложений.
VPN запускают нативные для операционной системы, упрощая код, необходимый для установления соединений IKEV2/IPSEC VPN в приложении.
Контроль доступа к сети для процесса
Для получения информации о включении доступа к сети для каждого процесса см. Управление использованием сети .
Разрешить несколько установленных конфигураций Passpoint с одним и тем же FQDN
Начиная с Android 11, вы можете использовать PasspointConfiguration.getUniqueId()
чтобы получить уникальный идентификатор для объекта PasspointConfiguration
, который позволяет пользователям вашего приложения устанавливать несколько профилей с одним и тем же полностью квалифицированным доменным именем (FQDN).
Эта функциональность полезна, когда перевозчик развертывает более одной комбинации кода мобильной страны (MCC) и кода мобильной сети (MNC) в своей сети, но имеет только один FQDN. На Android 11 и выше можно установить более одного профиля с тем же FQDN, который будет соответствовать сети в качестве домашнего поставщика, когда пользователь устанавливает SIM -карту с MCC или MNC.
Поддержка антенны GNSS
Android 11 представляет класс GnssAntennaInfo
, который позволяет вашему приложению более широко использовать позиционирование сантиметра-аккуратности, которое может предоставить глобальная навигационная спутниковая система (GNS).
Узнайте больше в Руководстве по информации о калибровке антенны .
Графика
Декодер изображения NDK
API API NDK ImageDecoder
предоставляет стандартный API для приложений Android C/C ++ для непосредственного декодирования изображений. Разработчикам приложений больше не нужно использовать Framework API (через JNI) или связывать сторонние библиотеки по декодированию изображений. Для получения дополнительной информации см. Руководство разработчика декодера изображения .
API частоты кадров
Android 11 предоставляет API, который позволяет приложениям информировать систему их предполагаемой частоты кадров, чтобы уменьшить Judder на устройствах, которые поддерживают многочисленные показатели обновления. Для получения информации о том, как использовать этот API, см. Руководство по частоте кадров .
Запрос и проверка поддержки с низкой задержкой
Некоторые дисплеи могут выполнять графику постобработки, например, некоторые внешние дисплеи и телевизоры. Эта пост-обработка улучшает графику, но может увеличить задержку. Новые отображения, которые поддерживают HDMI 2.1, имеют режим автоматической низкой задержки ( ALLM , также известный как Game Mode ), который сводит к минимуму задержку путем отключения этой пост-обработки. Для получения более подробной информации о ALLM обратитесь к спецификации HDMI 2.1 .
Окно может потребовать использования режима автоматической низкой задержки, если он доступен. ALLM особенно полезен для таких приложений, как игры и видеоконференция, где низкая задержка важнее, чем иметь наилучшую возможную графику.
preferMinimalPostProcessing
переключить минимальную пост-обработку включенной или выключенной true
Window.setPreferMinimalPostProcessing()
. Не все отображаются поддерживают минимальную пост-обработку; Чтобы выяснить, поддерживает ли конкретный дисплей, вызовите новый метод Display.isMinimalPostProcessingSupported()
.
Внедрение уровня Graphics Debug.
Приложения теперь могут загружать внешние графические слои ( GLES , Vulkan ) в натуральный код приложения, чтобы раскрыть ту же функциональность, что и отзывное приложение, но без накладных расходов на производительность. Эта функция особенно важна при профилировании вашего приложения такими инструментами, как Gapid . Чтобы профилировать ваше приложение, включите следующий элемент метадаты в манифестный файл вашего приложения вместо того, чтобы делать приложение отладчиком:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
Изображения и камера
Звуки и вибрации уведомлений о нем
Начиная с Android 11, когда активно использует камеру, ваше приложение может отключить только вибрации, как звуки, так и вибрации, или не используя setCameraAudioRestriction()
.
Расширенная поддержка камеры в эмуляторе Android
Для получения информации о расширенной поддержке камер в эмуляторе, начиная с Android 11, см. Поддержку камеры .
Поддержка одновременного использования более одной камеры
Android 11 добавляет API для поддержки запроса для использования более одной камеры за раз, включая как фронтальную, так и сзади камеру.
Чтобы проверить поддержку на устройстве, на котором работает ваше приложение, используйте следующие методы:
-
getConcurrentCameraIds()
ВозвращаетSet
комбинаций идентификаторов камеры, которые могут одновременно транслировать с гарантированными комбинациями потока при настройке того же процесса применения. -
isConcurrentSessionConfigurationSupported()
запросит вопрос о том, могут ли устройства камеры одновременно поддерживать соответствующие конфигурации сеанса.
Лучшая поддержка изображений HEIF с несколькими кадрами
Начиная с Android 11, если вы называете ImageDecoder.decodeDrawable()
и проходите изображение heif, содержащее последовательность кадров (например, анимация или фотография, метод возвращает AnimatedImageDrawable
, содержащую всю последовательность изображения. На более ранних версиях Android метод вернул BitmapDrawable
всего в одном кадре.
Если график HEIF содержит несколько кадров, которые не находятся в последовательности, вы можете получить индивидуальный кадр, позвонив в MediaMetadataRetriever.getImageAtIndex()
.
Доступность
Обновления для разработчиков услуг доступности
Если вы создаете пользовательскую службу доступности, вы можете использовать следующие функции в Android 11:
- Пользовательский объяснение службы доступности теперь позволяет получить HTML и изображения в дополнение к простому тексту. Эта гибкость облегчает объяснение конечным пользователям, что делает ваш сервис и как это может им помочь.
- Чтобы работать с описанием состояния элемента пользовательского интерфейса, которое является более семантически значимым, чем
contentDescription
, вызовите методgetStateDescription()
. - Чтобы попросить, чтобы события Touch обходили Explorer System Sounch, позвоните в
setTouchExplorationPassthroughRegion()
. Аналогичным образом, чтобы запросить, чтобы жесты обходили детектор жестов системы, вызовыsetGestureDetectionPassthroughRegion()
. - Вы можете запросить действия IME, такие как «Enter» и «Next», а также скриншоты Windows, которые не включают флаг
FLAG_SECURE
.
Дополнительные возможности
Приложения процесса выхода
Android 11 представляет метод ActivityManager.getHistoricalProcessExitReasons()
, который сообщает причины любых недавних завершений процесса. Приложения могут использовать этот метод для сбора диагностической информации о сбоях, например, связано ли завершение процесса, связанные с ANR, проблемами с памятью или другими причинами. Кроме того, вы можете использовать новый метод setProcessStateSummary()
для хранения пользовательской информации о состоянии состояния для последующего анализа.
Метод getHistoricalProcessExitReasons()
возвращает экземпляры класса ApplicationExitInfo
, который содержит информацию, связанную со смертью процесса приложения. Позвонив getReason()
в случае этого класса, вы можете определить, почему процесс вашего приложения было убито. Например, возвращаемое значение REASON_CRASH
указывает на то, что в вашем приложении произошло невозможное исключение. Если ваше приложение необходимо для обеспечения уникальности для событий выхода, оно может поддерживать идентификатор для конкретного приложения, такой как хэш-значение на основе метки времени из метода getTimestamp()
.
Дополнительные ресурсы
Для получения дополнительной информации прочитайте статью о новых инструментах Android 11, чтобы сделать приложения более частными и стабильными на среде.
Погрузчики ресурсов
Android 11 представляет новый API, который позволяет приложениям динамически расширять, как ресурсы поиск и загружается. Новый API -классы ResourcesLoader
и ResourcesProvider
отвечают в первую очередь за предоставление новой функциональности. Вместе они предоставляют возможность обеспечивать дополнительные ресурсы и активы или изменять значения существующих ресурсов и активов.
Объекты ResourcesLoader
- это контейнеры, которые поставляют объекты ResourcesProvider
в экземпляр Resources
приложения. В свою очередь, объекты ResourcesProvider
предоставляют методы для загрузки данных ресурсов из APK и таблиц ресурсов.
Одним из основных вариантов использования этого API является пользовательская загрузка активов. Вы можете использовать loadFromDirectory()
для создания ResourcesProvider
, который перенаправляет разрешение ресурсов и активов на основе файлов, заставляя его искать конкретный каталог, а не APK приложения. Вы можете получить доступ к этим активам через семейство методов open()
из класса API AssetManager
, как и с активами, связанными с APK.
Схема подписи APK v4
Android 11 добавляет поддержку схемы подписи APK V4 . Эта схема создает новый вид подписи в отдельном файле ( apk-name .apk.idsig
), но в остальном аналогична V2 и V3. Апк не внесет никаких изменений. Эта схема поддерживает инкрементную установку ADB APK , которая ускоряет установку APK.
Динамические намерения фильтры
Чтобы получить намерения, приложение должно объявить во время компиляции, какие типы данных он может получать, определив фильтр намерений в манифесте приложения. В Android 10 и ниже приложения не могут изменить свои намерения фильтры во время выполнения. Это проблема для приложений для виртуализации (таких как виртуальные машины и удаленные рабочие столы), потому что у них нет возможности точно узнать, какое программное обеспечение будет установить внутри пользователя.
Android 11 представляет группы MIME, новый Manifest Element, который позволяет приложению объявлять динамический набор типов MIME в фильтре намерения и модифицировать его программно во время выполнения. Чтобы использовать группу MIME, включите элемент данных в вашем приложении, проявленное с новым атрибутом android:mimeGroup
:
<intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeGroup="myMimeGroup"/> </intent-filter>
Значение атрибута android:mimeGroup
- это произвольный идентификатор строки, который идентифицирует группу MIME во время выполнения. Вы можете получить доступ и обновить содержимое группы MIME, передавая его идентификатор следующим новым методам в классе API PackageManager
:
Когда вы добавляете тип MIME в группу MIME программно, он функционирует точно так же, как статический тип MIME, явно объявленный в манифесте.
Усовершенствования автозаполнения
Android 11 вводит улучшения для услуг автозаполнения.
Идентификаторы подсказки в Assistructure.ViewNode
Для служб автозаполнения часто полезно вычислить хэш подписи для представления, основанного на свойствах представления. Подсказка для представления является особенно хорошим свойством для включения при вычислении хэша подписи, но строка подсказка может измениться с локалем телефона. Чтобы решить эту проблему, Android 11 расширяет AssistStructure.ViewNode
с помощью нового метода getHintIdEntry()
, который возвращает идентификатор ресурса для подсказки. Этот метод обеспечивает независимое от локализации, которое вы можете использовать для вычисления HASE.
Наборы данных показаны событиями
Чтобы помочь службам автопроизводства улучшить свои предложения, Android 11 предоставляет способ определить случаи, когда сервис автозаполнения представленных наборов данных, но пользователь не выбирал ни одного из них. В Android 11 FillEventHistory
сообщает о новом типе события TYPE_DATASETS_SHOWN
. FillEventHistory
регистрирует событие такого типа всякий раз, когда служба автозаполнения представляет пользователю один или несколько наборов данных. Услуги автозаполнения могут использовать эти события в сочетании с существующим событием TYPE_DATASET_SELECTED
чтобы определить, выбрал ли пользователь какой -либо из предоставленных вариантов автозаполнения.
IME интеграция
Клавиатуры и другие IME теперь могут отображать встроенные предложения автозаполнения, в полосе или аналогичном интерфейсе, а не в раскрывающемся меню. Чтобы защитить конфиденциальную информацию, такую как пароли и номера кредитных карт, предложения отображаются пользователю, но не известны IME, пока пользователь не выберет его. Для получения информации о том, как IMES и Managers могут поддерживать эту функцию, см. Интеграцию автозаполнения с клавиатурами .
Обмен данными с службой захвата контента
Начиная с Android 11, ваше приложение может обмениваться данными с службой захвата контента устройства. Эта возможность облегчает для устройства доставить интеллект в контексте, например, показывать название песни, которая в настоящее время играет в среде пользователя.
Чтобы сделать данные из вашего приложения доступным для службы захвата контента, вызовите метод shareData()
в экземпляре ContentCaptureManager
. Если система принимает запрос на обмен данными, ваше приложение получает дескриптор файла только для записи, чтобы поделиться службой захвата контента.
Android 11 представляет отличные новые функции и API для разработчиков. Ниже разделам помогают узнать о функциях для ваших приложений и начать с соответствующих API.
Для получения подробного списка новых, модифицированных и удаленных API, прочитайте отчет API DIFF . For details on new APIs visit the Android API reference — new APIs are highlighted for visibility. Also, to learn about areas where platform changes may affect your apps, be sure to check out Android 11 behavior changes for apps that target Android R and for all apps , as well as privacy changes .
New experiences
Device controls
Android 11 includes a new ControlsProviderService
API that you can use to expose controls for connected, external devices. These controls appear under Device controls in the Android power menu. For more information, see Control external devices .
Media Controls
Android 11 updates how media controls are displayed. Media controls appear near quick settings. Sessions from multiple apps are arranged in a swipeable carousel which includes streams playing locally on the phone, remote streams, such as those detected on external devices or cast sessions, and previous, resumable sessions in the order they were last played.
Users can restart previous sessions from the carousel without having to start the app. When playback begins, the user interacts with the media controls in the usual way.
For more information, see media controls .
Экраны
Better support for waterfall displays
Android 11 provides several APIs to support waterfall displays , displays which wrap around the edge of the device. These displays are treated as a variant of displays with display cutouts. The existing DisplayCutout
.getSafeInset…()
methods now return the safe inset to avoid waterfall areas as well as cutouts. To render your app content in the waterfall area, do the following:
Call
DisplayCutout.getWaterfallInsets()
to get exact dimensions of the waterfall inset.Set the window layout attribute
layoutInDisplayCutoutMode
toLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
to allow the window to extend into the cutout and waterfall areas on all edges of the screen. You must make sure that no essential content is in the cutout or waterfall areas.
Hinge angle sensor and foldables
Android 11 makes it possible for apps running on devices with hinge-based screen configurations to determine the angle of the hinge by providing a new sensor with TYPE_HINGE_ANGLE
, and a new SensorEvent
that can monitor the hinge angle and provides a measurement in degrees between two integral части устройства. You can use these raw measurements to perform granular animations as the user manipulates the device.
See Foldables .
Разговоры
Conversation improvements
Android 11 makes a number of improvements to the way conversations are handled. Conversations are real-time, bidirectional communications between two or more people. These conversations are given special prominence, and users have several new options in how to interact with them.
For more information about conversations and how your app can support them, see People and conversations .
Chat Bubbles
Bubbles are now available to developers to help surface conversations across the system. Bubbles was an experimental feature in Android 10 that was enabled through a developer option; in Android 11, this is no longer necessary.
If an app targets Android 11 (API level 30) or higher, its notifications are not presented as bubbles unless they fulfill the new conversation requirements . Specifically, the notification must be associated with a shortcut.
Prior to Android 11, if you wanted a notification to be bubbled, you needed to explicitly specify that the notification was set to always launch in document UI mode. Beginning with Android 11, you no longer need to explicitly make that setting; if the notification is bubbled, the platform automatically sets the notification to always launch in document UI mode.
There are a number of improvements to bubble performance, and users have more flexibility in enabling and disabling bubbles from each app. For developers who implemented experimental support, there are a few changes to the APIs in Android 11:
- The
BubbleMetadata.Builder()
constructor with no parameters is deprecated. Instead, use either of the two new constructorsBubbleMetadata.Builder(PendingIntent, Icon)
orBubbleMetadata.Builder(String)
. - Create
BubbleMetadata
from a shortcut ID by callingBubbleMetadata.Builder(String)
. The string passed should match the shortcut ID provided toNotification.Builder
. - Create bubble icons with
Icon.createWithContentUri()
, or with the new methodcreateWithAdaptiveBitmapContentUri()
.
5G visual indicators
For information on displaying 5G indicators on users' devices, see Tell your users when they're on 5G .
Конфиденциальность
Android 11 introduces a large number of changes and restrictions to enhance user privacy. To learn more, see the Privacy page.
Безопасность
Biometric authentication updates
To help you control the level of security for your app's data, Android 11 provides several improvements to biometric authentication. These changes also appear in the Jetpack Biometric library .
Authentication types
Android 11 introduces the BiometricManager.Authenticators
interface, which you can use to declare the types of authentication that your app supports .
Determine which authentication type was used
After the user authenticates, you can check whether the user authenticated using a device credential or a biometric credential by calling getAuthenticationType()
.
Additional support for auth-per-use keys
Android 11 provides more support for authentication using auth-per-use keys .
Deprecated methods
Android 11 deprecates the following methods:
- The
setDeviceCredentialAllowed()
method. - The
setUserAuthenticationValidityDurationSeconds()
method. - The overloaded version of
canAuthenticate()
that takes no arguments.
Secure sharing of large datasets
In some situations, such as those that involve machine learning or media playback, your app might want to use the same large dataset as another app. In previous versions of Android, your app and another app would each need to download a separate copy of the same dataset.
To help reduce data redundancy, both over the network and on disk, Android 11 allows these large datasets to be cached on the device using shared data blobs . To learn more about sharing datasets, see the in-depth guide on sharing large datasets .
Perform file-based encryption after an OTA restart without user credentials
After the device completes an OTA update and restarts, the Credential Encrypted keys (CE) that are placed in credential-protected storage are immediately available for File-Based Encryption (FBE) operations. This means that, after an OTA update, your app can resume operations that require the CE keys before the user enters their PIN, pattern, or password.
Performance and quality
Беспроводная отладка
Android 11 supports deploying and debugging your app wirelessly from your workstation via Android Debug Bridge (adb). For example, you can deploy your debuggable app to multiple remote devices without physically connecting your device via USB and contending with common USB connection issues, such as driver installation. For more information, see Run apps on a hardware device .
ADB Incremental APK installation
Installing large (2GB+) APKs on a device can take a long time, even if only a small change is made to an app. ADB (Android Debug Bridge) Incremental APK installation accelerates this process by installing enough of the APK to launch the app while streaming the remaining data in the background. adb install
will use this feature automatically if it is supported by the device and you have the latest SDK Platform-Tools installed. If it is not supported, the default installation method is silently used.
Use the following adb command to use the feature. If the device does not support incremental installation, the command fails and prints a verbose explanation.
adb install --incremental
Before running an ADB incremental APK install, you must sign your APK and create an APK Signature Scheme v4 file . The v4 signature file must be placed next to the APK for this feature to work.
Error detection using the native memory allocator
GWP-ASan is a native memory allocator feature that helps find use-after-free and heap-buffer-overflow bugs. You can enable this feature globally or for specific subprocesses of your app. To learn more, see the GWP-Asan guide .
Neural Networks API 1.3
Android 11 expands and improves the Neural Networks API (NNAPI) .
New operations
NNAPI 1.3 introduces a new operand type, TENSOR_QUANT8_ASYMM_SIGNED
, to support TensorFlow Lite's new quantization scheme .
Additionally, NNAPI 1.3 introduces the following new operations:
-
QUANTIZED_LSTM
-
IF
-
WHILE
-
ELU
-
HARD_SWISH
-
FILL
-
RANK
New ML controls
NNAPI 1.3 introduces new controls to help machine learning run smoothly:
QoS API: The new Quality of Service API includes support for prioritization and task deadlines in NNAPI with the following new functions:
Memory domain input/output: NNAPI 1.3 includes support for memory domains as input and output to execution. This removes unnecessary copies of the same data among different system components, improving the runtime performance of Android neural networks. This feature adds a set of new NDK APIs for use with
ANeuralNetworksMemoryDesc
andANeuralNetworkMemory
objects, including the following functions:-
ANeuralNetworksMemoryDesc_create()
-
ANeuralNetworksMemoryDesc_free()
-
ANeuralNetworksMemoryDesc_addInputRole()
-
ANeuralNetworksMemoryDesc_addOutputRole()
-
ANeuralNetworksMemoryDesc_setDimensions()
-
ANeuralNetworksMemoryDesc_finish()
-
ANeuralNetworksMemory_createFromDesc()
-
ANeuralNetworksMemory_copy()
To learn more, see the neural network memory domain sample .
-
Dependency API and sync fence support: NNAPI 1.3 includes support for asynchronous compute with dependencies, allowing greatly reduced overhead when invoking small chained models. This feature adds the following new functions:
Control flow: NNAPI 1.3 includes support for general control flow with the new graph operations
ANEURALNETWORKS_IF
andANEURALNETWORKS_WHILE
, which accept other models as arguments using the newANEURALNETWORKS_MODEL
operand type. Additionally, this feature adds the following new functions:
NDK Thermal API
When devices get too warm, they may throttle the CPU and/or GPU, and this can affect apps in unexpected ways. Apps or games that incorporate complex graphics, heavy computation, or sustained network activity are more likely to encounter issues.
Use the NDK Thermal API in Android 11 to monitor temperature changes on the device, and then take action to maintain lower power usage and cooler device temperature. This API is similar to the Java Thermal API ; you can use it to receive notifications for any thermal status change or to poll the current status directly.
Text and input
Improved IME transitions
Android 11 introduces new APIs to improve transitions for input method editors (IMEs), such as on-screen keyboards. These APIs make it easier to adjust your app's content in synchronization with the IME's appearance and disappearance, and with other elements like the status and navigation bars.
To show an IME while any EditText
has the focus, call view.getInsetsController(). show(Type.ime())
. (You can call this method on any view in the same hierarchy as the focused EditText
, you don't have to call it on the EditText
specifically.) To hide the IME, call view.getInsetsController(). hide(Type.ime())
. You can check whether an IME is currently visible by calling view.getRootWindowInsets(). isVisible(Type.ime())
.
To synchronize your app's views with the appearance and disappearance of the IME, set a listener on a view by providing a WindowInsetsAnimation.Callback
to View.setWindowInsetsAnimationCallback()
. (You can set this listener on any view, it doesn't have to be an EditText
.) The IME calls your listener's onPrepare()
method, then it calls onStart()
at the beginning of the transition. It then calls onProgress()
at each progression in the transition. When the transition has finished, the IME calls onEnd()
. At any point in the transition, you can find out how much progress the transition has made by calling WindowInsetsAnimation.getFraction()
.
For an example of how to use these APIs, see the new WindowInsetsAnimation code sample.
Controlling the IME animation
You can also take control of the IME animation, or the animation of another system bar like the navigation bar. To do this, first call setOnApplyWindowInsetsListener()
to set a new listener for window inset changes:
Котлин
rootView.setOnApplyWindowInsetsListener { rootView, windowInsets -> val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime()) rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom) // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. WindowInsets.CONSUMED }
Ява
mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime()); mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom); // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. return WindowInsets.CONSUMED; } });
To move the IME or other system bar, call the controller's controlWindowInsetsAnimation()
method:
Котлин
view.windowInsetsController.controlWindowInsetsAnimation( Type.ime(), 1000, LinearInterpolator(), cancellationSignal, object : WindowInsetsAnimationControlListener() { fun onReady(controller: WindowInsetsAnimationController, types: Int) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */) } } );
Ява
mRoot.getWindowInsetsController().controlWindowInsetsAnimation( Type.ime(), 1000, new LinearInterpolator(), cancellationSignal, new WindowInsetsAnimationControlListener() { @Override public void onReady( @NonNull WindowInsetsAnimationController controller, int types ) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */); } @Override public void onCancelled() {} });
Updates to the ICU libraries
Android 11 updates the android.icu
package to use version 66 of the ICU library , compared to version 63 in Android 10. The new library version includes updated CLDR locale data and a number of enhancements to internationalization support in Android.
Notable changes in the new library versions include the following:
- Many formatting APIs now support a new return object type that extends
FormattedValue
. - The
LocaleMatcher
API is enhanced with a builder class, support for thejava.util.Locale
type, and a result class featuring additional data about a match. - Unicode 13 is now supported.
СМИ
Allocating MediaCodec buffers
Android 11 includes a new MediaCodec
APIs that gives apps more control when allocating input and output buffers. This lets your app manage memory more efficiently.
New classes:
New methods:
-
MediaCodec.getQueueRequest()
-
MediaCodec.getOutputFrame()
-
MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
In addition, the behavior of two methods in MediaCodec.Callback()
have changed:
-
onInputBufferAvailable()
- Instead of calling
MediaCodec.getInputBuffer()
andMediaCodec.queueInputBuffer()
with the index, if configured to use the Block Model API, apps should useMediaCodec.getQueueRequest
with the index, attaching a LinearBlock/HardwareBuffer to the slot. -
onOutputBufferAvailable()
- Instead of calling
MediaCodec.getOutputBuffer()
with the index, apps may useMediaCodec.getOutputFrame()
with the index to get theOutputFrame
object with more information and LinearBlock/HardwareBuffer buffers.
Low-latency decoding in MediaCodec
Android 11 enhances MediaCodec
to support low-latency decoding for games and other real-time apps. You can check whether a codec supports low-latency decoding by passing FEATURE_LowLatency
to MediaCodecInfo.CodecCapabilities.isFeatureSupported()
.
To turn low-latency decoding on or off, do either of the following:
- Set the new key
KEY_LOW_LATENCY
to 0 or 1 usingMediaCodec.configure()
. - Set the new parameter key
PARAMETER_KEY_LOW_LATENCY
to 0 or 1 usingMediaCodec.setParameters()
.
New AAudio function AAudioStream_release()
The function AAudioStream_close()
releases and closes an audio stream at the same time. This can be dangerous. If another process tries to access the stream after it's been closed, the process will crash.
The new function AAudioStream_release()
releases the stream but does not close it. This frees its resources and leaves the stream in a known state. The object persists until you call AAudioStream_close()
.
MediaParser API
MediaParser is a new low level API for media extraction. It is more flexible than MediaExtractor and provides additional control over media extraction functionality.
Audio capture from a USB device
When an application without RECORD_AUDIO
permission uses UsbManager
to request direct access to a USB audio device with audio capture capability (such as a USB headset), a new warning message appears asking the user to confirm permission to use the device. The system ignores any “always use” option, so the user must acknowledge the warning and grant permission every time an app requests access.
To avoid this behavior, your app should request the RECORD_AUDIO
permission.
Concurrent mic access
Android 11 adds new methods to the AudioRecord
, MediaRecorder
, and AAudioStream
APIs. These methods enable and disable the ability to capture concurrently regardless of the selected use case. See Sharing Audio Input .
Output switcher
Android 11 implements new behavior for apps that use the cast and mediarouter APIs.
In addition to accessing casting options from within an app the switching options also appear in the system media player. This helps to give the user a seamless journey when moving between devices as they change their viewing and listening contexts, such as watching video in the kitchen versus on a phone, or listening to audio in the home or car. See the output switcher .
Возможности подключения
Wi-Fi Passpoint enhancements
For information on Passpoint capabilities added in Android 11, see Passpoint .
Wi-Fi Suggestion API is expanded
Android 11 expands the Wi-Fi Suggestion API to increase your app's network management capabilities, including the following:
- Connectivity management apps can manage their own networks by allowing disconnection requests.
- Passpoint networks are integrated into the Suggestion API and can be suggested to the user.
- Analytics APIs enable you to get information about the quality of your networks.
CallScreeningService updates
Starting in Android 11, a CallScreeningService can request information about the STIR/SHAKEN verification status (verstat) for incoming calls. This information is provided as part of the call details for incoming calls.
If a CallScreeningService
holds the READ_CONTACTS
permission, the app is notified when there are incoming calls from, or outgoing calls to, a number in the user's contacts.
For more information, see Prevent caller ID spoofing .
Open Mobile API updates
For information on OMAPI support on Android 11 and higher, see Open Mobile API reader support .
Performant VPNs
Apps that target API level 30 and higher or that are running on devices launched on API level 29 and higher can apply IKEv2/IPsec to VPNs for both user-configured and app-based VPNs.
The VPNs run native to the operating system, simplifying the code required to establish IKEv2/IPsec VPN connections in an app.
Per-process network access control
For information on enabling network access on a per-process basis, see Manage network usage .
Allow multiple installed Passpoint configurations with the same FQDN
Starting in Android 11, you can use PasspointConfiguration.getUniqueId()
to get a unique identifier for a PasspointConfiguration
object, which enables your app's users to install multiple profiles with the same fully qualified domain name (FQDN).
This functionality is helpful when a carrier deploys more than one combination of Mobile Country Code (MCC) and Mobile Network Code (MNC) on their network, but has only a single FQDN. On Android 11 and higher, it is possible to install more than one profile with the same FQDN that will match the network as the Home provider when the user installs a SIM with either MCC or MNC.
GNSS antenna support
Android 11 introduces the GnssAntennaInfo
class, which makes it possible for your app to make more use of centimeter-accuracy positioning that the Global Navigation Satellite System (GNSS) can provide.
Learn more in the guide on antenna calibration information .
Графика
NDK image decoder
The NDK ImageDecoder
API provides a standard API for Android C/C++ apps to decode images directly. App developers no longer need to use the framework APIs (via JNI) or bundle third-party image-decoding libraries. For more information, see the Image decoder developer guide .
Frame rate API
Android 11 provides an API that enables apps to inform the system of their intended frame rate, to reduce judder on devices that support multiple refresh rates. For information on how to use this API, see the Frame rate guide .
Requesting and checking for low latency support
Certain displays can perform graphics post-processing, such as some external displays and TVs. This post-processing improves the graphics but can increase latency. Newer displays which support HDMI 2.1 have an auto low latency mode ( ALLM , also known as game mode ), which minimizes latency by switching off this post-processing. For more details on ALLM, refer to the HDMI 2.1 specification .
A window can request that auto low latency mode be used, if it is available. ALLM is particularly useful for applications like games and videoconferencing, where low latency is more important than having the best possible graphics.
To toggle minimal post-processing on or off, call Window.setPreferMinimalPostProcessing()
, or set the window's preferMinimalPostProcessing
attribute to true
. Not all displays support minimal post-processing; to find out if a particular display does support it, call the new method Display.isMinimalPostProcessingSupported()
.
Performant graphics debug layer injection
Applications can now load external graphics layers ( GLES , Vulkan ) into native application code to expose the same functionality as a debuggable app, but without incurring the performance overhead. This feature is especially important when profiling your application with tools like GAPID . To profile your app, include the following meta-data element in your app manifest file instead of making the application debuggable:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
Images and camera
Mute notification sounds and vibrations during active capture
Beginning with Android 11, when actively using the camera, your app can mute only vibrations, both sounds and vibrations, or neither using setCameraAudioRestriction()
.
Expanded camera support in Android emulator
For information on the expanded support for cameras in the emulator starting with Android 11, see Camera support .
Support for concurrent use of more than one camera
Android 11 adds APIs to query support for using more than one camera at a time, including both a front-facing and rear-facing camera.
To check for support on the device on which your app is running, use the following methods:
-
getConcurrentCameraIds()
returns aSet
of combinations of camera IDs that can stream concurrently with guaranteed stream combinations when configured by the same application process. -
isConcurrentSessionConfigurationSupported()
queries whether camera devices can concurrently support the corresponding session configurations.
Better support for HEIF images with multiple frames
Beginning with Android 11, if you call ImageDecoder.decodeDrawable()
and pass an HEIF image containing a sequence of frames (such as an animation or a burst photo), the method returns an AnimatedImageDrawable
containing the entire image sequence. On earlier versions of Android, the method returned a BitmapDrawable
of just a single frame.
If the HEIF graphic contains multiple frames that are not in a sequence, you can retrieve an individual frame by calling MediaMetadataRetriever.getImageAtIndex()
.
Доступность
Updates for accessibility service developers
If you create a custom accessibility service, you can use the following features in Android 11:
- The user-facing explanation of an accessibility service now allows for HTML and images in addition to plain text. This flexibility makes it easier to explain to end-users what your service does and how it can help them.
- To work with a description of a UI element's state that's more semantically meaningful than
contentDescription
, call thegetStateDescription()
method. - To request that touch events bypass the system's touch explorer, call
setTouchExplorationPassthroughRegion()
. Similarly, to request that gestures bypass the system's gesture detector, callsetGestureDetectionPassthroughRegion()
. - You can request IME actions, such as "enter" and "next", as well as screenshots of windows that don't enable the
FLAG_SECURE
flag.
Дополнительные возможности
App process exit reasons
Android 11 introduces the ActivityManager.getHistoricalProcessExitReasons()
method, which reports the reasons for any recent process terminations. Apps can use this method to gather crash diagnostic information, such as whether a process termination is due to ANRs, memory issues, or other reasons. Additionally, you can use the new setProcessStateSummary()
method to store custom state information for later analysis.
The getHistoricalProcessExitReasons()
method returns instances of the ApplicationExitInfo
class, which contains information related to an app process's death. By calling getReason()
on an instance of this class, you can determine why your app's process was killed. For example, a return value of REASON_CRASH
indicates that an unhandled exception occurred in your app. If your app needs to ensure uniqueness for exit events, it can maintain an app-specific identifier, such as a hash value based on the timestamp from the getTimestamp()
method.
Дополнительные ресурсы
For more information, read the article about new Android 11 tools to make apps more private and stable on Medium.
Resource loaders
Android 11 introduces a new API that allows apps to dynamically extend how resources are searched and loaded. The new API classes ResourcesLoader
and ResourcesProvider
are primarily responsible for providing the new functionality. Together, they provide the ability to supply additional resources and assets, or modify the values of existing resources and assets.
ResourcesLoader
objects are containers that supply ResourcesProvider
objects to an app's Resources
instance. In turn, ResourcesProvider
objects provide methods to load resource data from APKs and resource tables.
One primary use case for this API is custom asset loading. You can use loadFromDirectory()
to create a ResourcesProvider
that redirects the resolution of file-based resources and assets, causing it to search a specific directory rather than the application APK. You can access these assets through the open()
family of methods from the AssetManager
API class, just like with assets bundled in the APK.
APK signature scheme v4
Android 11 adds support for APK Signature Scheme v4 . This scheme produces a new kind of signature in a separate file ( apk-name .apk.idsig
) but is otherwise similar to v2 and v3. No changes are made to the APK. This scheme supports ADB incremental APK installation , which speeds up APK install.
Dynamic intent filters
In order to receive intents, an app must declare at compile time which types of data it is able to receive by defining an intent filter in the app manifest. In Android 10 and lower, apps have no way of changing their intent filters at runtime. This is a problem for virtualization apps (such as virtual machines and remote desktops) because they have no way of knowing exactly what software the user will install inside them.
Android 11 introduces MIME groups, a new manifest element which allows an app to declare a dynamic set of MIME types in an intent filter and modify it programmatically at runtime. To use a MIME group, include a data element in your app manifest with the new android:mimeGroup
attribute:
<intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeGroup="myMimeGroup"/> </intent-filter>
The value of the android:mimeGroup
attribute is an arbitrary string ID that identifies the MIME group at runtime. You can access and update the contents of a MIME group by passing its ID to the following new methods in the PackageManager
API class:
When you add a MIME type to a MIME group programmatically, it functions exactly the same as a static MIME type explicitly declared in the manifest.
Autofill enhancements
Android 11 introduces improvements for autofill services.
Hint identifiers in AssistStructure.ViewNode
It is often useful for autofill services to compute a signature hash for a view based on the view's properties. The view hint is a particularly good property to include when computing a signature hash, but the hint string might change with the phone's locale. To solve this problem, Android 11 expands AssistStructure.ViewNode
with a new getHintIdEntry()
method, which returns the resource identifier for a view's hint text. This method provides a locale-independent value that you can use to compute signature hashes.
Datasets shown events
To help autofill services improve their suggestions, Android 11 provides a way to identify cases where an autofill service presented datasets but the user did not select any of them. In Android 11, FillEventHistory
reports a new TYPE_DATASETS_SHOWN
event type. FillEventHistory
logs an event of this type whenever the autofill service presents one or more datasets to the user. Autofill services can use these events in conjunction with the existing TYPE_DATASET_SELECTED
event to determine whether the user selected any of the provided autofill options.
IME integration
Keyboards and other IMEs can now display autofill suggestions inline, in a suggestion strip or similar interface, instead of in a drop-down menu. To protect sensitive information like passwords and credit-card numbers, the suggestions are displayed to the user but are not known to the IME until the user selects one. For information on how IMEs and password managers can support this feature, see Integrating autofill with keyboards .
Data sharing with content capture service
Starting in Android 11, your app can share data with the device's content capture service. This capability makes it easier for a device to deliver in-context intelligence, such as showing the name of a song that's currently playing in the user's environment.
To make data from your app available to the content capture service, call the shareData()
method on an instance of ContentCaptureManager
. If the system accepts the data-sharing request, your app receives a write-only file descriptor to share with the content capture service.
Android 11 introduces great new features and APIs for developers. The sections below help you learn about features for your apps and get started with the related APIs.
For a detailed list of new, modified, and removed APIs, read the API diff report . For details on new APIs visit the Android API reference — new APIs are highlighted for visibility. Also, to learn about areas where platform changes may affect your apps, be sure to check out Android 11 behavior changes for apps that target Android R and for all apps , as well as privacy changes .
New experiences
Device controls
Android 11 includes a new ControlsProviderService
API that you can use to expose controls for connected, external devices. These controls appear under Device controls in the Android power menu. For more information, see Control external devices .
Media Controls
Android 11 updates how media controls are displayed. Media controls appear near quick settings. Sessions from multiple apps are arranged in a swipeable carousel which includes streams playing locally on the phone, remote streams, such as those detected on external devices or cast sessions, and previous, resumable sessions in the order they were last played.
Users can restart previous sessions from the carousel without having to start the app. When playback begins, the user interacts with the media controls in the usual way.
For more information, see media controls .
Экраны
Better support for waterfall displays
Android 11 provides several APIs to support waterfall displays , displays which wrap around the edge of the device. These displays are treated as a variant of displays with display cutouts. The existing DisplayCutout
.getSafeInset…()
methods now return the safe inset to avoid waterfall areas as well as cutouts. To render your app content in the waterfall area, do the following:
Call
DisplayCutout.getWaterfallInsets()
to get exact dimensions of the waterfall inset.Set the window layout attribute
layoutInDisplayCutoutMode
toLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
to allow the window to extend into the cutout and waterfall areas on all edges of the screen. You must make sure that no essential content is in the cutout or waterfall areas.
Hinge angle sensor and foldables
Android 11 makes it possible for apps running on devices with hinge-based screen configurations to determine the angle of the hinge by providing a new sensor with TYPE_HINGE_ANGLE
, and a new SensorEvent
that can monitor the hinge angle and provides a measurement in degrees between two integral части устройства. You can use these raw measurements to perform granular animations as the user manipulates the device.
See Foldables .
Разговоры
Conversation improvements
Android 11 makes a number of improvements to the way conversations are handled. Conversations are real-time, bidirectional communications between two or more people. These conversations are given special prominence, and users have several new options in how to interact with them.
For more information about conversations and how your app can support them, see People and conversations .
Chat Bubbles
Bubbles are now available to developers to help surface conversations across the system. Bubbles was an experimental feature in Android 10 that was enabled through a developer option; in Android 11, this is no longer necessary.
If an app targets Android 11 (API level 30) or higher, its notifications are not presented as bubbles unless they fulfill the new conversation requirements . Specifically, the notification must be associated with a shortcut.
Prior to Android 11, if you wanted a notification to be bubbled, you needed to explicitly specify that the notification was set to always launch in document UI mode. Beginning with Android 11, you no longer need to explicitly make that setting; if the notification is bubbled, the platform automatically sets the notification to always launch in document UI mode.
There are a number of improvements to bubble performance, and users have more flexibility in enabling and disabling bubbles from each app. For developers who implemented experimental support, there are a few changes to the APIs in Android 11:
- The
BubbleMetadata.Builder()
constructor with no parameters is deprecated. Instead, use either of the two new constructorsBubbleMetadata.Builder(PendingIntent, Icon)
orBubbleMetadata.Builder(String)
. - Create
BubbleMetadata
from a shortcut ID by callingBubbleMetadata.Builder(String)
. The string passed should match the shortcut ID provided toNotification.Builder
. - Create bubble icons with
Icon.createWithContentUri()
, or with the new methodcreateWithAdaptiveBitmapContentUri()
.
5G visual indicators
For information on displaying 5G indicators on users' devices, see Tell your users when they're on 5G .
Конфиденциальность
Android 11 introduces a large number of changes and restrictions to enhance user privacy. To learn more, see the Privacy page.
Безопасность
Biometric authentication updates
To help you control the level of security for your app's data, Android 11 provides several improvements to biometric authentication. These changes also appear in the Jetpack Biometric library .
Authentication types
Android 11 introduces the BiometricManager.Authenticators
interface, which you can use to declare the types of authentication that your app supports .
Determine which authentication type was used
After the user authenticates, you can check whether the user authenticated using a device credential or a biometric credential by calling getAuthenticationType()
.
Additional support for auth-per-use keys
Android 11 provides more support for authentication using auth-per-use keys .
Deprecated methods
Android 11 deprecates the following methods:
- The
setDeviceCredentialAllowed()
method. - The
setUserAuthenticationValidityDurationSeconds()
method. - The overloaded version of
canAuthenticate()
that takes no arguments.
Secure sharing of large datasets
In some situations, such as those that involve machine learning or media playback, your app might want to use the same large dataset as another app. In previous versions of Android, your app and another app would each need to download a separate copy of the same dataset.
To help reduce data redundancy, both over the network and on disk, Android 11 allows these large datasets to be cached on the device using shared data blobs . To learn more about sharing datasets, see the in-depth guide on sharing large datasets .
Perform file-based encryption after an OTA restart without user credentials
After the device completes an OTA update and restarts, the Credential Encrypted keys (CE) that are placed in credential-protected storage are immediately available for File-Based Encryption (FBE) operations. This means that, after an OTA update, your app can resume operations that require the CE keys before the user enters their PIN, pattern, or password.
Performance and quality
Беспроводная отладка
Android 11 supports deploying and debugging your app wirelessly from your workstation via Android Debug Bridge (adb). For example, you can deploy your debuggable app to multiple remote devices without physically connecting your device via USB and contending with common USB connection issues, such as driver installation. For more information, see Run apps on a hardware device .
ADB Incremental APK installation
Installing large (2GB+) APKs on a device can take a long time, even if only a small change is made to an app. ADB (Android Debug Bridge) Incremental APK installation accelerates this process by installing enough of the APK to launch the app while streaming the remaining data in the background. adb install
will use this feature automatically if it is supported by the device and you have the latest SDK Platform-Tools installed. If it is not supported, the default installation method is silently used.
Use the following adb command to use the feature. If the device does not support incremental installation, the command fails and prints a verbose explanation.
adb install --incremental
Before running an ADB incremental APK install, you must sign your APK and create an APK Signature Scheme v4 file . The v4 signature file must be placed next to the APK for this feature to work.
Error detection using the native memory allocator
GWP-ASan is a native memory allocator feature that helps find use-after-free and heap-buffer-overflow bugs. You can enable this feature globally or for specific subprocesses of your app. To learn more, see the GWP-Asan guide .
Neural Networks API 1.3
Android 11 expands and improves the Neural Networks API (NNAPI) .
New operations
NNAPI 1.3 introduces a new operand type, TENSOR_QUANT8_ASYMM_SIGNED
, to support TensorFlow Lite's new quantization scheme .
Additionally, NNAPI 1.3 introduces the following new operations:
-
QUANTIZED_LSTM
-
IF
-
WHILE
-
ELU
-
HARD_SWISH
-
FILL
-
RANK
New ML controls
NNAPI 1.3 introduces new controls to help machine learning run smoothly:
QoS API: The new Quality of Service API includes support for prioritization and task deadlines in NNAPI with the following new functions:
Memory domain input/output: NNAPI 1.3 includes support for memory domains as input and output to execution. This removes unnecessary copies of the same data among different system components, improving the runtime performance of Android neural networks. This feature adds a set of new NDK APIs for use with
ANeuralNetworksMemoryDesc
andANeuralNetworkMemory
objects, including the following functions:-
ANeuralNetworksMemoryDesc_create()
-
ANeuralNetworksMemoryDesc_free()
-
ANeuralNetworksMemoryDesc_addInputRole()
-
ANeuralNetworksMemoryDesc_addOutputRole()
-
ANeuralNetworksMemoryDesc_setDimensions()
-
ANeuralNetworksMemoryDesc_finish()
-
ANeuralNetworksMemory_createFromDesc()
-
ANeuralNetworksMemory_copy()
To learn more, see the neural network memory domain sample .
-
Dependency API and sync fence support: NNAPI 1.3 includes support for asynchronous compute with dependencies, allowing greatly reduced overhead when invoking small chained models. This feature adds the following new functions:
Control flow: NNAPI 1.3 includes support for general control flow with the new graph operations
ANEURALNETWORKS_IF
andANEURALNETWORKS_WHILE
, which accept other models as arguments using the newANEURALNETWORKS_MODEL
operand type. Additionally, this feature adds the following new functions:
NDK Thermal API
When devices get too warm, they may throttle the CPU and/or GPU, and this can affect apps in unexpected ways. Apps or games that incorporate complex graphics, heavy computation, or sustained network activity are more likely to encounter issues.
Use the NDK Thermal API in Android 11 to monitor temperature changes on the device, and then take action to maintain lower power usage and cooler device temperature. This API is similar to the Java Thermal API ; you can use it to receive notifications for any thermal status change or to poll the current status directly.
Text and input
Improved IME transitions
Android 11 introduces new APIs to improve transitions for input method editors (IMEs), such as on-screen keyboards. These APIs make it easier to adjust your app's content in synchronization with the IME's appearance and disappearance, and with other elements like the status and navigation bars.
To show an IME while any EditText
has the focus, call view.getInsetsController(). show(Type.ime())
. (You can call this method on any view in the same hierarchy as the focused EditText
, you don't have to call it on the EditText
specifically.) To hide the IME, call view.getInsetsController(). hide(Type.ime())
. You can check whether an IME is currently visible by calling view.getRootWindowInsets(). isVisible(Type.ime())
.
To synchronize your app's views with the appearance and disappearance of the IME, set a listener on a view by providing a WindowInsetsAnimation.Callback
to View.setWindowInsetsAnimationCallback()
. (You can set this listener on any view, it doesn't have to be an EditText
.) The IME calls your listener's onPrepare()
method, then it calls onStart()
at the beginning of the transition. It then calls onProgress()
at each progression in the transition. When the transition has finished, the IME calls onEnd()
. At any point in the transition, you can find out how much progress the transition has made by calling WindowInsetsAnimation.getFraction()
.
For an example of how to use these APIs, see the new WindowInsetsAnimation code sample.
Controlling the IME animation
You can also take control of the IME animation, or the animation of another system bar like the navigation bar. To do this, first call setOnApplyWindowInsetsListener()
to set a new listener for window inset changes:
Котлин
rootView.setOnApplyWindowInsetsListener { rootView, windowInsets -> val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime()) rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom) // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. WindowInsets.CONSUMED }
Ява
mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime()); mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom); // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. return WindowInsets.CONSUMED; } });
To move the IME or other system bar, call the controller's controlWindowInsetsAnimation()
method:
Котлин
view.windowInsetsController.controlWindowInsetsAnimation( Type.ime(), 1000, LinearInterpolator(), cancellationSignal, object : WindowInsetsAnimationControlListener() { fun onReady(controller: WindowInsetsAnimationController, types: Int) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */) } } );
Ява
mRoot.getWindowInsetsController().controlWindowInsetsAnimation( Type.ime(), 1000, new LinearInterpolator(), cancellationSignal, new WindowInsetsAnimationControlListener() { @Override public void onReady( @NonNull WindowInsetsAnimationController controller, int types ) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */); } @Override public void onCancelled() {} });
Updates to the ICU libraries
Android 11 updates the android.icu
package to use version 66 of the ICU library , compared to version 63 in Android 10. The new library version includes updated CLDR locale data and a number of enhancements to internationalization support in Android.
Notable changes in the new library versions include the following:
- Many formatting APIs now support a new return object type that extends
FormattedValue
. - The
LocaleMatcher
API is enhanced with a builder class, support for thejava.util.Locale
type, and a result class featuring additional data about a match. - Unicode 13 is now supported.
СМИ
Allocating MediaCodec buffers
Android 11 includes a new MediaCodec
APIs that gives apps more control when allocating input and output buffers. This lets your app manage memory more efficiently.
New classes:
New methods:
-
MediaCodec.getQueueRequest()
-
MediaCodec.getOutputFrame()
-
MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
In addition, the behavior of two methods in MediaCodec.Callback()
have changed:
-
onInputBufferAvailable()
- Instead of calling
MediaCodec.getInputBuffer()
andMediaCodec.queueInputBuffer()
with the index, if configured to use the Block Model API, apps should useMediaCodec.getQueueRequest
with the index, attaching a LinearBlock/HardwareBuffer to the slot. -
onOutputBufferAvailable()
- Instead of calling
MediaCodec.getOutputBuffer()
with the index, apps may useMediaCodec.getOutputFrame()
with the index to get theOutputFrame
object with more information and LinearBlock/HardwareBuffer buffers.
Low-latency decoding in MediaCodec
Android 11 enhances MediaCodec
to support low-latency decoding for games and other real-time apps. You can check whether a codec supports low-latency decoding by passing FEATURE_LowLatency
to MediaCodecInfo.CodecCapabilities.isFeatureSupported()
.
To turn low-latency decoding on or off, do either of the following:
- Set the new key
KEY_LOW_LATENCY
to 0 or 1 usingMediaCodec.configure()
. - Set the new parameter key
PARAMETER_KEY_LOW_LATENCY
to 0 or 1 usingMediaCodec.setParameters()
.
New AAudio function AAudioStream_release()
The function AAudioStream_close()
releases and closes an audio stream at the same time. This can be dangerous. If another process tries to access the stream after it's been closed, the process will crash.
The new function AAudioStream_release()
releases the stream but does not close it. This frees its resources and leaves the stream in a known state. The object persists until you call AAudioStream_close()
.
MediaParser API
MediaParser is a new low level API for media extraction. It is more flexible than MediaExtractor and provides additional control over media extraction functionality.
Audio capture from a USB device
When an application without RECORD_AUDIO
permission uses UsbManager
to request direct access to a USB audio device with audio capture capability (such as a USB headset), a new warning message appears asking the user to confirm permission to use the device. The system ignores any “always use” option, so the user must acknowledge the warning and grant permission every time an app requests access.
To avoid this behavior, your app should request the RECORD_AUDIO
permission.
Concurrent mic access
Android 11 adds new methods to the AudioRecord
, MediaRecorder
, and AAudioStream
APIs. These methods enable and disable the ability to capture concurrently regardless of the selected use case. See Sharing Audio Input .
Output switcher
Android 11 implements new behavior for apps that use the cast and mediarouter APIs.
In addition to accessing casting options from within an app the switching options also appear in the system media player. This helps to give the user a seamless journey when moving between devices as they change their viewing and listening contexts, such as watching video in the kitchen versus on a phone, or listening to audio in the home or car. See the output switcher .
Возможности подключения
Wi-Fi Passpoint enhancements
For information on Passpoint capabilities added in Android 11, see Passpoint .
Wi-Fi Suggestion API is expanded
Android 11 expands the Wi-Fi Suggestion API to increase your app's network management capabilities, including the following:
- Connectivity management apps can manage their own networks by allowing disconnection requests.
- Passpoint networks are integrated into the Suggestion API and can be suggested to the user.
- Analytics APIs enable you to get information about the quality of your networks.
CallScreeningService updates
Starting in Android 11, a CallScreeningService can request information about the STIR/SHAKEN verification status (verstat) for incoming calls. This information is provided as part of the call details for incoming calls.
If a CallScreeningService
holds the READ_CONTACTS
permission, the app is notified when there are incoming calls from, or outgoing calls to, a number in the user's contacts.
For more information, see Prevent caller ID spoofing .
Open Mobile API updates
For information on OMAPI support on Android 11 and higher, see Open Mobile API reader support .
Performant VPNs
Apps that target API level 30 and higher or that are running on devices launched on API level 29 and higher can apply IKEv2/IPsec to VPNs for both user-configured and app-based VPNs.
The VPNs run native to the operating system, simplifying the code required to establish IKEv2/IPsec VPN connections in an app.
Per-process network access control
For information on enabling network access on a per-process basis, see Manage network usage .
Allow multiple installed Passpoint configurations with the same FQDN
Starting in Android 11, you can use PasspointConfiguration.getUniqueId()
to get a unique identifier for a PasspointConfiguration
object, which enables your app's users to install multiple profiles with the same fully qualified domain name (FQDN).
This functionality is helpful when a carrier deploys more than one combination of Mobile Country Code (MCC) and Mobile Network Code (MNC) on their network, but has only a single FQDN. On Android 11 and higher, it is possible to install more than one profile with the same FQDN that will match the network as the Home provider when the user installs a SIM with either MCC or MNC.
GNSS antenna support
Android 11 introduces the GnssAntennaInfo
class, which makes it possible for your app to make more use of centimeter-accuracy positioning that the Global Navigation Satellite System (GNSS) can provide.
Learn more in the guide on antenna calibration information .
Графика
NDK image decoder
The NDK ImageDecoder
API provides a standard API for Android C/C++ apps to decode images directly. App developers no longer need to use the framework APIs (via JNI) or bundle third-party image-decoding libraries. For more information, see the Image decoder developer guide .
Frame rate API
Android 11 provides an API that enables apps to inform the system of their intended frame rate, to reduce judder on devices that support multiple refresh rates. For information on how to use this API, see the Frame rate guide .
Requesting and checking for low latency support
Certain displays can perform graphics post-processing, such as some external displays and TVs. This post-processing improves the graphics but can increase latency. Newer displays which support HDMI 2.1 have an auto low latency mode ( ALLM , also known as game mode ), which minimizes latency by switching off this post-processing. For more details on ALLM, refer to the HDMI 2.1 specification .
A window can request that auto low latency mode be used, if it is available. ALLM is particularly useful for applications like games and videoconferencing, where low latency is more important than having the best possible graphics.
To toggle minimal post-processing on or off, call Window.setPreferMinimalPostProcessing()
, or set the window's preferMinimalPostProcessing
attribute to true
. Not all displays support minimal post-processing; to find out if a particular display does support it, call the new method Display.isMinimalPostProcessingSupported()
.
Performant graphics debug layer injection
Applications can now load external graphics layers ( GLES , Vulkan ) into native application code to expose the same functionality as a debuggable app, but without incurring the performance overhead. This feature is especially important when profiling your application with tools like GAPID . To profile your app, include the following meta-data element in your app manifest file instead of making the application debuggable:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
Images and camera
Mute notification sounds and vibrations during active capture
Beginning with Android 11, when actively using the camera, your app can mute only vibrations, both sounds and vibrations, or neither using setCameraAudioRestriction()
.
Expanded camera support in Android emulator
For information on the expanded support for cameras in the emulator starting with Android 11, see Camera support .
Support for concurrent use of more than one camera
Android 11 adds APIs to query support for using more than one camera at a time, including both a front-facing and rear-facing camera.
To check for support on the device on which your app is running, use the following methods:
-
getConcurrentCameraIds()
returns aSet
of combinations of camera IDs that can stream concurrently with guaranteed stream combinations when configured by the same application process. -
isConcurrentSessionConfigurationSupported()
queries whether camera devices can concurrently support the corresponding session configurations.
Better support for HEIF images with multiple frames
Beginning with Android 11, if you call ImageDecoder.decodeDrawable()
and pass an HEIF image containing a sequence of frames (such as an animation or a burst photo), the method returns an AnimatedImageDrawable
containing the entire image sequence. On earlier versions of Android, the method returned a BitmapDrawable
of just a single frame.
If the HEIF graphic contains multiple frames that are not in a sequence, you can retrieve an individual frame by calling MediaMetadataRetriever.getImageAtIndex()
.
Доступность
Updates for accessibility service developers
If you create a custom accessibility service, you can use the following features in Android 11:
- The user-facing explanation of an accessibility service now allows for HTML and images in addition to plain text. This flexibility makes it easier to explain to end-users what your service does and how it can help them.
- To work with a description of a UI element's state that's more semantically meaningful than
contentDescription
, call thegetStateDescription()
method. - To request that touch events bypass the system's touch explorer, call
setTouchExplorationPassthroughRegion()
. Similarly, to request that gestures bypass the system's gesture detector, callsetGestureDetectionPassthroughRegion()
. - You can request IME actions, such as "enter" and "next", as well as screenshots of windows that don't enable the
FLAG_SECURE
flag.
Дополнительные возможности
App process exit reasons
Android 11 introduces the ActivityManager.getHistoricalProcessExitReasons()
method, which reports the reasons for any recent process terminations. Apps can use this method to gather crash diagnostic information, such as whether a process termination is due to ANRs, memory issues, or other reasons. Additionally, you can use the new setProcessStateSummary()
method to store custom state information for later analysis.
The getHistoricalProcessExitReasons()
method returns instances of the ApplicationExitInfo
class, which contains information related to an app process's death. By calling getReason()
on an instance of this class, you can determine why your app's process was killed. For example, a return value of REASON_CRASH
indicates that an unhandled exception occurred in your app. If your app needs to ensure uniqueness for exit events, it can maintain an app-specific identifier, such as a hash value based on the timestamp from the getTimestamp()
method.
Дополнительные ресурсы
For more information, read the article about new Android 11 tools to make apps more private and stable on Medium.
Resource loaders
Android 11 introduces a new API that allows apps to dynamically extend how resources are searched and loaded. The new API classes ResourcesLoader
and ResourcesProvider
are primarily responsible for providing the new functionality. Together, they provide the ability to supply additional resources and assets, or modify the values of existing resources and assets.
ResourcesLoader
objects are containers that supply ResourcesProvider
objects to an app's Resources
instance. In turn, ResourcesProvider
objects provide methods to load resource data from APKs and resource tables.
One primary use case for this API is custom asset loading. You can use loadFromDirectory()
to create a ResourcesProvider
that redirects the resolution of file-based resources and assets, causing it to search a specific directory rather than the application APK. You can access these assets through the open()
family of methods from the AssetManager
API class, just like with assets bundled in the APK.
APK signature scheme v4
Android 11 adds support for APK Signature Scheme v4 . This scheme produces a new kind of signature in a separate file ( apk-name .apk.idsig
) but is otherwise similar to v2 and v3. No changes are made to the APK. This scheme supports ADB incremental APK installation , which speeds up APK install.
Dynamic intent filters
In order to receive intents, an app must declare at compile time which types of data it is able to receive by defining an intent filter in the app manifest. In Android 10 and lower, apps have no way of changing their intent filters at runtime. This is a problem for virtualization apps (such as virtual machines and remote desktops) because they have no way of knowing exactly what software the user will install inside them.
Android 11 introduces MIME groups, a new manifest element which allows an app to declare a dynamic set of MIME types in an intent filter and modify it programmatically at runtime. To use a MIME group, include a data element in your app manifest with the new android:mimeGroup
attribute:
<intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeGroup="myMimeGroup"/> </intent-filter>
The value of the android:mimeGroup
attribute is an arbitrary string ID that identifies the MIME group at runtime. You can access and update the contents of a MIME group by passing its ID to the following new methods in the PackageManager
API class:
When you add a MIME type to a MIME group programmatically, it functions exactly the same as a static MIME type explicitly declared in the manifest.
Autofill enhancements
Android 11 introduces improvements for autofill services.
Hint identifiers in AssistStructure.ViewNode
It is often useful for autofill services to compute a signature hash for a view based on the view's properties. The view hint is a particularly good property to include when computing a signature hash, but the hint string might change with the phone's locale. To solve this problem, Android 11 expands AssistStructure.ViewNode
with a new getHintIdEntry()
method, which returns the resource identifier for a view's hint text. This method provides a locale-independent value that you can use to compute signature hashes.
Datasets shown events
To help autofill services improve their suggestions, Android 11 provides a way to identify cases where an autofill service presented datasets but the user did not select any of them. In Android 11, FillEventHistory
reports a new TYPE_DATASETS_SHOWN
event type. FillEventHistory
logs an event of this type whenever the autofill service presents one or more datasets to the user. Autofill services can use these events in conjunction with the existing TYPE_DATASET_SELECTED
event to determine whether the user selected any of the provided autofill options.
IME integration
Keyboards and other IMEs can now display autofill suggestions inline, in a suggestion strip or similar interface, instead of in a drop-down menu. To protect sensitive information like passwords and credit-card numbers, the suggestions are displayed to the user but are not known to the IME until the user selects one. For information on how IMEs and password managers can support this feature, see Integrating autofill with keyboards .
Data sharing with content capture service
Starting in Android 11, your app can share data with the device's content capture service. This capability makes it easier for a device to deliver in-context intelligence, such as showing the name of a song that's currently playing in the user's environment.
To make data from your app available to the content capture service, call the shareData()
method on an instance of ContentCaptureManager
. If the system accepts the data-sharing request, your app receives a write-only file descriptor to share with the content capture service.