В Android 10 появилось множество новых функций и возможностей для пользователей и разработчиков. В этом документе рассказывается о том, что доступно разработчикам.
Чтобы узнать больше об API, прочитайте отчет о различиях API или посетите справочный центр Android API и найдите 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 на странице об изменениях в поведении всех приложений.
Общедоступный Conscrypt API
Начиная с 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.
Подробнее о Wi-Fi Network Request API для одноранговых подключений…
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 Easy Connect
В Android 10 можно использовать Easy Connect для передачи учетных данных Wi-Fi на одноранговое устройство вместо устаревшей технологии WPS.
Приложения могут интегрировать Easy Connect в процесс настройки и инициализации с помощью намерения ACTION_PROCESS_WIFI_EASY_CONNECT_URI.
Подробнее о функции Wi-Fi Easy Connect…
API для подключения Wi-Fi Direct
В Android 10 обновлены классы API WifiP2pConfig и WifiP2pManager, чтобы поддерживать возможности быстрого подключения к Wi-Fi Direct с использованием заранее определенной информации. Эта информация передается по дополнительному каналу, например Bluetooth или NFC.
В примере кода ниже показано, как создать группу, используя заранее определенную информацию.
Kotlin
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)
Java
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() следующим кодом:
Kotlin
manager.connect(channel, config, null)
Java
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 больше не поддерживается и заменена на CallRedirectionService API. 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, пользователь может перетаскивать ползунок, чтобы управлять воспроизведением.
Native MIDI API
Android Native MIDI API (AMidi) позволяет разработчикам приложений отправлять и получать MIDI-данные с помощью кода C/C++, более тесно интегрируя их с логикой управления звуком C/C++ и сводя к минимуму необходимость в JNI.
Подробную информацию можно найти в статье Android Native MIDI API.
Улучшения MediaCodecInfo
В Android 10 добавлены методы для MediaCodecInfo, которые позволяют получить больше информации о кодеке.
Подробнее о медиакодеках…
Thermal API
При перегреве устройства может снижаться производительность ЦП и/или графического процессора, что может неожиданным образом повлиять на работу приложений и игр. Приложения, использующие сложную графику, тяжелые вычисления или устойчивую сетевую активность, с большей вероятностью столкнутся с проблемами, и они могут различаться на разных устройствах в зависимости от набора микросхем и частот ядра, уровней интеграции, а также упаковки и форм-фактора устройства.
В Android 10 приложения и игры могут использовать API температуры, чтобы отслеживать изменения на устройстве и принимать меры по снижению энергопотребления для восстановления нормальной температуры. Приложения регистрируют прослушиватель в PowerManager, через который система сообщает о текущем температурном статусе, от легкого и умеренного до тяжелого, критического, аварийного и выключения.
Когда устройство сообщает о перегреве, приложения и игры могут помочь, снизив нагрузку на текущую активность, чтобы уменьшить энергопотребление разными способами. Например, потоковые сервисы могут снизить разрешение, битрейт или сетевой трафик, приложение камеры – отключить вспышку или интенсивное улучшение изображений, игра – снизить частоту кадров или тесселяцию полигонов, мультимедийное приложение – уменьшить громкость динамика, а приложение карт – отключить GPS.
Для работы Thermal API требуется новый уровень HAL устройства. В настоящее время он поддерживается на устройствах Pixel с Android 10. Мы работаем с нашими партнерами-производителями устройств, чтобы как можно быстрее обеспечить широкую поддержку в экосистеме.
Камера и изображения
В Android 10 появились следующие новые функции, связанные с камерой и изображениями:
Поддержка монохромной камеры
Поддержка монохромных камер впервые появилась в Android 9 (уровень API 28). В Android 10 добавлено несколько улучшений для поддержки монохромных камер:
- Поддержка формата потока Y8 для повышения эффективности использования памяти.
- Поддержка монохромной съемки в формате RAW DNG.
- Добавлены перечисления MONO и NIR CFA, чтобы различать обычные монохромные камеры и камеры ближнего инфракрасного диапазона.
Вы можете использовать эту функцию, чтобы сделать черно-белый снимок. Логическое устройство с несколькими камерами может использовать монохромную камеру в качестве физической субкамеры, чтобы улучшить качество изображения при слабом освещении.
Формат динамической глубины резкости
Начиная с Android 10, камеры могут сохранять данные о глубине резкости изображения в отдельном файле, используя новую схему под названием Dynamic Depth Format (DDF). Приложения могут запрашивать как изображение JPG, так и метаданные глубины, используя эту информацию для применения любого размытия при постобработке без изменения исходных данных изображения.
Подробные сведения об этом формате приведены в статье Dynamic Depth Format (Формат динамической глубины резкости).
Формат HEIF
HEIF (High Efficiency Image File) – это стандартный формат изображений и видео, который обеспечивает более высокое качество кодирования и меньший размер файлов по сравнению с другими форматами.
Подробнее о формате файла 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 пользователи могут запустить быстрое включение специальных возможностей на физической клавиатуре, нажав Ctrl + Alt + Z.
Улучшение контроллера экранной клавиатуры
В Android 10 специальные возможности могут запрашивать показ экранной клавиатуры, даже если к устройству подключена физическая клавиатура. Пользователи могут переопределить это поведение.
Пользовательские настройки времени ожидания для специальных возможностей
В Android 10 появился API getRecommendedTimeoutMillis(). Этот метод позволяет задавать время ожидания для интерактивных и неинтерактивных элементов интерфейса. Возвращаемое значение зависит как от настроек пользователя, так и от API специальных возможностей.
Улучшения автозаполнения
В Android 10 сервис автозаполнения был улучшен.
Запросы на автозаполнение, связанные с совместимостью
Чтобы определить, был ли запрос на автозаполнение создан в режиме совместимости, используйте флаг FillRequest.FLAG_COMPATIBILITY_MODE_REQUEST.
Сохранять имя пользователя и пароль одновременно
Если приложение использует несколько действий для отображения имени пользователя, пароля и других полей, вы можете использовать флаг SaveInfo.FLAG_DELAY_SAVE.
Взаимодействие пользователя с интерфейсом сохранения
Вы можете показывать и скрывать поле пароля в диалоговом окне сохранения, настроив прослушиватель действий в диалоговом окне и изменив видимость соответствующего удаленного представления пароля.
Поддержка обновления наборов данных
Автозаполнение может обновлять существующие пароли. Например, если пользователь уже сохранил пароль, а затем сохраняет новый, автозаполнение предлагает обновить существующий пароль, а не сохранять новый.
Улучшения классификации полей
В Android 10 в Field Classification API внесены следующие улучшения:
Конструктор UserData.Builder
Конструктор UserData.Builder был изменен, чтобы лучше соответствовать шаблону Builder.
Разрешить сопоставление значения с несколькими типами идентификаторов категорий
При использовании UserData.Builder в Android 10 теперь можно сопоставлять значение с несколькими типами идентификаторов категорий. В предыдущих версиях в таких случаях возникала ошибка.
Улучшена поддержка номеров кредитных карт.
Теперь классификация полей может распознавать четырехзначные числа как последние четыре цифры номера кредитной карты.
Поддержка классификации полей для конкретных приложений
В Android 10 добавлен метод FillResponse.setUserData(), который позволяет задавать пользовательские данные для конкретного приложения на время сеанса.
Это помогает сервису автозаполнения определять типы полей с контентом, относящимся к приложению.
Элементы управления интерфейсом и системой
В Android 10 улучшен пользовательский интерфейс:
Поддержка возможностей PopFrame в JVMTI
В Android 10 добавлена поддержка функции can_pop_frames в реализации JVMTI для Android. При отладке эта функция позволяет повторно запускать функции после приостановки в точке останова и корректировки локальных, глобальных переменных или реализации функции. Дополнительную информацию можно найти на справочной странице Oracle, посвященной Pop Frame.
Surface Control API
В Android 10 есть API SurfaceControl для низкоуровневого доступа к системному компоновщику (SurfaceFlinger). Большинству пользователей для работы с компоновщиком лучше всего подходит SurfaceView. API SurfaceControl может быть полезен в определенных случаях, например:
- Синхронизация нескольких платформ
- Встраивание поверхности между процессами
- Управление жизненным циклом на более низком уровне
API SurfaceControl доступен в привязках SDK и NDK.
Реализация NDK включает API для ручного обмена буферами с композитором. Это альтернатива для пользователей, которые столкнулись с ограничениями BufferQueue.
Обнаружение зависшего рендерера WebView
В Android 10 появился абстрактный класс WebViewRenderProcessClient, который приложения могут использовать, чтобы определять, перестал ли отвечать объект WebView. Чтобы использовать этот класс:
- Определите собственный подкласс и реализуйте его методы
onRenderProcessResponsive()иonRenderProcessUnresponsive(). - Прикрепите экземпляр
WebViewRenderProcessClientк одному или нескольким объектамWebView. - Если
WebViewперестает отвечать, система вызывает методonRenderProcessUnresponsive()клиента, передаваяWebViewиWebViewRenderProcess. ЕслиWebView– однопроцессный, то параметрWebViewRenderProcessимеет значение null. Приложение может выполнить соответствующее действие, например показать диалоговое окно с вопросом, хочет ли пользователь остановить процесс отрисовки.
Если WebView не отвечает, система периодически вызывает onRenderProcessUnresponsive() (не чаще одного раза в пять секунд), но не предпринимает никаких других действий.
Если WebView снова начнет отвечать, система вызовет onRenderProcessResponsive() только один раз.
Панели настроек
В Android 10 появились панели настроек – API, который позволяет приложениям показывать пользователям настройки в контексте приложения. Благодаря этому пользователям не нужно переходить в Настройки, чтобы изменить параметры NFC или мобильного интернета для работы с приложением.
Например, пользователь открывает браузер, когда на устройстве включен режим полета. До Android 10 приложение могло только показывать общее сообщение с просьбой открыть Настройки и восстановить подключение. В Android 10 браузер может показывать встроенную панель с основными настройками подключения, такими как режим полета, Wi-Fi (включая сети поблизости) и мобильный интернет. С помощью этой панели пользователи могут восстановить подключение, не выходя из приложения.
Чтобы показать панель настроек, активируйте намерение с помощью одного из следующих действий Settings.Panel:
Kotlin
val panelIntent = Intent(Settings.Panel.settings_panel_type) startActivityForResult(panelIntent)
Java
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 улучшена функция "Поделиться":
Sharing Shortcuts API
Sharing Shortcuts API заменяет Direct Share API.
Вместо того чтобы получать результаты по запросу, Sharing Shortcuts API позволяет приложениям заранее публиковать прямые цели для отправки. Вот как работает ShortcutManager.
Поскольку эти API похожи, мы расширили ShortcutInfo API, чтобы упростить использование обеих функций. С помощью Sharing Shortcuts API можно напрямую назначать категории или людей в качестве цели для отправки. Цели для отправки сохраняются в системе, пока приложение не обновит их или не будет удалено.
Старый механизм прямого обмена по-прежнему работает, но приложения, которые его используют, имеют более низкий приоритет, чем приложения, использующие Sharing Shortcuts API.
ShortcutInfo.Builder
добавляет и улучшает методы предоставления дополнительной информации о цели обмена.
Получатели Direct Share
Вы можете опубликовать динамический ярлык как цель прямого обмена. Подробнее о публикации получателей Direct Share…
ShortcutManagerCompat – это новый API AndroidX, который обеспечивает обратную совместимость со старым DirectShare API. Это предпочтительный способ публикации целей обмена.
Предварительный просмотр текста
Когда приложение делится текстовым контентом, оно может показывать его предварительную версию в интерфейсе Sharesheet.
Подробнее о добавлении форматированного текста…
Подробнее…
Подробнее о том, как приложения могут обмениваться данными, рассказывается в статьях Отправка простых данных в другие приложения и Получение простых данных от других приложений.
Тёмная тема
В Android 10 есть тёмная тема, которая применяется как к системному интерфейсу, так и к приложениям, запущенным на устройстве. Подробнее о тёмной теме…
Типы активных служб
В Android 10 появился атрибут манифеста XML foregroundServiceType, который включается в определение некоторых сервисов. Одной службе можно назначить несколько типов активных служб, но это редко бывает целесообразно.
В таблице ниже перечислены типы активных служб и указано, для каких служб подходит каждый из них.
| Тип активной службы | Пример использования службы, для которой нужно объявить этот тип |
|---|---|
connectedDevice
| Отслеживать данные с фитнес-трекера. |
dataSync
| Скачивание файлов из сети |
location
| Продолжение действия, инициированного пользователем |
mediaPlayback
| Как включить аудиокнигу, подкаст или музыку |
mediaProjection
| Запишите короткое видео с экрана устройства. |
phoneCall
| Управление текущим телефонным звонком |
Kotlin
В Android 10 добавлены следующие обновления для разработки на Kotlin.
Аннотации допустимости значения NULL для API libcore
В Android 10 улучшен охват аннотаций допустимости значения NULL в SDK для API libcore. Эти аннотации позволяют разработчикам приложений, использующим анализ допустимости значения NULL в Kotlin или Java в Android Studio, получать информацию о допустимости значения NULL при взаимодействии с этими API.
Обычно нарушения контракта допустимости значения NULL в Kotlin приводят к ошибкам компиляции. Чтобы обеспечить совместимость с существующим кодом, добавляются только аннотации @RecentlyNullable и @RecentlyNonNull. Это означает, что нарушения допустимости значения NULL приводят к предупреждениям, а не к ошибкам.
Кроме того, все аннотации @RecentlyNullable и @RecentlyNonNull, добавленные в Android 9, будут заменены на @Nullable и @NonNull соответственно.
Это означает, что в Android 10 и более поздних версиях нарушения допустимости значения NULL приводят к ошибкам, а не к предупреждениям.
Подробнее об изменениях в аннотациях читайте в статье Android Pie SDK is now more Kotlin-friendly (SDK для Android Pie теперь лучше поддерживает Kotlin) в блоге для разработчиков Android.
NDK
В Android 10 внесены следующие изменения NDK.
Улучшенная отладка права собственности на дескриптор файла.
В Android 10 добавлен инструмент fdsan, который помогает находить и устранять проблемы с правами собственности на дескрипторы файлов.
Ошибки, связанные с неправильной обработкой права собственности на дескриптор файла, которые обычно проявляются как use-after-close и double-close, аналогичны ошибкам распределения памяти use-after-free и double-free, но их гораздо сложнее диагностировать и исправить. fdsan пытается обнаружить и/или предотвратить неправильное управление дескрипторами файлов, обеспечивая соблюдение права собственности на них.
Подробнее о сбоях, связанных с этими проблемами, рассказывается в статье Обнаружена ошибка fdsan. Подробнее о fdsan…
ELF TLS
Приложения, созданные с помощью NDK с минимальным уровнем API 29, могут использовать ELF TLS вместо emutls. Для поддержки этого метода обработки локальных переменных потока была добавлена поддержка динамического и статического компоновщика.
Для приложений, созданных для уровня API 28 и ниже, были реализованы улучшения, позволяющие libgcc/compiler-rt обходить некоторые проблемы emutls.
Подробную информацию можно найти в статье Изменения в Android для разработчиков NDK.
Runtime
В Android 10 внесены следующие изменения в среду выполнения.
Запуск сборки мусора на основе mallinfo
Когда небольшие объекты Java ссылаются на огромные объекты в куче C++, объекты C++ часто можно восстановить только после того, как объект Java будет собран и, например, завершен. В предыдущих выпусках платформа оценивала размеры многих объектов C++, связанных с объектами Java. Эта оценка не всегда была точной и иногда приводила к значительному увеличению использования памяти, поскольку платформа не могла выполнить сборку мусора, когда это было необходимо.
В Android 10 сборщик мусора отслеживает общий размер кучи, выделенной системным 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().