Функции и API Android 10

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

Чтобы узнать об API, прочтите отчет о различиях API или посетите справочник по API Android — найдите API, которые были «добавлены на уровне API 29». Также обязательно ознакомьтесь с изменениями в поведении Android 10 (для приложений, ориентированных на уровень API 29 и для всех приложений ), а также с изменениями конфиденциальности , чтобы узнать об областях, в которых изменения платформы могут повлиять на ваши приложения.

Улучшения безопасности

В Android 10 представлен ряд функций безопасности, которые кратко описаны в следующих разделах.

Улучшенные диалоги биометрической аутентификации.

В Android 10 представлены следующие улучшения поддержки биометрической аутентификации :

  • Проверка возможности биометрической аутентификации.
  • Резервный механизм, который позволяет пользователю проходить аутентификацию с использованием PIN-кода, шаблона или пароля своего устройства, если он не может пройти аутентификацию с помощью биометрических данных.
  • Подсказка, которая сообщает системе, что не требуется подтверждение пользователя после того, как пользователь прошел аутентификацию с использованием неявной биометрической модальности. Например, вы можете указать системе, что после аутентификации пользователя с использованием аутентификации по лицу дальнейшее подтверждение не требуется.

Запускайте встроенный код DEX прямо из APK

Начиная с Android 10, вы можете указать платформе запускать встроенный код DEX непосредственно из APK-файла вашего приложения. Этот параметр может помочь предотвратить атаку, если злоумышленнику когда-либо удастся подделать локально скомпилированный код на устройстве.

Дополнительную информацию см. в разделе «Запуск встроенного кода DEX непосредственно из APK» .

Поддержка TLS 1.3

В Android 10 добавлена ​​поддержка TLS 1.3 . TLS 1.3 — это крупная версия стандарта TLS, которая включает преимущества производительности и повышенную безопасность. Наши тесты показывают, что безопасные соединения могут быть установлены на 40 % быстрее при использовании TLS 1.3 по сравнению с TLS 1.2.

Дополнительные сведения о нашей реализации TLS 1.3 см. в разделе TLS на странице изменений поведения для всех приложений .

Публичный API-интерфейс Conscrypt

Начиная с Android 10, поставщик безопасности Conscrypt включает общедоступный API для функций TLS.

Коллекция классов в android.net.ssl ​​содержит статические методы для доступа к функциям, недоступным из общих API-интерфейсов javax.net.ssl . Имена этих классов можно интерпретировать как множественное число соответствующего класса javax.net.ssl . Например, код, который работает с экземплярами javax.net.ssl.SSLSocket может вместо этого использовать методы из SSLSockets .

Возможности подключения

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

API подключения к сети Wi-Fi

В Android 10 добавлена ​​поддержка одноранговых соединений. Эта функция позволяет вашему приложению предлагать пользователю изменить точку доступа, к которой подключено устройство, с помощью WifiNetworkSpecifier для описания свойств запрошенной сети. Одноранговое соединение используется для целей, не связанных с обеспечением сети, например для настройки начальной загрузки вторичных устройств, таких как оборудование Chromecast и Google Home.

Дополнительные сведения см. в разделе API запроса сети Wi-Fi для однорангового подключения .

API предложения сети Wi-Fi

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

Дополнительные сведения об этой функции см. в разделе «Подсказка Wi-Fi» .

Улучшения в режимах высокой производительности и низкой задержки Wi-Fi.

Android 10 позволяет предоставлять подсказку базовому модему, чтобы минимизировать задержку.

Android 10 расширяет API блокировки Wi-Fi для эффективной поддержки высокопроизводительного режима и режима с низкой задержкой. Экономия энергии Wi-Fi отключена для режима высокой производительности и малой задержки, а дальнейшая оптимизация задержки может быть включена в режиме малой задержки, в зависимости от поддержки модема.

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

Специализированный поиск в преобразователе DNS

В Android 10 добавлена ​​встроенная поддержка специализированного поиска DNS с использованием как поиска открытого текста, так и режима DNS-over-TLS. Ранее преобразователь DNS платформы поддерживал только записи A и AAAA, которые позволяли искать только IP-адреса, связанные с именем, но не поддерживал никакие другие типы записей. API DnsResolver обеспечивает универсальное асинхронное разрешение, позволяющее искать SRV , NAPTR и другие типы записей. Обратите внимание, что анализ ответа остается на усмотрение приложения.

