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

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

Подробный список добавленных, измененных и удаленных API см. в отчете о различиях в API . Подробнее о добавленных API см. в справочнике по API Android . Для Android 15 найдите API, добавленные на уровне API 35. Чтобы узнать об областях, где изменения платформы могут повлиять на ваши приложения, ознакомьтесь с изменениями в поведении приложений, ориентированных на Android 15 , и для всех приложений .

Камера и медиа

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

Дополнительную информацию о новейших функциях и решениях для разработчиков в области мультимедиа и камер Android можно найти в докладе «Создание современных возможностей мультимедиа и камер Android» на конференции Google I/O.

Усиление при слабом освещении

В Android 15 представлен Low Light Boost — режим автоматической экспозиции, доступный как для Камеры 2 , так и для расширения камеры для ночного режима . Low Light Boost регулирует экспозицию потока предварительного просмотра в условиях низкой освещенности. Это отличается от того, как расширение камеры для ночного режима создает неподвижные изображения, поскольку ночной режим объединяет серию фотографий для создания единого улучшенного изображения. Хотя ночной режим очень хорошо работает для создания неподвижного изображения, он не может создавать непрерывный поток кадров, а режим Low Light Boost может. Таким образом, Low Light Boost обеспечивает такие возможности камеры, как:

  • Предоставление улучшенного предварительного просмотра изображения, чтобы пользователи могли лучше кадрировать свои снимки при слабом освещении.
  • Сканирование QR-кодов при слабом освещении

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

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

Для получения дополнительной информации см. «Усиление при слабом освещении» .

Управление камерой в приложении

В Android 15 добавлено расширение для большего контроля над оборудованием камеры и ее алгоритмами на поддерживаемых устройствах:

  • Расширенные настройки мощности вспышки позволяют точно контролировать интенсивность вспышки как в режиме SINGLE , так и в режиме TORCH при съемке изображений.

Управление динамическим диапазоном HDR

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

Яркость элементов пользовательского интерфейса SDR на левом экране кажется более однородной, чем яркость на правом экране, что имитирует возможные проблемы с запасом при смешивании контента HDR и SDR. Регулируя запас HDR, вы можете добиться лучшего баланса между SDR и HDR-контентом.

Регулировка громкости

В Android 15 реализована поддержка стандарта громкости CTA-2075, который поможет вам избежать несоответствия громкости звука и гарантировать, что пользователям не придется постоянно регулировать громкость при переключении между контентом. Система использует известные характеристики устройств вывода (наушников и динамика), а также метаданные громкости, доступные в аудиоконтенте AAC, для интеллектуальной регулировки громкости звука и уровней сжатия динамического диапазона.

Чтобы включить эту функцию, вам необходимо убедиться, что метаданные громкости доступны в вашем контенте AAC, и включить функцию платформы в вашем приложении. Для этого вы создаете экземпляр объекта LoudnessCodecController , вызывая его фабричный метод create с идентификатором аудиосеанса из связанного AudioTrack ; это автоматически начнет применять аудиообновления. Вы можете передать OnLoudnessCodecUpdateListener для изменения или фильтрации параметров громкости перед их применением в MediaCodec .

// Media contains metadata of type MPEG_4 OR MPEG_D
val mediaCodec = 
val audioTrack = AudioTrack.Builder()
                                .setSessionId(sessionId)
                                .build()
...
// Create new loudness controller that applies the parameters to the MediaCodec
try {
   val lcController = LoudnessCodecController.create(mSessionId)
   // Starts applying audio updates for each added MediaCodec
}

AndroidX media3 ExoPlayer также будет обновлен для использования API-интерфейсов LoudnessCodecController для плавной интеграции приложений.

Виртуальные устройства MIDI 2.0

В Android 13 добавлена ​​поддержка подключения к устройствам MIDI 2.0 с помощью USB , которые обмениваются данными с помощью универсальных пакетов MIDI (UMP). Android 15 расширяет поддержку UMP на виртуальные MIDI-приложения , позволяя приложениям композиции управлять приложениями синтезатора как виртуальным устройством MIDI 2.0 так же, как если бы они работали с устройством USB MIDI 2.0.

Более эффективное программное декодирование AV1

логотип dav1d

dav1d , популярный программный декодер AV1 от VideoLAN, доступен для устройств Android, которые не поддерживают декодирование AV1 аппаратно. dav1d почти в 3 раза более производительен, чем устаревший программный декодер AV1, что позволяет воспроизводить HD AV1 большему количеству пользователей, включая некоторые устройства низкого и среднего уровня.

Ваше приложение должно согласиться на использование dav1d, вызвав его по имени "c2.android.av1-dav1d.decoder" . В последующем обновлении dav1d станет программным декодером AV1 по умолчанию. Эта поддержка стандартизирована и перенесена на устройства Android 11, которые получают обновления системы Google Play.

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

