Обзор функций и API

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

Дополнительную информацию о разговорах и о том, как ваше приложение может их поддерживать, см. в разделе Люди и разговоры .

Чат-пузыри

Разработчикам теперь доступны пузыри , которые помогают поддерживать диалоги в системе. В Android 10 пузыри были экспериментальной функцией, которая была включена через опцию разработчика; в Android 11 это больше не требуется.

Если приложение предназначено для Android 11 (уровень API 30) или выше, его уведомления не отображаются в виде всплывающих окон, если только оно не соответствует новым требованиям к диалогу . В частности, уведомление должно быть связано с ярлыком.

До Android 11, чтобы уведомление отображалось всплывающим, требовалось явно указать, что уведомление настроено на постоянный запуск в режиме пользовательского интерфейса документа. Начиная с Android 11, больше нет необходимости явно указывать эту настройку; если уведомление отображается всплывающим, платформа автоматически устанавливает для него постоянный запуск в режиме пользовательского интерфейса документа.

Внесен ряд улучшений в производительность пузырей, и пользователи получили больше гибкости в их включении и отключении в каждом приложении. Для разработчиков, реализовавших экспериментальную поддержку, в API Android 11 внесено несколько изменений:

Визуальные индикаторы 5G

Информацию об отображении индикаторов 5G на устройствах пользователей см. в статье Сообщите пользователям, что они подключены к сети 5G .

Конфиденциальность

В Android 11 представлено множество изменений и ограничений для повышения конфиденциальности пользователей. Подробнее см. на странице «Конфиденциальность» .

Безопасность

Обновления биометрической аутентификации

Чтобы помочь вам контролировать уровень безопасности данных вашего приложения, Android 11 предлагает ряд улучшений биометрической аутентификации. Эти изменения также представлены в библиотеке Jetpack Biometric .

Типы аутентификации

В Android 11 представлен интерфейс BiometricManager.Authenticators , который можно использовать для объявления типов аутентификации, поддерживаемых вашим приложением .

Определите, какой тип аутентификации использовался

После аутентификации пользователя вы можете проверить, использовал ли он учетные данные устройства или биометрические данные, вызвав getAuthenticationType() .

Дополнительная поддержка ключей авторизации на использование

Android 11 обеспечивает расширенную поддержку аутентификации с использованием ключей аутентификации на каждый сеанс использования .

Устаревшие методы

В Android 11 отменены следующие методы:

  • Метод setDeviceCredentialAllowed() .
  • Метод setUserAuthenticationValidityDurationSeconds() .
  • Перегруженная версия canAuthenticate() , не принимающая аргументов.

Безопасный обмен большими наборами данных

В некоторых ситуациях, например, при машинном обучении или воспроизведении медиаконтента, вашему приложению может потребоваться использовать тот же большой набор данных, что и другое приложение. В предыдущих версиях Android вашему приложению и другому приложению приходилось загружать отдельную копию одного и того же набора данных.

Чтобы уменьшить избыточность данных как в сети, так и на диске, Android 11 позволяет кэшировать большие наборы данных на устройстве с помощью общих объектов данных . Подробнее об общем доступе к наборам данных см. в подробном руководстве по общему доступу к большим наборам данных .

Выполнять шифрование файлов после перезапуска OTA без учетных данных пользователя

После завершения беспроводного обновления и перезагрузки устройства ключи с шифрованием учётных данных (CE), помещённые в хранилище с защитой учётных данных, сразу же становятся доступны для операций шифрования на основе файлов (FBE) . Это означает, что после беспроводного обновления ваше приложение может возобновить операции, требующие ключей CE, до того, как пользователь введёт PIN-код, графический ключ или пароль.

Производительность и качество

Беспроводная отладка

Android 11 поддерживает беспроводное развёртывание и отладку приложений с рабочей станции через Android Debug Bridge (adb). Например, вы можете развернуть отлаживаемое приложение на нескольких удалённых устройствах, не подключая их физически по USB и не сталкиваясь с распространёнными проблемами USB-подключения, такими как установка драйверов. Подробнее см. в разделе Запуск приложений на аппаратном устройстве .

Инкрементная установка APK ADB

Установка больших (более 2 ГБ) APK-файлов на устройство может занять много времени, даже если в приложение вносятся лишь небольшие изменения. Инкрементная установка 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 представляет новые элементы управления, которые помогают машинному обучению работать гладко:

NDK Thermal API

Перегрев устройств может приводить к снижению производительности центрального и/или графического процессора, что может непредсказуемо повлиять на работу приложений. Приложения и игры, использующие сложную графику, ресурсоёмкие вычисления или длительную сетевую активность, чаще сталкиваются с проблемами.