О приложениях на основе NDK см. android_res_nsend .

Wi-Fi Легкое подключение

Android 10 позволяет использовать Easy Connect для предоставления учетных данных Wi-Fi одноранговому устройству в качестве замены устаревшего протокола WPS. Приложения могут интегрировать Easy Connect в процесс настройки и подготовки с помощью намерения ACTION_PROCESS_WIFI_EASY_CONNECT_URI .

Дополнительную информацию об этой функции см. в разделе Wi-Fi Easy Connect .

API прямого подключения Wi-Fi

Классы API WifiP2pConfig и WifiP2pManager имеют обновления в Android 10 для поддержки возможностей быстрого установления подключения к Wi-Fi Direct с использованием заранее определенной информации. Эта информация передается через побочный канал, например Bluetooth или NFC.

В следующем примере кода показано, как создать группу, используя заранее определенную информацию:

Котлин

val manager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager
val channel = manager.initialize(this, mainLooper, null)

// prefer 5G band for this group
val config = WifiP2pConfig.Builder()
    .setNetworkName("networkName")
    .setPassphrase("passphrase")
    .enablePersistentMode(false)
    .setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)
    .build()

// create a non-persistent group on 5GHz
manager.createGroup(channel, config, null)

Ява

WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
Channel channel = manager.initialize(this, getMainLooper(), null);

// prefer 5G band for this group
WifiP2pConfig config = new WifiP2pConfig.Builder()
.setNetworkName("networkName")
.setPassphrase("passphrase")
.enablePersistentMode(false)
.setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)
.build();

// create a non-persistent group on 5GHz
manager.createGroup(channel, config, null);

Чтобы присоединиться к группе с использованием учетных данных, замените manager.createGroup() на следующее:

Котлин

manager.connect(channel, config, null)

Ява

manager.connect(channel, config, null);

Каналы, ориентированные на соединение Bluetooth LE (CoC)

Android 10 позволяет вашему приложению использовать соединения BLE CoC для передачи больших потоков данных между двумя устройствами BLE. Этот интерфейс абстрагирует механику Bluetooth и подключения для упрощения реализации.

Возможности телефонии

Android 10 включает в себя несколько улучшений, связанных с телефонией.

Улучшение качества звонков

В Android 10 добавлена ​​возможность собирать информацию о качестве текущих вызовов IP Multimedia Subsystem (IMS), включая качество входящих и исходящих вызовов в сети, на устройствах, поддерживающих эту функцию.

Проверка вызовов и идентификатор вызывающего абонента

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

API службы перенаправления вызовов

Android 10 меняет способ обработки намерений вызова. Широковещательная рассылка NEW_OUTGOING_CALL устарела и заменена API CallRedirectionService . API CallRedirectionService предоставляет интерфейсы для изменения исходящих вызовов, выполняемых платформой Android. Например, сторонние приложения могут отменять вызовы и перенаправлять их через VoIP.

Улучшения в создании файлов на внешнем хранилище.

Помимо представления ограниченного хранилища , в Android 10 добавлены следующие возможности, связанные с внешним хранилищем:

  • Вы можете использовать флаг IS_PENDING , чтобы предоставить вашему приложению эксклюзивный доступ к медиафайлу во время его записи на диск.
  • Если вам известно конкретное место, где следует хранить файлы, вы можете дать системе подсказку , где хранить вновь записанные файлы.
  • Каждое внешнее запоминающее устройство имеет уникальное имя тома .

Медиа и графика

В Android 10 представлены следующие новые мультимедийные и графические функции и API:

Совместное использование аудиовхода

Android 10 добавляет возможность двум приложениям одновременно использовать аудиовход. Подробную информацию см. в разделе Общий доступ к аудиовходу .

Захват воспроизведения звука

Android 10 дает приложению возможность захватывать воспроизведение звука из других приложений. Полную информацию см. в разделе Захват воспроизведения .

Панель поиска в уведомлениях MediaStyle

Начиная с Android 10, в уведомлениях MediaStyle отображается панель поиска. Панель поиска показывает ход воспроизведения из PlaybackState.getPosition() , а в некоторых случаях панель поиска может использоваться для поиска места в воспроизводящей программе. Внешний вид и поведение панели поиска контролируются следующими правилами:

  • Панель поиска появляется, если существует активный MediaSession и его продолжительность (указанная MediaMetadata.METADATA_KEY_DURATION ) больше нуля. Это означает, что панель не отображается для неопределенных потоков, таких как прямые трансляции и радиопередачи.
  • Если сеанс реализует ACTION_SEEK_TO пользователь может перетащить панель поиска, чтобы управлять местом воспроизведения.