Хотя большая часть нашей работы по повышению вашей производительности сосредоточена вокруг таких инструментов, как Android Studio , Jetpack Compose и библиотеки Android Jetpack , мы всегда ищем в платформе способы, которые помогут вам легче реализовать ваше видение.

Обновления OpenJDK 17

Android 15 continues the work of refreshing Android's core libraries to align with the features in the latest OpenJDK LTS releases.

The following key features and improvements are included:

These APIs are updated on over a billion devices running Android 12 (API level 31) and higher through Google Play System updates, so you can target the latest programming features.

Улучшения PDF-файлов

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

Последние обновления рендеринга PDF включают такие функции, как поиск во встроенном PDF-файле.

PdfRenderer был перенесен в модуль, который можно обновлять с помощью обновлений системы Google Play независимо от версии платформы, и мы поддерживаем эти изменения обратно в Android 11 (уровень API 30), создавая совместимую версию до Android 15. Поверхность API, называемая PdfRendererPreV .

,

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

Последние обновления рендеринга PDF включают такие функции, как поиск во встроенном PDF-файле.

PdfRenderer был перенесен в модуль, который можно обновлять с помощью обновлений системы Google Play независимо от версии платформы, и мы поддерживаем эти изменения обратно в Android 11 (уровень API 30), создавая совместимую версию до Android 15. Поверхность API, называемая PdfRendererPreV .

,

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

Последние обновления рендеринга PDF включают такие функции, как поиск во встроенном PDF-файле.

PdfRenderer был перенесен в модуль, который можно обновлять с помощью обновлений системы Google Play независимо от версии платформы, и мы поддерживаем эти изменения обратно в Android 11 (уровень API 30), создавая совместимую версию до Android 15. Поверхность API, называемая PdfRendererPreV .

Усовершенствования автоматического переключения языка

Android 14 added on-device, multi-language recognition in audio with automatic switching between languages, but this can cause words to get dropped, especially when languages switch with less of a pause between the two utterances. Android 15 adds additional controls to help apps tune this switching to their use case. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS confines the automatic switching to the beginning of the audio session, while EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES deactivates the language switching after a defined number of switches. These options are particularly useful if you expect that there will be a single language spoken during the session that should be autodetected.

Улучшенный API переменных шрифтов OpenType

В Android 15 улучшено удобство использования переменного шрифта OpenType. Вы можете создать экземпляр FontFamily из переменного шрифта без указания осей веса с помощью API buildVariableFamily . Средство визуализации текста переопределяет значение оси wght , чтобы оно соответствовало отображаемому тексту.

Использование API значительно упрощает код для создания Typeface :

Котлин

val newTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build()

Ява

Typeface newTypeface = Typeface.CustomFallbackBuilder(
            new FontFamily.Builder(
                new Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build();

Раньше для создания того же Typeface требовалось гораздо больше кода:

Котлин

val oldTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf")
                    .setFontVariationSettings("'wght' 400")
                    .setWeight(400)
                    .build())
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 100")
                        .setWeight(100)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 200")
                        .setWeight(200)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 300")
                        .setWeight(300)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 500")
                        .setWeight(500)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 600")
                        .setWeight(600)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 700")
                        .setWeight(700)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 800")
                        .setWeight(800)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 900")
                        .setWeight(900)
                        .build()
                ).build()
        ).build()

Ява

Typeface oldTypeface = new Typeface.CustomFallbackBuilder(
    new FontFamily.Builder(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 400")
            .setWeight(400)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 100")
            .setWeight(100)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 200")
            .setWeight(200)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 300")
            .setWeight(300)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 500")
            .setWeight(500)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 600")
            .setWeight(600)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 700")
            .setWeight(700)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 800")
            .setWeight(800)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 900")
            .setWeight(900)
            .build()
    )
    .build()
).build();

Вот пример того, как отображается Typeface созданный с использованием старого и нового API:

Пример того, как отличается рендеринг шрифтов с использованием новых и старых API

В этом примере Typeface , созданный с помощью старого API, не имеет возможности создавать точные веса шрифтов для экземпляров Font 350, 450, 550 и 650, поэтому средство визуализации возвращается к ближайшему весу. Таким образом, в этом случае вместо 350 отображается 300, вместо 450 отображается 400 и так далее. Напротив, Typeface , созданный с помощью новых API, динамически создает экземпляр Font для заданного веса, поэтому точные веса отображаются также для 350, 450, 550 и 650.

Детальное управление разрывами строк

