В 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 . Подробную информацию о новых 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
. Если система принимает запрос на совместное использование данных, ваше приложение получает дескриптор файла, доступный только для записи, для обмена со службой захвата контента.