Собственный MIDI API

Android Native MIDI API (AMidi) дает разработчикам приложений возможность отправлять и получать MIDI-данные с помощью кода C/C++, более тесно интегрируясь с их логикой аудио/управления C/C++ и сводя к минимуму потребность в JNI.

Дополнительные сведения см. в разделе Android Native MIDI API .

Улучшения MediaCodecInfo

В Android 10 к MediaCodecInfo добавлены методы, позволяющие получить дополнительную информацию о кодеке.

Дополнительную информацию см. в разделе Медиа-кодеки .

Термальный API

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

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

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

Для термического API требуется новый уровень HAL устройства — в настоящее время он поддерживается на устройствах Pixel под управлением Android 10, и мы работаем с нашими партнерами-производителями устройств, чтобы как можно быстрее обеспечить широкую поддержку экосистемы.

Камера и изображения

В Android 10 представлены следующие новые функции, связанные с камерой и изображением:

Поддержка монохромной камеры

В Android 9 (уровень API 28) впервые появилась возможность монохромной камеры. В Android 10 добавлено несколько улучшений в поддержку монохромной камеры:

  • Поддержка формата потока Y8 для повышения эффективности использования памяти.
  • Поддержка захвата монохромного необработанного DNG.
  • Введение нумерации CFA MONO и NIR для различения обычных монохромных камер и камер ближнего инфракрасного диапазона.

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

Формат динамической глубины

Начиная с Android 10, камеры могут хранить данные о глубине изображения в отдельном файле, используя новую схему, называемую форматом динамической глубины (DDF). Приложения могут запрашивать как изображение JPG, так и метаданные его глубины, используя эту информацию для применения любого размытия при постобработке без изменения исходных данных изображения.

Чтобы прочитать спецификацию этого формата, см. Формат динамической глубины .

Высокоэффективный формат файла изображения

Формат файла высокоэффективного изображения (HEIF) — это стандартный формат изображений и видео, который обеспечивает более качественное кодирование и меньший размер файла по сравнению с другими форматами файлов.

Дополнительную информацию о формате файла см. в разделе HEIC .

Улучшения в многокамерной работе

В Android 10 улучшено объединение нескольких камер в одну логическую камеру — функция, представленная в Android 9 (уровень API 28). В Camera2 API было добавлено следующее:

  • isSessionConfigurationSupported(SessionConfiguration sessionConfig) — позволяет узнать, можно ли использовать переданную конфигурацию сеанса для создания сеанса захвата камеры.

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

API служб доступности

В Android 10 представлены следующие новые функции и API служб специальных возможностей:

Флаг ключа записи AccessibilityNodeInfo

Начиная с Android 10, вы можете вызвать isTextEntryKey() , чтобы определить, представляет ли данный AccessibilityNodeInfo клавишу ввода текста, которая является частью клавиатуры или клавиатуры.

Голосовая обратная связь в диалоговом окне специальных возможностей

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

Ярлык специальных возможностей при включенной навигации с помощью жестов

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

  • Проведите двумя пальцами вверх.
  • Проведите двумя пальцами вверх и удерживайте.

Ярлык специальных возможностей для физических клавиатур

В Android 10 пользователи могут активировать сочетание клавиш специальных возможностей на физической клавиатуре, нажав Control+Alt+Z .

Улучшение контроллера мягкой клавиатуры

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

Определяемые пользователем тайм-ауты доступности

В Android 10 представлен API getRecommendedTimeoutMillis() . Этот метод обеспечивает поддержку определяемых пользователем тайм-аутов для интерактивных и неинтерактивных элементов пользовательского интерфейса. На возвращаемое значение влияют как предпочтения пользователя, так и API службы доступности.

Улучшения автозаполнения

Android 10 содержит следующие улучшения службы автозаполнения.

Запросы автозаполнения, связанные с совместимостью

Вы можете использовать флаг FillRequest.FLAG_COMPATIBILITY_MODE_REQUEST чтобы определить, был ли создан запрос автозаполнения в режиме совместимости.

Сохраните имя пользователя и пароль одновременно

Вы можете поддерживать случаи, когда приложение использует несколько действий для отображения имени пользователя, пароля и других полей, используя флаг SaveInfo.FLAG_DELAY_SAVE .