Начиная с Android 15, TextView и базовый разрыв строки могут сохранять заданную часть текста в одной строке для улучшения читаемости. Вы можете воспользоваться преимуществами этой настройки разрыва строки, используя тег <nobreak> в строковых ресурсах или createNoBreakSpan . Аналогичным образом вы можете предотвратить расстановку переносов в словах, используя тег <nohyphen> или createNoHyphenationSpan .

Например, следующий строковый ресурс не содержит разрыва строки и отображается с текстом «Pixel 8 Pro». поломка в нежелательном месте:

<resources>
    <string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>

Напротив, этот строковый ресурс включает тег <nobreak> , который окружает фразу «Pixel 8 Pro». и предотвращает разрывы строк:

<resources>
    <string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>

Разница в том, как отображаются эти строки, показана на следующих изображениях:

Макет строки текста с фразой «Pixel 8 Pro». не оборачивается тегом <nobreak> .
Макет той же строки текста, что и фраза «Pixel 8 Pro». оборачивается тегом <nobreak> .

Архивация приложений

В прошлом году Android и Google Play объявили о поддержке архивирования приложений , что позволяет пользователям освободить место за счет частичного удаления с устройства нечасто используемых приложений, опубликованных с помощью Android App Bundle в Google Play. Android 15 включает поддержку архивирования и разархивирования приложений на уровне ОС, что упрощает реализацию этой функции для всех магазинов приложений.

Приложения с разрешением REQUEST_DELETE_PACKAGES могут вызывать метод requestArchive PackageInstaller , чтобы запросить архивирование установленного пакета приложения, при этом APK и все кэшированные файлы удаляются, но пользовательские данные сохраняются. Архивированные приложения возвращаются как отображаемые приложения через API LauncherApps ; пользователи увидят сообщение пользовательского интерфейса, указывающее на то, что эти приложения заархивированы. Если пользователь нажмет на заархивированное приложение, ответственный установщик получит запрос на его разархивирование , а процесс восстановления можно будет отслеживать с помощью широковещательной рассылки ACTION_PACKAGE_ADDED .

Включите режим 16 КБ на устройстве с помощью параметров разработчика

Включите опцию разработчика «Загрузка с размером страницы 16 КБ», чтобы загрузить устройство в режиме 16 КБ.

В версиях Android 15 для QPR вы можете использовать функцию разработчика , доступную на некоторых устройствах, для загрузки устройства в режиме 16 КБ и проведения тестирования на устройстве. Перед использованием функции разработчика перейдите в раздел «Настройки» > «Система» > «Обновления ПО» и установите все доступные обновления.

Эта опция разработчика доступна на следующих устройствах:

  • Pixel 8 и 8 Pro (с Android 15 QPR1 или выше)

  • Pixel 8a (с Android 15 QPR1 или выше)

  • Pixel 9, 9 Pro и 9 Pro XL (с Android 15 QPR2 Beta 2 или выше)

Графика

Android 15 предлагает новейшие графические улучшения, включая ANGLE и дополнения к графической системе Canvas.

Модернизация доступа к графическому процессору Android

Логотип Вулкан

Аппаратное обеспечение Android значительно изменилось с первых дней, когда основная ОС работала на одном процессоре, а доступ к графическим процессорам осуществлялся с использованием API-интерфейсов, основанных на конвейерах с фиксированными функциями. Графический API Vulkan® доступен в NDK начиная с Android 7.0 (уровень API 24) с абстракцией более низкого уровня, которая лучше отражает современное аппаратное обеспечение графического процессора, лучше масштабируется для поддержки нескольких ядер ЦП и обеспечивает снижение нагрузки на драйвер ЦП, что приводит к улучшению производительность приложения. Vulkan поддерживается всеми современными игровыми движками.

Vulkan — предпочтительный интерфейс Android для графического процессора. Поэтому Android 15 включает ANGLE в качестве дополнительного уровня для запуска OpenGL® ES поверх Vulkan. Переход на ANGLE позволит стандартизировать реализацию Android OpenGL для улучшения совместимости и, в некоторых случаях, повышения производительности. Вы можете проверить стабильность и производительность вашего приложения OpenGL ES с помощью ANGLE, включив опцию разработчика в «Настройки» -> «Система» -> «Параметры разработчика» -> «Экспериментально: включить ANGLE на Android 15».

Android ANGLE на дорожной карте Vulkan

Дорожная карта предстоящих изменений в API-интерфейсах графического процессора Android.

В рамках оптимизации нашего стека графических процессоров в дальнейшем мы будем поставлять ANGLE в качестве системного драйвера GL на большее количество новых устройств, при этом в будущем ожидается, что OpenGL/ES будет доступен только через ANGLE. При этом мы планируем продолжить поддержку OpenGL ES на всех устройствах .

Рекомендуемые следующие шаги