Используйте API NDK Thermal в Android 11 для отслеживания изменений температуры устройства и принятия мер для снижения энергопотребления и поддержания более низкой температуры устройства. Этот API аналогичен API Java Thermal ; его можно использовать для получения уведомлений об изменении температуры или для непосредственного запроса текущего состояния.

Текст и ввод

Улучшенные переходы 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() {}
       });

Обновления библиотек отделения интенсивной терапии

Android 11 обновляет пакет android.icu для использования версии 66 библиотеки ICU по сравнению с версией 63 в Android 10. Новая версия библиотеки включает обновленные данные локали CLDR и ряд улучшений поддержки интернационализации в Android.

Наиболее заметные изменения в новых версиях библиотеки включают следующее:

  • Многие API форматирования теперь поддерживают новый тип возвращаемого объекта, расширяющий FormattedValue .
  • API LocaleMatcher улучшен за счет класса-конструктора, поддержки типа java.util.Locale и класса результата, содержащего дополнительные данные о совпадении.
  • Теперь поддерживается Unicode 13.

СМИ

Выделение буферов MediaCodec

В Android 11 появился новый API MediaCodec , который предоставляет приложениям больше контроля над распределением входных и выходных буферов. Это позволяет приложению эффективнее управлять памятью.

Новые классы:
Новые методы:

Кроме того, изменилось поведение двух методов в 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() .

Чтобы включить или отключить декодирование с малой задержкой, выполните одно из следующих действий:

Новая функция AAudio AAudioStream_release()

Функция AAudioStream_close() одновременно освобождает и закрывает аудиопоток. Это может быть опасно. Если другой процесс попытается получить доступ к потоку после его закрытия, процесс завершится аварийно.

Новая функция AAudioStream_release() освобождает поток, но не закрывает его. Это освобождает ресурсы и оставляет поток в известном состоянии. Объект сохраняется до вызова AAudioStream_close() .

API MediaParser

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

Информацию о возможностях Passpoint, добавленных в Android 11, см. в разделе Passpoint .

API предложений Wi-Fi расширен

В Android 11 расширен API Wi-Fi Suggestion, что позволяет расширить возможности управления сетью в вашем приложении, включая следующее:

  • Приложения для управления подключением могут управлять собственными сетями, разрешая запросы на отключение.
  • Сети точек доступа интегрированы в Suggestion API и могут быть предложены пользователю.
  • Аналитические API позволяют вам получать информацию о качестве ваших сетей.

Обновления CallScreeningService

Начиная с Android 11, служба CallScreeningService может запрашивать информацию о статусе проверки STIR/SHAKEN (verstat) для входящих вызовов. Эта информация предоставляется в составе сведений о входящих вызовах.

Если CallScreeningService имеет разрешение READ_CONTACTS , приложение уведомляется о входящих вызовах с номера из контактов пользователя или исходящих вызовах на него.

Дополнительную информацию см. в разделе Предотвращение подмены идентификатора вызывающего абонента .

Обновления Open Mobile API

Информацию о поддержке OMAPI в Android 11 и более поздних версиях см. в разделе Поддержка считывателей Open Mobile API .

Эффективные VPN

Приложения, ориентированные на API уровня 30 и выше или работающие на устройствах, запущенных на API уровня 29 и выше, могут применять IKEv2/IPsec к VPN как для настраиваемых пользователем, так и для VPN на основе приложений.

VPN-сети работают на уровне операционной системы, упрощая код, необходимый для установления VPN-подключений IKEv2/IPsec в приложении.

Контроль доступа к сети на уровне процессов

Информацию о включении сетевого доступа для каждого процесса см. в разделе Управление использованием сети .

Разрешить установку нескольких конфигураций Passpoint с одним и тем же полным доменным именем

Начиная с Android 11, вы можете использовать PasspointConfiguration.getUniqueId() для получения уникального идентификатора для объекта PasspointConfiguration , что позволяет пользователям вашего приложения устанавливать несколько профилей с одним и тем же полным доменным именем (FQDN).

Эта функция полезна, когда оператор использует в своей сети несколько комбинаций мобильного кода страны (MCC) и кода мобильной сети (MNC), но использует только одно полное доменное имя (FQDN). В Android 11 и более поздних версиях можно установить несколько профилей с одним и тем же полным доменным именем, которые будут соответствовать сети домашнего оператора, если пользователь устанавливает SIM-карту с MCC или MNC.

Поддержка антенн GNSS

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