Взаимодействие пользователя с пользовательским интерфейсом сохранения

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

Поддержка обновления наборов данных

Автозаполнение может обновлять существующие пароли. Например, если пользователь уже сохранил пароль и сохраняет новый пароль, автозаполнение предлагает пользователю обновить существующий пароль вместо сохранения нового.

Улучшения классификации полей

Android 10 содержит следующие улучшения API классификации полей.

Конструктор UserData.Builder

Конструктор UserData.Builder был изменен и теперь лучше соответствует шаблону Builder .

Разрешить сопоставление значения с несколькими типами идентификаторов категорий.

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

Улучшена поддержка номеров кредитных карт.

Классификация полей теперь может определять четырехзначные числа как последние четыре цифры номера кредитной карты.

Поддержка классификации полей для конкретного приложения.

В Android 10 добавлен FillResponse.setUserData() , который позволяет вам устанавливать пользовательские данные для конкретного приложения на время сеанса. Это помогает службе автозаполнения определять типы полей с содержимым, специфичным для приложения.

Пользовательский интерфейс и элементы управления системой

Android 10 предоставляет следующие улучшения пользовательского интерфейса:

Поддержка ограничений JVMTI PopFrame

В Android 10 добавлена ​​поддержка возможности can_pop_frames в реализации Android JVMTI. При отладке эта функция позволяет повторно запускать функции после паузы в точке останова и настройки локальных, глобальных переменных или реализации функции. Дополнительную информацию см. на справочной странице Oracle Pop Frame .

API управления поверхностью

Android 10 предоставляет API SurfaceControl для низкоуровневого доступа к системному компоновщику ( SurfaceFlinger ). Для большинства пользователей SurfaceView — это правильный способ использования композитора. API SurfaceControl может быть полезен в определенных случаях, например:

  • Синхронизация нескольких поверхностей
  • Межпроцессное встраивание в поверхность
  • Управление сроком службы нижнего уровня

API SurfaceControl доступен как в привязках SDK , так и в NDK. Реализация NDK включает API для ручного обмена буферами с композитором. Это предоставляет альтернативу для пользователей, которые столкнулись с ограничениями BufferQueue .

Обнаружение зависшего рендерера WebView

В Android 10 представлен абстрактный класс WebViewRenderProcessClient , который приложения могут использовать для определения того, перестал ли WebView отвечать на запросы. Чтобы использовать этот класс:

  1. Определите свой собственный подкласс и реализуйте его методы onRenderProcessResponsive() и onRenderProcessUnresponsive() .
  2. Прикрепите экземпляр вашего WebViewRenderProcessClient к одному или нескольким объектам WebView .
  3. Если WebView перестает отвечать на запросы, система вызывает клиентский метод onRenderProcessUnresponsive() , передавая WebView и WebViewRenderProcess . (Если WebView является однопроцессным, параметр WebViewRenderProcess имеет значение null.) Ваше приложение может выполнять соответствующие действия, например показывать пользователю диалоговое окно с вопросом, хотят ли они остановить процесс рендеринга.

Если WebView по-прежнему не отвечает, система периодически вызывает onRenderProcessUnresponsive() (не чаще одного раза в пять секунд), но не предпринимает никаких других действий. Если WebView снова становится отзывчивым, система вызывает onRenderProcessResponsive() только один раз.

Панели настроек

В Android 10 представлены панели настроек — API, который позволяет приложениям показывать пользователям настройки в контексте их приложения. Это избавляет пользователей от необходимости заходить в настройки для изменения таких параметров, как NFC или мобильные данные , чтобы использовать приложение.

Рисунок 1. Пользователь пытается открыть веб-страницу, когда устройство не подключено к сети. Chrome открывает панель настроек подключения к Интернету ...

Рисунок 2. Пользователь может включить Wi-Fi и выбрать сеть, не выходя из приложения Chrome.

Например, предположим, что пользователь открывает веб-браузер, когда его устройство находится в режиме полета. До Android 10 приложение могло отображать только общее сообщение с просьбой открыть настройки для восстановления подключения. В Android 10 приложение браузера может отображать встроенную панель, показывающую ключевые настройки подключения, такие как режим полета, Wi-Fi (включая ближайшие сети) и мобильные данные. С помощью этой панели пользователи могут восстановить соединение, не выходя из приложения.

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

Котлин

val panelIntent = Intent(Settings.Panel.settings_panel_type)
startActivityForResult(panelIntent)