Используйте параметры разработчика, чтобы выбрать драйвер ANGLE для OpenGL ES и протестировать свое приложение. Для новых проектов мы настоятельно рекомендуем использовать Vulkan для C/C++.

Улучшения для Canvas

Android 15 continues our modernization of Android's Canvas graphics system with additional capabilities:

  • Matrix44 provides a 4x4 matrix for transforming coordinates that should be used when you want to manipulate the canvas in 3D.
  • clipShader intersects the current clip with the specified shader, while clipOutShader sets the clip to the difference of the current clip and the shader, each treating the shader as an alpha mask. This supports the drawing of complex shapes efficiently.

Производительность и аккумулятор

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

Чтобы ознакомиться с лучшими практиками экономии заряда батареи, отладкой сети и энергопотребления, а также узнать подробности о том, как мы повышаем эффективность использования батареи при фоновой работе в Android 15 и последних версиях Android, ознакомьтесь с докладом « Повышение эффективности использования батареи при фоновой работе в Android» на конференции Google I/O.

API ApplicationStartInfo

In previous versions of Android, app startup has been a bit of a mystery. It was challenging to determine within your app whether it started from a cold, warm, or hot state. It was also difficult to know how long your app spent during the various launch phases: forking the process, calling onCreate, drawing the first frame, and more. When your Application class was instantiated, you had no way of knowing whether the app started from a broadcast, a content provider, a job, a backup, boot complete, an alarm, or an Activity.

The ApplicationStartInfo API on Android 15 provides all of this and more. You can even choose to add your own timestamps into the flow to help collect timing data in one place. In addition to collecting metrics, you can use ApplicationStartInfo to help directly optimize app startup; for example, you can eliminate the costly instantiation of UI-related libraries within your Application class when your app is starting up due to a broadcast.

Подробная информация о размере приложения

Начиная с Android 8.0 (уровень API 26), Android включает API StorageStats.getAppBytes , который суммирует установленный размер приложения как одно число байтов, которое представляет собой сумму размера APK, размера файлов, извлеченных из APK, и файлы, созданные на устройстве, такие как предварительно скомпилированный код (AOT). Это число не очень информативно с точки зрения того, как ваше приложение использует хранилище.

В Android 15 добавлен API StorageStats.getAppBytesByDataType([type]) , который позволяет вам получить представление о том, как ваше приложение использует все это пространство, включая разделение файлов APK, код, связанный с AOT и ускорением, метаданные dex, библиотеки и управляемые профили.

Профилирование, управляемое приложением

Android 15 includes the ProfilingManager class, which lets you collect profiling information from within your app such as heap dumps, heap profiles, stack sampling, and more. It provides a callback to your app with a supplied tag to identify the output file, which is delivered to your app's files directory. The API does rate limiting to minimize the performance impact.

To simplify constructing profiling requests in your app, we recommend using the corresponding Profiling AndroidX API, available in Core 1.15.0-rc01 or higher.

Улучшения базы данных SQLite

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

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

  • Отложенные транзакции только для чтения : при выпуске транзакций, предназначенных только для чтения (не включая операторы записи), используйте beginTransactionReadOnly() и beginTransactionWithListenerReadOnly(SQLiteTransactionListener) для выполнения DEFERRED транзакций только для чтения. Такие транзакции могут выполняться одновременно друг с другом, а если база данных находится в режиме WAL, они могут выполняться одновременно с IMMEDIATE или EXCLUSIVE транзакциями.
  • Количество и идентификаторы строк : были добавлены API для получения количества измененных строк или идентификатора последней вставленной строки без выполнения дополнительного запроса. getLastChangedRowCount() возвращает количество строк, которые были вставлены, обновлены или удалены последним оператором SQL в текущей транзакции, а getTotalChangedRowCount() возвращает количество в текущем соединении. getLastInsertRowId() возвращает rowid последней строки, которая будет вставлена ​​в текущее соединение.
  • Необработанные операторы : выдайте необработанный оператор SQlite, минуя удобные оболочки и любые дополнительные накладные расходы на обработку, которые они могут понести.

Обновления Android Dynamic Performance Framework

В Android 15 мы продолжаем наши инвестиции в Android Dynamic Performance Framework (ADPF) — набор API-интерфейсов, которые позволяют играм и приложениям, требующим высокой производительности, более непосредственно взаимодействовать с энерго- и тепловыми системами устройств Android. На поддерживаемых устройствах в Android 15 добавлены возможности ADPF:

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

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

,

В Android 15 мы продолжаем наши инвестиции в Android Dynamic Performance Framework (ADPF) — набор API-интерфейсов, которые позволяют играм и приложениям, требующим высокой производительности, более непосредственно взаимодействовать с энерго- и тепловыми системами устройств Android. На поддерживаемых устройствах в Android 15 добавлены возможности ADPF:

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

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

,

В Android 15 мы продолжаем наши инвестиции в Android Dynamic Performance Framework (ADPF) — набор API-интерфейсов, которые позволяют играм и приложениям, требующим высокой производительности, более непосредственно взаимодействовать с энерго- и тепловыми системами устройств Android. На поддерживаемых устройствах в Android 15 добавлены возможности ADPF:

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

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

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

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

Обнаружение записи экрана

Android 15 adds support for apps to detect that they are being recorded. A callback is invoked whenever the app transitions between being visible or invisible within a screen recording. An app is considered visible if activities owned by the registering process's UID are being recorded. This way, if your app is performing a sensitive operation, you can inform the user that they're being recorded.

val mCallback = Consumer<Int> { state ->
  if (state == SCREEN_RECORDING_STATE_VISIBLE) {
    // We're being recorded
  } else {
    // We're not being recorded
  }
}

override fun onStart() {
   super.onStart()
   val initialState =
      windowManager.addScreenRecordingCallback(mainExecutor, mCallback)
   mCallback.accept(initialState)
}

override fun onStop() {
    super.onStop()
    windowManager.removeScreenRecordingCallback(mCallback)
}

Расширенные возможности IntentFilter

В Android 15 реализована поддержка более точного разрешения Intent с помощью UriRelativeFilterGroup , который содержит набор объектов UriRelativeFilter , формирующих набор правил сопоставления Intent , каждое из которых должно выполняться, включая параметры URL-запроса, фрагменты URL-адресов и правила блокировки или исключения.

Эти правила можно определить в XML-файле AndroidManifest с помощью тега <uri-relative-filter-group> , который при необходимости может включать тег android:allow . Эти теги могут содержать теги <data> , которые используют существующие атрибуты тегов данных, а также атрибуты android:query и android:fragment .

Вот пример синтаксиса AndroidManifest :

<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="http" />
  <data android:scheme="https" />
  <data android:host="astore.com" />
  <uri-relative-filter-group>
    <data android:pathPrefix="/auth" />
    <data android:query="region=na" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:query="mobileoptout=true" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:fragmentPrefix="faq" />
  </uri-relative-filter-group>
</intent-filter>

Личное пространство

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

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

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

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

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

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

Запрос последнего выбора пользователя для доступа к выбранным фотографиям

Приложения теперь могут выделять только те фотографии и видео, которые были выбраны последними, если предоставлен частичный доступ к медиа-разрешениям. Эта функция может улучшить взаимодействие с пользователем в приложениях, которые часто запрашивают доступ к фотографиям и видео. Чтобы использовать эту функцию в своем приложении, включите аргумент QUERY_ARG_LATEST_SELECTION_ONLY при запросе MediaStore через ContentResolver .

Котлин

val externalContentUri = MediaStore.Files.getContentUri("external")

val mediaColumns = arrayOf(
   FileColumns._ID,
   FileColumns.DISPLAY_NAME,
   FileColumns.MIME_TYPE,
)

val queryArgs = bundleOf(
   // Return only items from the last selection (selected photos access)
   QUERY_ARG_LATEST_SELECTION_ONLY to true,
   // Sort returned items chronologically based on when they were added to the device's storage
   QUERY_ARG_SQL_SORT_ORDER to "${FileColumns.DATE_ADDED} DESC",
   QUERY_ARG_SQL_SELECTION to "${FileColumns.MEDIA_TYPE} = ? OR ${FileColumns.MEDIA_TYPE} = ?",
   QUERY_ARG_SQL_SELECTION_ARGS to arrayOf(
       FileColumns.MEDIA_TYPE_IMAGE.toString(),
       FileColumns.MEDIA_TYPE_VIDEO.toString()
   )
)

Ява

Uri externalContentUri = MediaStore.Files.getContentUri("external");

String[] mediaColumns = {
    FileColumns._ID,
    FileColumns.DISPLAY_NAME,
    FileColumns.MIME_TYPE
};

Bundle queryArgs = new Bundle();
queryArgs.putBoolean(MediaStore.QUERY_ARG_LATEST_SELECTION_ONLY, true);
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SORT_ORDER, FileColumns.DATE_ADDED + " DESC");
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SELECTION, FileColumns.MEDIA_TYPE + " = ? OR " + FileColumns.MEDIA_TYPE + " = ?");
queryArgs.putStringArray(MediaStore.QUERY_ARG_SQL_SELECTION_ARGS, new String[] {
    String.valueOf(FileColumns.MEDIA_TYPE_IMAGE),
    String.valueOf(FileColumns.MEDIA_TYPE_VIDEO)
});

Privacy Sandbox на Android