Ява

Intent panelIntent = new Intent(Settings.Panel.settings_panel_type);
startActivityForResult(panelIntent);

settings_panel_type может быть одним из:

ACTION_INTERNET_CONNECTIVITY
Показывает настройки, связанные с подключением к Интернету, такие как режим полета, Wi-Fi и мобильные данные.
ACTION_WIFI
Показывает настройки Wi-Fi, но не другие настройки подключения. Это полезно для приложений, которым требуется соединение Wi-Fi для выполнения больших загрузок или загрузок.
ACTION_NFC
Показывает все настройки, связанные с связью ближнего радиуса действия (NFC).
ACTION_VOLUME
Показывает настройки громкости для всех аудиопотоков.

Делимся улучшениями

В Android 10 реализован ряд улучшений в обмене данными:

Общий доступ к API ярлыков

API Sharing Shortcuts заменяет API Direct Share .

Вместо реактивного получения результатов по запросу API Sharing Shortcuts позволяет приложениям заранее публиковать цели прямого обмена. Вот как работает ShortcutManager . Поскольку эти два API схожи, мы расширили API ShortcutInfo , чтобы упростить использование обеих функций. С помощью API ярлыков общего доступа вы можете напрямую назначать категории или людей для цели общего доступа. Целевые объекты общего доступа сохраняются в системе до тех пор, пока то же приложение не обновит их или приложение не будет удалено.

Старый механизм Direct Share по-прежнему работает, но приложения, использующие его, имеют более низкий приоритет, чем приложения, использующие API ярлыков общего доступа.

ShortcutInfo.Builder добавляет и совершенствует методы для предоставления дополнительной информации о цели общего доступа.

Целевые показатели прямых акций

Вы можете опубликовать динамический ярлык в качестве цели прямого общего доступа. См. Публикация целей прямого распространения .

ShortcutManagerCompat — это новый API AndroidX, обеспечивающий обратную совместимость со старым API DirectShare. Это предпочтительный способ публикации целевых показателей доли.

Предварительный просмотр текста

Когда приложение публикует текстовый контент, оно может отображать дополнительный предварительный просмотр контента в пользовательском интерфейсе Sharesheet.

См. Добавление предварительного просмотра форматированного текста.

Узнать больше

Дополнительные сведения о том, как приложения могут обмениваться данными, см. в разделах «Отправка простых данных в другие приложения» и «Получение простых данных из других приложений».

Темная тема

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

Типы служб переднего плана

В Android 10 представлен атрибут XML-манифеста foregroundServiceType , который вы включаете в определение нескольких конкретных служб. Возможно, хотя это редко бывает целесообразно, назначить несколько типов приоритетных служб для конкретной службы.

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

Тип приоритетной службы Пример варианта использования службы, которая должна объявить этот тип
connectedDevice Следите за носимым фитнес-трекером
dataSync Загрузка файлов из сети
location Продолжить действие, инициированное пользователем
mediaPlayback Включите аудиокнигу, подкаст или музыку
mediaProjection Запишите видео дисплея устройства за короткий промежуток времени
phoneCall Обработка текущего телефонного звонка

Котлин

Android 10 включает следующие обновления для разработки Kotlin.

Аннотации об отсутствии значений для API libcore

В Android 10 улучшено покрытие аннотаций об отсутствии значений в SDK для API-интерфейсов libcore. Эти аннотации позволяют разработчикам приложений, которые используют анализ нулевых значений Kotlin или Java в Android Studio, получать информацию о нулевых значениях при взаимодействии с этими API.

Обычно нарушения контракта на обнуление в Kotlin приводят к ошибкам компиляции. Чтобы обеспечить совместимость с существующим кодом, добавляются только аннотации @RecentlyNullable и @RecentlyNonNull . Это означает, что нарушения допустимости значений NULL приводят к предупреждениям, а не к ошибкам.

Кроме того, любые аннотации @RecentlyNullable или @RecentlyNonNull , добавленные в Android 9, изменяются на @Nullable и @NonNull соответственно. Это означает, что в Android 10 и более поздних версиях нарушения нулевого значения приводят к ошибкам, а не к предупреждениям.

Дополнительные сведения об изменениях аннотаций см. в статье Android Pie SDK теперь более совместим с Kotlin в блоге разработчиков Android.

НДК

Android 10 включает следующие изменения NDK.

Улучшена отладка владения файловым дескриптором.