Android 15 включает новейшие расширения Android Ad Services, включая последнюю версию Privacy Sandbox для Android . Это дополнение является частью нашей работы по разработке технологий, которые улучшают конфиденциальность пользователей и обеспечивают эффективную персонализированную рекламу для мобильных приложений. На нашей странице «Песочница конфиденциальности» вы найдете дополнительную информацию о предварительной версии и бета-версиях Privacy Sandbox для разработчиков Android, которые помогут вам начать работу.

Health Connect

Android 15 объединяет новейшие расширения Health Connect от Android — безопасной и централизованной платформы для управления и обмена данными о здоровье и фитнесе, собранными приложениями. В этом обновлении добавлена ​​поддержка дополнительных типов данных о фитнесе , питании , температуре кожи, планах тренировок и многом другом.

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

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

Узнайте больше о последних обновлениях Health Connect в Android в докладе «Создание адаптируемого опыта с помощью Android Health» от Google I/O.

,

Android 15 объединяет новейшие расширения Health Connect от Android — безопасной и централизованной платформы для управления и обмена данными о здоровье и фитнесе, собранными приложениями. В этом обновлении добавлена ​​поддержка дополнительных типов данных о фитнесе , питании , температуре кожи, планах тренировок и многом другом.

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

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

Узнайте больше о последних обновлениях Health Connect в Android в докладе «Создание адаптируемого опыта с помощью Android Health» от Google I/O.

Совместное использование экрана приложения

Android 15 поддерживает совместное использование экрана приложения, поэтому пользователи могут делиться или записывать только окно приложения, а не весь экран устройства. Эта функция, впервые включенная в Android 14 QPR2, включает обратные вызовы MediaProjection , которые позволяют вашему приложению настраивать процесс совместного использования экрана приложения. Обратите внимание, что для приложений, предназначенных для Android 14 (уровень API 34) или выше, требуется согласие пользователя для каждого сеанса захвата MediaProjection .

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

Android 15 предоставляет разработчикам приложений и пользователям больше возможностей и гибкости для настройки устройств в соответствии со своими потребностями.

Чтобы узнать больше о том, как использовать последние улучшения в Android 15 для улучшения пользовательского опыта вашего приложения, ознакомьтесь с докладом « Улучшение пользовательского опыта вашего приложения для Android» на конференции Google I/O.

Более подробные предварительные просмотры виджетов с помощью API Generated Previews

До Android 15 единственным способом обеспечить предварительный просмотр средства выбора виджетов было указание статического изображения или ресурса макета . Эти предварительные просмотры часто существенно отличаются от внешнего вида фактического виджета, когда он размещен на главном экране. Кроме того, статические ресурсы невозможно создавать с помощью Jetpack Glance, поэтому разработчику Glance приходилось делать снимок экрана своего виджета или создавать макет XML, чтобы иметь предварительный просмотр виджета.

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

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

Нажмите API

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

AppWidgetManager.getInstance(appContext).setWidgetPreview(
   ComponentName(
       appContext,
       SociaLiteAppWidgetReceiver::class.java
   ),
   AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
   RemoteViews("com.example", R.layout.widget_preview)
)

Ожидаемый поток:

  1. В любой момент поставщик виджетов вызывает setWidgetPreview . Предоставленные предварительные просмотры сохраняются в AppWidgetService вместе с другой информацией поставщика.
  2. setWidgetPreview уведомляет узлы об обновленной предварительной версии через обратный вызов AppWidgetHost.onProvidersChanged . В ответ хост виджета перезагружает всю информацию о своем провайдере.
  3. При отображении предварительного просмотра виджета хост проверяет AppWidgetProviderInfo.generatedPreviewCategories и, если выбранная категория доступна, вызывает AppWidgetManager.getWidgetPreview , чтобы вернуть сохраненный предварительный просмотр для этого провайдера.

Когда вызывать setWidgetPreview

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

В следующем списке описаны две основные категории вариантов использования предварительной версии:

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

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

Картинка в картинке

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

Разработчики используют обратный вызов onPictureInPictureModeChanged для определения логики, которая переключает видимость наложенных элементов пользовательского интерфейса. Этот обратный вызов запускается, когда завершается анимация входа или выхода PiP. Начиная с Android 15, класс PictureInPictureUiState включает еще одно состояние.

В этом состоянии пользовательского интерфейса приложения, предназначенные для Android 15 (уровень API 35), будут наблюдать за вызовом обратного вызова Activity#onPictureInPictureUiStateChanged с помощью isTransitioningToPip() как только начнется анимация PiP. Существует множество элементов пользовательского интерфейса, которые не имеют отношения к приложению, когда оно находится в режиме «картинка в картинке», например представления или макет, включающие такую ​​информацию, как предложения, предстоящие видео, рейтинги и заголовки. Когда приложение переходит в режим PiP, используйте обратный вызов onPictureInPictureUiStateChanged , чтобы скрыть эти элементы пользовательского интерфейса. Когда приложение переходит в полноэкранный режим из окна PiP, используйте обратный вызов onPictureInPictureModeChanged чтобы отобразить эти элементы, как показано в следующих примерах:

override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements
        }
    }
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements
        }
    }

Это быстрое переключение видимости ненужных элементов пользовательского интерфейса (для окна PiP) помогает обеспечить более плавную анимацию входа в PiP без мерцания.

Улучшенные правила «Не беспокоить»

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

  • Добавление типов в AutomaticZenRule , позволяющее системе применять специальную обработку к некоторым правилам.
  • Добавление значка в AutomaticZenRule , помогающее сделать режимы более узнаваемыми.
  • Добавление в AutomaticZenRule строки triggerDescription , описывающей условия, при которых правило должно стать активным для пользователя.
  • В AutomaticZenRule добавлен ZenDeviceEffects , позволяющий правилам запускать такие функции, как отображение оттенков серого, ночной режим или затемнение обоев.

Установить VibrationEffect для каналов уведомлений

Android 15 supports setting rich vibrations for incoming notifications by channel using NotificationChannel.setVibrationEffect, so your users can distinguish between different types of notifications without having to look at their device.

Чип строки состояния проекции мультимедиа и автоматическая остановка

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

Status bar chip for screen sharing, casting, and recording.

Большие экраны и форм-факторы

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

Улучшенная многозадачность на большом экране

Android 15 gives users better ways to multitask on large screen devices. For example, users can save their favorite split-screen app combinations for quick access and pin the taskbar on screen to quickly switch between apps. This means that making sure your app is adaptive is more important than ever.

Google I/O has sessions on Building adaptive Android apps and Building UI with the Material 3 adaptive library that can help, and our documentation has more to help you Design for large screens.

Поддержка защитного экрана

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

Связность

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

Спутниковая поддержка

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

Приложения могут использовать ServiceState.isUsingNonTerrestrialNetwork() для определения того, когда устройство подключено к спутнику, что дает им больше информации о том, почему все сетевые службы могут быть недоступны. Кроме того, Android 15 обеспечивает поддержку приложений SMS и MMS, а также предустановленных приложений RCS для использования спутниковой связи для отправки и получения сообщений.

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

Более плавный опыт использования NFC

Android 15 is working to make the tap to pay experience more seamless and reliable while continuing to support Android's robust NFC app ecosystem. On supported devices, apps can request the NfcAdapter to enter observe mode, where the device listens but doesn't respond to NFC readers, sending the app's NFC service PollingFrame objects to process. The PollingFrame objects can be used to auth ahead of the first communication to the NFC reader, allowing for a one tap transaction in many cases.

In addition, apps can register a filter on supported devices so they can be notified of polling loop activity, which allows for smooth operation with multiple NFC-aware applications.

Роль кошелька

В Android 15 представлена ​​роль кошелька, которая обеспечивает более тесную интеграцию с предпочтительным приложением-кошельком пользователя. Эта роль заменяет настройку бесконтактной оплаты NFC по умолчанию. Пользователи могут управлять владельцем роли Кошелька, перейдя в «Настройки» > «Приложения» > «Приложения по умолчанию» .

Роль «Кошелек» используется при маршрутизации касаний NFC для AID, зарегистрированных в категории платежей. Нажатия всегда передаются владельцу роли «Кошелек», если только на переднем плане не работает другое приложение, зарегистрированное для того же AID.

Эта роль также используется для определения того, куда должна перемещаться плитка быстрого доступа к кошельку при активации. Если для роли установлено значение «Нет», плитка быстрого доступа недоступна, а касания NFC категории оплаты доставляются только в приложение на переднем плане.

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

Android 15 помогает повысить безопасность вашего приложения, защитить его данные и предоставляет пользователям больше прозрачности и контроля над своими данными. Подробнее о наших действиях по улучшению защиты пользователей и защите вашего приложения от новых угроз читайте в докладе « Защита безопасности пользователей Android» на конференции Google I/O.

Интеграция Credential Manager с функцией автозаполнения

Начиная с Android 15, разработчики могут связывать определенные представления, такие как поля имени пользователя или пароля, с запросами диспетчера учетных данных , что упрощает предоставление индивидуального пользовательского опыта во время процесса входа. Когда пользователь фокусируется на одном из этих представлений, соответствующий запрос отправляется в Credential Manager. Полученные учетные данные объединяются между поставщиками и отображаются в резервных пользовательских интерфейсах автозаполнения, таких как встроенные или раскрывающиеся предложения. Библиотека Jetpack androidx.credentials является предпочтительной конечной точкой для разработчиков и скоро будет доступна для дальнейшего улучшения этой функции в Android 15 и более поздних версиях.