В Android 10 добавлен fdsan, который помогает вам легче находить и устранять проблемы с владением файловыми дескрипторами.

Ошибки, связанные с неправильным обращением с владением файловым дескриптором, которые обычно проявляются как use-after-close и double-close , аналогичны ошибкам выделения памяти use-after-free и double-free , но их, как правило, гораздо сложнее диагностировать. и исправить. fdsan пытается обнаружить и/или предотвратить неправильное управление файловыми дескрипторами путем принудительного владения файловыми дескрипторами.

Дополнительные сведения о сбоях, связанных с этими проблемами, см. в разделе Ошибка, обнаруженная fdsan . Дополнительную информацию о fdsan можно найти на странице Googlesource fdsan .

ЭЛЬФ ТЛС

Приложения, созданные с использованием NDK с минимальным уровнем API 29, могут использовать ELF TLS вместо emutls . Для поддержки этого метода обработки локальных переменных потока была добавлена ​​поддержка динамического и статического компоновщика.

Для приложений, созданных для уровня API 28 и ниже, в libgcc/compiler-rt были реализованы улучшения, позволяющие обойти некоторые проблемы emutls .

Дополнительные сведения см. в разделе Изменения Android для разработчиков NDK .

Время выполнения

Android 10 включает следующее изменение среды выполнения.

Запуск сборки мусора на основе Mallinfo

Когда небольшие объекты Java платформы ссылаются на огромные объекты в куче C++, объекты C++ часто можно вернуть только тогда, когда объект Java собран и, например, финализирован. В предыдущих выпусках платформа оценивала размеры многих объектов C++, связанных с объектами Java. Эта оценка не всегда была точной и иногда приводила к значительному увеличению использования памяти, поскольку платформа не могла выполнить сборку мусора, когда это должно было быть.

В Android 10 сборщик мусора (GC) отслеживает общий размер кучи, выделенной системой malloc() , гарантируя, что большие выделения malloc() всегда включаются в вычисления, запускающие сборщик мусора. В результате приложения, чередующие большое количество выделений C++ с выполнением Java, могут столкнуться с увеличением частоты сборки мусора. В других приложениях может наблюдаться небольшое снижение.

Тестирование и отладка

Android 10 включает следующие улучшения для тестирования и отладки.

Улучшения для отслеживания системы на устройстве.

Начиная с Android 10, вы можете указать ограничения на размер и продолжительность трассировки при выполнении системной трассировки на устройстве . При указании любого значения система выполняет длинную трассировку, периодически копируя буфер трассировки в файл назначения во время записи трассировки. Трассировка завершается, когда достигаются указанные вами пределы размера или продолжительности.

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

В Android 10 и более поздних версиях файлы трассировки сохраняются в формате, который можно открыть с помощью Perfetto — проекта с открытым исходным кодом для измерения производительности и отслеживания. Файлы трассировки Perfetto можно конвертировать в формат Systrace .

Улучшения TextClassifier

Android 10 предоставляет дополнительные функции классификации текста в интерфейсе TextClassifier .

Распознавание языка

Метод detectLanguage() работает аналогично ранее существовавшим методам классификации. Он получает объект TextLanguage.Request и возвращает объект TextLanguage .

Объекты TextLanguage состоят из списка упорядоченных пар. Каждая пара содержит локаль и соответствующий показатель достоверности классификации.

Рекомендуемые действия в диалоге

Метод suggestConversationActions() работает аналогично существующим методам классификации. Он получает объект ConversationActions.Request и возвращает объект ConversationActions .

Объекты ConversationActions состоят из списка объектов ConversationAction . Каждый объект ConversationAction включает потенциальное предлагаемое действие и его оценку достоверности.

Умные ответы/действия в уведомлениях

В Android 9 появилась возможность отображать предлагаемые ответы в уведомлении. В Android 10 эта возможность расширяется за счет возможности включать предлагаемые действия, основанные на намерениях. Более того, платформа может автоматически генерировать эти предложения. Приложения по-прежнему могут предлагать собственные предложения или отказываться от предложений, генерируемых системой.

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

Если ваше приложение предоставляет собственные предложения, платформа не генерирует никаких автоматических предложений. Если вы не хотите, чтобы в уведомлениях вашего приложения отображались предлагаемые ответы или действия, вы можете отказаться от ответов и действий, генерируемых системой, с помощью setAllowGeneratedReplies() и setAllowSystemGeneratedContextualActions() .