Интеграция регистрации и входа в систему одним нажатием с биометрическими подсказками

Credential Manager интегрирует биометрические запросы в процессы создания учетных данных и входа в систему , устраняя необходимость для поставщиков управлять биометрическими запросами. В результате поставщикам учетных данных необходимо сосредоточиться только на результатах потоков создания и получения, дополненных результатами биометрического потока. Этот упрощенный процесс обеспечивает более эффективный и оптимизированный процесс создания и поиска учетных данных.

Управление ключами для сквозного шифрования

Мы представляем E2eeContactKeysManager в Android 15, который упрощает сквозное шифрование (E2EE) в ваших приложениях Android, предоставляя API на уровне ОС для хранения криптографических открытых ключей.

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

Проверка разрешений на URI контента

В Android 15 представлен набор API, которые выполняют проверку разрешений для URI контента:

  • Context.checkContentUriPermissionFull : выполняет полную проверку разрешений для URI контента.
  • Атрибут манифеста Activity requireContentUriPermissionFromCaller : обеспечивает соблюдение указанных разрешений для предоставленных URI контента при запуске действия.
  • Класс ComponentCaller для вызывающих Activity : представляет приложение, запустившее действие.

Доступность

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

Лучший шрифт Брайля

В Android 15 мы позволили TalkBack поддерживать дисплеи Брайля, использующие стандарт HID, как через USB, так и через защищенный Bluetooth.

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

Интернационализация

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

Переменный шрифт CJK

Начиная с Android 15, файл шрифта для китайского, японского и корейского (CJK) языков NotoSansCJK теперь является переменным шрифтом. Вариативные шрифты открывают возможности для творческой типографики на языках CJK. Дизайнеры могут исследовать более широкий спектр стилей и создавать визуально яркие макеты, которые раньше было трудно или невозможно реализовать.

Как переменный шрифт для китайского, японского и корейского (CJK) языков отображается при разной ширине шрифта.

Межсимвольное выравнивание

Начиная с Android 15, текст можно выравнивать с использованием межбуквенного интервала с помощью JUSTIFICATION_MODE_INTER_CHARACTER . Выравнивание между словами было впервые представлено в Android 8.0 (уровень API 26), а выравнивание между символами предоставляет аналогичные возможности для языков, которые используют символ пробела для сегментации, таких как китайский, японский и другие.

Макет японского текста с использованием JUSTIFICATION_MODE_NONE .
Макет текста на английском языке с использованием JUSTIFICATION_MODE_NONE .


Макет японского текста с использованием JUSTIFICATION_MODE_INTER_WORD .
Макет текста на английском языке с использованием JUSTIFICATION_MODE_INTER_WORD .


Макет японского текста с использованием JUSTIFICATION_MODE_INTER_CHARACTER .
Макет текста на английском языке с использованием JUSTIFICATION_MODE_INTER_CHARACTER .

Автоматическая настройка разрыва строки

Android начал поддерживать разрывы строк на основе фраз для японского и корейского языков в Android 13 (уровень API 33). Однако хотя разрывы строк на основе фраз улучшают читаемость коротких строк текста, они плохо работают с длинными строками текста. В Android 15 приложения могут применять разрывы строк на основе фраз только для коротких строк текста, используя параметр LINE_BREAK_WORD_STYLE_AUTO . Эта опция выбирает лучший вариант стиля слова для текста.

Для коротких строк текста используются разрывы строк на основе фраз, которые работают так же, как LINE_BREAK_WORD_STYLE_PHRASE , как показано на следующем рисунке:

Для коротких строк текста LINE_BREAK_WORD_STYLE_AUTO применяет разрывы строк на основе фраз, чтобы улучшить читаемость текста. Это то же самое, что применить LINE_BREAK_WORD_STYLE_PHRASE .

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

Для длинных строк текста LINE_BREAK_WORD_STYLE_AUTO не применяет стиль слов с разрывом строки, чтобы улучшить читаемость текста. Это то же самое, что применить LINE_BREAK_WORD_STYLE_NONE .

Дополнительный японский шрифт Hentaigana

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

Стиль символов и текста для японского шрифта Hentaigana.

Конус VideoLAN Copyright (c) 1996-2010 VideoLAN. Этот логотип или его измененная версия может использоваться или изменяться кем-либо для ссылки на проект VideoLAN или любой продукт, разработанный командой VideoLAN, но не означает одобрения проекта.

Vulkan и логотип Vulkan являются зарегистрированными торговыми марками Khronos Group Inc.

OpenGL является зарегистрированной торговой маркой, а логотип OpenGL ES является торговой маркой Hewlett Packard Enterprise, используемой с разрешения Khronos.