Android 15 предлагает отличные функции и API для разработчиков. В следующих разделах обобщаются эти функции, чтобы помочь вам начать работу с соответствующими API.
Подробный список добавленных, измененных и удаленных API можно найти в отчете о различиях API . Подробную информацию о добавленных API см. в справочнике по API Android . Для Android 15 найдите API, добавленные на уровне API 35. Чтобы узнать об областях, в которых изменения платформы могут повлиять на ваши приложения, обязательно ознакомьтесь с изменениями в поведении Android 15 для приложений, которые нацелен на Android 15 и для всех приложений .
Камера и медиа
Android 15 включает в себя множество функций, которые улучшают работу камеры и мультимедиа, а также дают вам доступ к инструментам и оборудованию, которые помогут авторам воплотить свои идеи в жизнь на Android.
Дополнительные сведения о новейших функциях и решениях для разработчиков мультимедиа и камер Android см. в докладе Google I/O «Создание современных мультимедийных возможностей и камер Android» .
Усиление при слабом освещении
В Android 15 представлен Low Light Boost — режим автоматической экспозиции, доступный как для Камеры 2 , так и для расширения камеры для ночного режима . Low Light Boost регулирует экспозицию потока предварительного просмотра в условиях низкой освещенности. Это отличается от того, как расширение камеры для ночного режима создает неподвижные изображения, поскольку ночной режим объединяет серию фотографий для создания единого улучшенного изображения. Хотя ночной режим очень хорошо работает для создания неподвижного изображения, он не может создавать непрерывный поток кадров, а режим Low Light Boost может. Таким образом, Low Light Boost обеспечивает такие возможности камеры, как:
- Предоставление улучшенного предварительного просмотра изображения, чтобы пользователи могли лучше кадрировать свои снимки при слабом освещении.
- Сканирование QR-кодов при слабом освещении
Если вы включите усиление при слабом освещении, оно автоматически включается при низком уровне освещенности и выключается, когда света становится больше.
Приложения могут записывать поток предварительного просмотра в условиях низкой освещенности, чтобы сохранить более яркое видео.
Для получения дополнительной информации см. «Усиление при слабом освещении» .
Управление камерой в приложении
Android 15 添加了一个新扩展,用于在支持的设备上更好地控制相机硬件及其算法:
HDR-контроль высоты
Android 15 выбирает запас HDR, соответствующий возможностям основного устройства и разрядности панели. Для страниц с большим количеством контента SDR, таких как приложение для обмена сообщениями, отображающее одну миниатюру HDR, такое поведение может в конечном итоге отрицательно повлиять на воспринимаемую яркость контента SDR. Android 15 позволяет управлять запасом HDR с помощью setDesiredHdrHeadroom
чтобы обеспечить баланс между 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 添加了对使用 USB 连接 MIDI 2.0 设备的支持,这些设备使用通用 MIDI 数据包 (UMP) 进行通信。Android 15 将 UMP 支持扩展到虚拟 MIDI 应用,使乐曲应用能够控制合成器应用 作为虚拟 MIDI 2.0 设备,就像使用 USB MIDI 2.0 设备一样。
Более эффективное программное декодирование AV1
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 продолжается работа по обновлению основных библиотек Android, чтобы они соответствовали функциям последних выпусков OpenJDK LTS.
Включены следующие ключевые функции и улучшения:
- Улучшение качества жизни буферов NIO
- Потоки
- Дополнительные
math
иstrictmath
методы - обновления пакета
util
, включая упорядоченнуюcollection
,map
иset
- Поддержка
ByteBuffer
вDeflater
- Обновления безопасности, такие как
X500PrivateCredential
и обновления ключей безопасности.
Эти API обновляются на более чем миллиарде устройств под управлением Android 12 (уровень API 31) и более поздних версий посредством обновлений системы Google Play , поэтому вы можете использовать новейшие функции программирования.
Улучшения PDF
Android 15 включает существенные улучшения API-интерфейсов PdfRenderer
. Приложения могут включать расширенные функции, такие как отображение файлов, защищенных паролем , аннотаций, редактирования форм , поиска и выбора с копированием. Поддерживается оптимизация линеаризованных PDF-файлов для ускорения локального просмотра PDF-файлов и сокращения использования ресурсов. Библиотека Jetpack PDF использует эти API для упрощения добавления возможностей просмотра PDF-файлов в ваше приложение.
PdfRenderer
был перенесен в модуль, который можно обновлять с помощью обновлений системы Google Play независимо от версии платформы, и мы поддерживаем эти изменения обратно в Android 11 (уровень API 30), создавая совместимую версию до Android 15. Поверхность API, называемая PdfRendererPreV
.
Android 15 включает существенные улучшения API-интерфейсов PdfRenderer
. Приложения могут включать расширенные функции, такие как отображение файлов, защищенных паролем , аннотаций, редактирования форм , поиска и выбора с копированием. Поддерживается оптимизация линеаризованных PDF-файлов для ускорения локального просмотра PDF-файлов и сокращения использования ресурсов. Библиотека Jetpack PDF использует эти API для упрощения добавления возможностей просмотра PDF-файлов в ваше приложение.
PdfRenderer
был перенесен в модуль, который можно обновлять с помощью обновлений системы Google Play независимо от версии платформы, и мы поддерживаем эти изменения обратно в Android 11 (уровень API 30), создавая совместимую версию до Android 15. Поверхность API, называемая PdfRendererPreV
.
Android 15 включает существенные улучшения API-интерфейсов PdfRenderer
. Приложения могут включать расширенные функции, такие как отображение файлов, защищенных паролем , аннотаций, редактирования форм , поиска и выбора с копированием. Поддерживается оптимизация линеаризованных PDF-файлов для ускорения локального просмотра PDF-файлов и сокращения использования ресурсов. Библиотека Jetpack PDF использует эти API для упрощения добавления возможностей просмотра PDF-файлов в ваше приложение.
PdfRenderer
был перенесен в модуль, который можно обновлять с помощью обновлений системы Google Play независимо от версии платформы, и мы поддерживаем эти изменения обратно в Android 11 (уровень API 30), создавая совместимую версию до Android 15. Поверхность API, называемая PdfRendererPreV
.
Усовершенствования автоматического переключения языка
В Android 14 добавлено распознавание нескольких языков в аудио на устройстве с автоматическим переключением между языками, но это может привести к пропаданию слов, особенно когда языки переключаются с меньшей паузой между двумя произнесениями. В Android 15 добавлены дополнительные элементы управления, которые помогают приложениям настроить это переключение в соответствии со своими сценариями использования. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS
ограничивает автоматическое переключение началом аудиосеанса, а EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES
деактивирует переключение языка после определенного количества переключений. Эти параметры особенно полезны, если вы ожидаете, что во время сеанса будет говориться на одном языке, который должен определяться автоматически.
Улучшен 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:
В этом примере 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>
Разница в том, как отображаются эти строки, показана на следующих изображениях:
Архивирование приложений
В прошлом году Android и Google Play объявили о поддержке архивирования приложений , что позволяет пользователям освободить место за счет частичного удаления с устройства нечасто используемых приложений, опубликованных с помощью Android App Bundle в Google Play. Android 15 включает поддержку архивирования и разархивирования приложений на уровне ОС, что упрощает реализацию этой функции для всех магазинов приложений.
Приложения с разрешением REQUEST_DELETE_PACKAGES
могут вызывать метод requestArchive
PackageInstaller
, чтобы запросить архивирование установленного пакета приложения, при этом APK и все кэшированные файлы удаляются, но пользовательские данные сохраняются. Архивированные приложения возвращаются как отображаемые приложения через API LauncherApps
; пользователи увидят сообщение пользовательского интерфейса, указывающее на то, что эти приложения заархивированы. Если пользователь нажмет на заархивированное приложение, ответственный установщик получит запрос на его разархивирование , а процесс восстановления можно будет отслеживать с помощью широковещательной рассылки ACTION_PACKAGE_ADDED
.
Графика
В 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
В рамках оптимизации нашего стека графических процессоров в дальнейшем мы будем поставлять ANGLE в качестве системного драйвера GL на большее количество новых устройств, при этом в будущем ожидается, что OpenGL/ES будет доступен только через ANGLE. При этом мы планируем продолжить поддержку OpenGL ES на всех устройствах .
Рекомендуемые следующие шаги
Используйте параметры разработчика, чтобы выбрать драйвер ANGLE для OpenGL ES и протестировать свое приложение. Для новых проектов мы настоятельно рекомендуем использовать Vulkan для C/C++.
Улучшения для холста
Android 15 继续对 Android 的 Canvas 图形系统进行现代化改造,并增添了新功能:
Matrix44
提供了一个用于转换坐标的 4x4 矩阵,当您想要处理 3D 画布时,应使用此矩阵。clipShader
将当前裁剪与指定着色器相交,而clipOutShader
会将裁剪设置为当前裁剪和着色器的差异,其中各自将着色器视为 Alpha 蒙版。这有助于高效绘制复杂形状。
Производительность и батарея
Android по-прежнему стремится помочь вам улучшить производительность и качество ваших приложений. В Android 15 представлены API, которые помогают повысить эффективность выполнения задач в вашем приложении, оптимизировать производительность приложения и собирать информацию о ваших приложениях.
Рекомендации по эффективному использованию батареи, отладке использования сети и энергопотребления, а также подробную информацию о том, как мы повышаем эффективность использования батареи при фоновой работе в Android 15 и последних версиях Android, см. в статье «Повышение эффективности использования батареи при фоновой работе на Android» от Google I/. О.
API-интерфейс ApplicationStartInfo
在以前的 Android 版本中,应用启动有点神秘。在应用中确定应用是从冷状态、温状态还是热状态开始的过程很难确定。此外,我们也很难知道您的应用在不同发布阶段所用的时间:创建进程分支、调用 onCreate
、绘制第一帧等。在实例化 Application
类时,您无法得知应用是从广播、content provider、作业、备份、启动完成、闹钟还是 Activity
启动的。
Android 15 上的 ApplicationStartInfo
API 可提供所有这些功能以及更多其他功能。您甚至可以选择将自己的时间戳添加到流程中,以便在一个位置收集时间数据。除了收集指标之外,您还可以使用 ApplicationStartInfo
直接优化应用启动;例如,当应用因广播而启动时,您可以避免在 Application
类中实例化界面相关库的高成本。
Подробная информация о размере приложения
Начиная с Android 8.0 (уровень API 26), Android включает API StorageStats.getAppBytes
, который суммирует установленный размер приложения как одно число байтов, которое представляет собой сумму размера APK, размера файлов, извлеченных из APK, и файлы, созданные на устройстве, такие как предварительно скомпилированный код (AOT). Это число не очень информативно с точки зрения того, как ваше приложение использует хранилище.
В Android 15 добавлен API StorageStats.getAppBytesByDataType([type])
, который позволяет вам получить представление о том, как ваше приложение использует все это пространство, включая разделение файлов APK, код, связанный с AOT и ускорением, метаданные dex, библиотеки и управляемые профили.
Профилирование, управляемое приложением
Android 15 包含 ProfilingManager
类,可让您从应用内部收集性能分析信息,例如堆转储、堆分析报告、堆栈采样等。它使用提供的标记为您的应用提供回调,以标识输出文件,该文件将传递给应用的文件目录。该 API 会进行速率限制,以尽可能降低对性能的影响。
为了简化在应用中构建性能分析请求的过程,我们建议您使用 Core 1.15.0-rc01 或更高版本中的相应 Profiling
AndroidX API。
Улучшения базы данных 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 добавлена поддержка приложений, позволяющих обнаружить, что они записываются. Обратный вызов вызывается всякий раз, когда приложение становится видимым или невидимым во время записи экрана. Приложение считается видимым, если записываются действия, принадлежащие UID процесса регистрации. Таким образом, если ваше приложение выполняет конфиденциальную операцию, вы можете сообщить пользователю, что его действия записываются.
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>
<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:domain="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) });
Песочница конфиденциальности на Android
Android 15 包含最新的 Android 广告服务扩展程序,以及最新版 Privacy Sandbox on Android。我们致力于开发新的技术,以便更好地保护用户隐私,并为移动应用打造有效的个性化广告体验。这项新功能是我们的工作的一部分。我们的隐私沙盒页面详细介绍了 Privacy Sandbox on Android 开发者预览版和 Beta 版计划,以帮助您开始使用。
Здоровье Connect
Android 15 объединяет новейшие расширения Health Connect от Android — безопасной и централизованной платформы для управления и обмена данными о здоровье и фитнесе, собранными приложениями. В этом обновлении добавлена поддержка дополнительных типов данных о фитнесе , питании , температуре кожи, планах тренировок и многом другом.
Отслеживание температуры кожи позволяет пользователям хранить и передавать более точные данные о температуре с носимого или другого устройства отслеживания.
Планы тренировок — это структурированные планы тренировок, которые помогают пользователю достичь своих целей в фитнесе. Поддержка планов обучения включает в себя различные цели завершения и производительности:
- Цели достижения, касающиеся сожженных калорий , расстояния , продолжительности , повторений и шагов .
- Цели производительности включают максимально возможное количество повторений (AMRAP) , частоту шагов , частоту сердечных сокращений , мощность , воспринимаемую скорость нагрузки и скорость .
Узнайте больше о последних обновлениях Health Connect в Android в докладе «Создание адаптируемого опыта с помощью Android Health» от Google I/O.
,Android 15 объединяет новейшие расширения Health Connect от Android — безопасной и централизованной платформы для управления и обмена данными о здоровье и фитнесе, собранными приложениями. В этом обновлении добавлена поддержка дополнительных типов данных о фитнесе , питании , температуре кожи, планах тренировок и многом другом.
Отслеживание температуры кожи позволяет пользователям хранить и передавать более точные данные о температуре с носимого или другого устройства слежения.
Планы тренировок — это структурированные планы тренировок, которые помогают пользователю достичь своих целей в фитнесе. Поддержка планов обучения включает в себя различные цели завершения и производительности:
- Цели достижения, касающиеся сожженных калорий , расстояния , продолжительности , повторений и шагов .
- Цели производительности включают максимально возможное количество повторений (AMRAP) , частоту шагов , частоту сердечных сокращений , мощность , воспринимаемую скорость нагрузки и скорость .
Узнайте больше о последних обновлениях Health Connect в Android в докладе «Создание адаптируемого опыта с помощью Android Health» от Google I/O.
Совместное использование экрана приложения
Android 15 支持应用屏幕共享,因此用户可以仅共享或录制应用窗口,而不是整个设备屏幕。此功能首次在 Android 14 QPR2 中启用,包含 MediaProjection
回调,可让您的应用自定义应用屏幕共享体验。请注意,对于以 Android 14(API 级别 34)或更高版本为目标平台的应用,每个 MediaProjection
捕获会话都需要征得用户同意。
Пользовательский опыт и системный интерфейс
Android 15 предоставляет разработчикам приложений и пользователям больше контроля и гибкости в настройке устройства в соответствии со своими потребностями.
Чтобы узнать больше о том, как использовать последние улучшения в Android 15 для улучшения пользовательского опыта вашего приложения, ознакомьтесь с докладом Google I/O «Улучшите пользовательский интерфейс вашего Android-приложения» .
Более расширенный предварительный просмотр виджетов с помощью Generated Previews API
在 Android 15 之前,提供微件选择器预览的唯一方法是指定静态图片或布局资源。这些预览通常与放置在主屏幕上的实际 widget 的外观大不相同。此外,由于无法使用 Jetpack Glance 创建静态资源,因此“资讯一览” 开发者必须为其微件截屏或创建 XML 布局, 微件预览。
Android 15 添加了对生成的预览的支持。这意味着,应用微件提供程序可以生成 RemoteViews
以用作选择器预览,而不是静态资源。
推送 API
应用可以通过推送 API 提供生成的预览。应用可以提供
预览,并且不会收到明确的请求,
以提供预览。预览会保留在 AppWidgetService
中,并且主持人可以按需请求预览。以下示例加载了一个 XML 微件
并将其设置为预览:
AppWidgetManager.getInstance(appContext).setWidgetPreview(
ComponentName(
appContext,
SociaLiteAppWidgetReceiver::class.java
),
AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
RemoteViews("com.example", R.layout.widget_preview)
)
预期的流程如下:
- 任何时候,widget 提供程序都会调用
setWidgetPreview
。提供的预览会与其他提供方信息一起保留在AppWidgetService
中。 setWidgetPreview
会通过AppWidgetHost.onProvidersChanged
回调。作为回应,微件宿主会重新加载其所有提供方信息。- 显示微件预览时,主机会检查
AppWidgetProviderInfo.generatedPreviewCategories
,如果所选类别可用,则调用AppWidgetManager.getWidgetPreview
以返回此提供程序的已保存预览。
何时调用 setWidgetPreview
由于没有用于提供预览的回调,因此应用可以选择在运行期间的任何时间发送预览。预览的更新频率取决于微件的用例。
以下列表介绍了两大类预览用例:
- 在 widget 预览中显示真实数据(例如个性化数据)的提供程序 或最新信息。这些提供商可以设置预览 已登录 Google 账号或已在其应用中完成初始配置。之后 可以设置一项定期任务,按照所选的节奏更新预览。 此类 widget 的示例包括照片、日历、天气或新闻 widget。
- 在预览中显示静态信息或不显示任何数据的快捷操作 widget 的提供程序。这些提供程序可以在应用首次启动时设置预览一次。例如,快速开车便是此类微件的示例 操作 widget 或 Chrome 快捷方式 widget。
某些提供商可能会在基座接入模式选择器上显示静态预览,但真实的 信息。这些提供商应遵循指南 设置预览
Картинка в картинке
В 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 поддерживает настройку насыщенной вибрации для входящих уведомлений по каналам с помощью NotificationChannel.setVibrationEffect
, поэтому ваши пользователи могут различать разные типы уведомлений, не глядя на свое устройство.
Чип строки состояния медиапроекции и автоматическая остановка
Медиа-проекция может раскрыть личную информацию пользователя. Новый заметный чип строки состояния информирует пользователей о любой текущей проекции экрана. Пользователи могут коснуться чипа, чтобы остановить трансляцию экрана, совместное использование или запись. Кроме того, для более интуитивно понятного взаимодействия с пользователем любое текущее проецирование экрана теперь автоматически останавливается при блокировке экрана устройства.
,Медиа-проекция может раскрыть личную информацию пользователя. Новый заметный чип строки состояния информирует пользователей о любой текущей проекции экрана. Пользователи могут коснуться чипа, чтобы остановить трансляцию экрана, совместное использование или запись. Кроме того, для более интуитивно понятного взаимодействия с пользователем любое текущее проецирование экрана теперь автоматически останавливается при блокировке экрана устройства.
,Медиа-проекция может раскрыть личную информацию пользователя. Новый заметный чип строки состояния информирует пользователей о любой текущей проекции экрана. Пользователи могут коснуться чипа, чтобы остановить трансляцию экрана, совместное использование или запись. Кроме того, для более интуитивно понятного взаимодействия с пользователем любое текущее проецирование экрана теперь автоматически останавливается при блокировке экрана устройства.
Большие экраны и форм-факторы
Android 15 предоставляет вашим приложениям поддержку, позволяющую максимально эффективно использовать форм-факторы Android, включая большие экраны, раскладные и складные устройства.
Улучшена многозадачность на большом экране.
Android 15 дает пользователям больше возможностей для многозадачности на устройствах с большим экраном. Например, пользователи могут сохранить свои любимые комбинации приложений с разделенным экраном для быстрого доступа и закрепить панель задач на экране для быстрого переключения между приложениями. Это означает, что обеспечение адаптивности вашего приложения важнее, чем когда-либо.
Google I/O проводит сеансы по созданию адаптивных приложений для Android и созданию пользовательского интерфейса с помощью адаптивной библиотеки Material 3, которые могут вам помочь, а в нашей документации есть дополнительные сведения, которые помогут вам проектировать для больших экранов .
Поддержка обложки экрана
您的应用可以声明一项属性,Android 15 会使用该属性将您的 Application
或 Activity
呈现在支持的可翻转设备的小封面屏幕上。这些屏幕太小,无法被视为 Android 应用的兼容目标,但您的应用可以选择支持这些屏幕,从而让您的应用可在更多位置使用。
Возможности подключения
Android 15 обновляет платформу, предоставляя вашему приложению доступ к новейшим достижениям в области связи и беспроводных технологий.
Спутниковая поддержка
Android 15 продолжает расширять поддержку платформы для спутниковой связи и включает в себя некоторые элементы пользовательского интерфейса, обеспечивающие единообразный пользовательский опыт в сфере спутниковой связи.
Приложения могут использовать ServiceState.isUsingNonTerrestrialNetwork()
для определения того, когда устройство подключено к спутнику, что дает им больше информации о том, почему все сетевые службы могут быть недоступны. Кроме того, Android 15 обеспечивает поддержку приложений SMS и MMS, а также предустановленных приложений RCS для использования спутниковой связи для отправки и получения сообщений.
Более плавная работа с NFC
Android 15 работает над тем, чтобы сделать процесс оплаты одним касанием более простым и надежным, продолжая при этом поддерживать надежную экосистему приложений Android NFC. На поддерживаемых устройствах приложения могут запрашивать NfcAdapter
для перехода в режим наблюдения , в котором устройство прослушивает, но не отвечает устройствам чтения NFC, отправляя на обработку объекты PollingFrame
службы NFC приложения. Объекты PollingFrame
можно использовать для аутентификации перед первой связью со считывателем NFC, что во многих случаях позволяет выполнить транзакцию одним касанием.
Кроме того, приложения могут зарегистрировать фильтр на поддерживаемых устройствах, чтобы они могли получать уведомления об активности цикла опроса, что обеспечивает бесперебойную работу с несколькими приложениями, поддерживающими NFC.
Роль кошелька
В Android 15 представлена роль кошелька, которая обеспечивает более тесную интеграцию с предпочтительным приложением-кошельком пользователя. Эта роль заменяет настройку бесконтактной оплаты NFC по умолчанию. Пользователи могут управлять владельцем роли Кошелька, перейдя в «Настройки» > «Приложения» > «Приложения по умолчанию» .
Роль «Кошелек» используется при маршрутизации касаний NFC для AID, зарегистрированных в категории платежей. Нажатия всегда передаются владельцу роли «Кошелек», если только на переднем плане не работает другое приложение, зарегистрированное для того же AID.
Эта роль также используется для определения того, куда должна перемещаться плитка быстрого доступа к кошельку при активации. Если для роли установлено значение «Нет», плитка быстрого доступа недоступна, а касания NFC категории оплаты доставляются только в приложение на переднем плане.
Безопасность
Android 15 помогает повысить безопасность вашего приложения, защитить его данные, а также предоставляет пользователям большую прозрачность и контроль над своими данными. Дополнительную информацию о том, что мы делаем для улучшения защиты пользователей и защиты вашего приложения от новых угроз, см. в докладе «Защита безопасности пользователей на Android» от Google I/O.
Интегрируйте диспетчер учетных данных с автозаполнением
Starting with Android 15, developers can link specific views like username or password fields with Credential Manager requests, making it easier to provide a tailored user experience during the sign-in process. When the user focuses on one of these views, a corresponding request is sent to Credential Manager. The resulting credentials are aggregated across providers and displayed in autofill fallback UIs, such as inline suggestions or drop-down suggestions. The Jetpack androidx.credentials library is the preferred endpoint for developers to use and will soon be available to further enhance this feature in Android 15 and higher.
Интегрируйте регистрацию и вход в систему одним касанием с биометрическими подсказками.
Credential Manager将生物识别提示集成到凭据创建过程中 和登录流程,这样提供商就无需管理 生物识别提示。因此,凭据提供程序只需专注于创建和获取流程的结果,并辅以生物识别流程结果。这一简化的流程创建了更高效、更精简的凭据 创建和检索过程。
Управление ключами для сквозного шифрования
我们在 Android 15 中引入了 E2eeContactKeysManager
,它提供用于存储加密公钥的操作系统级 API,有助于 Android 应用中的端到端加密 (E2EE)。
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. Дизайнеры могут исследовать более широкий спектр стилей и создавать визуально яркие макеты, которые раньше было трудно или невозможно реализовать.
Межсимвольное обоснование
Начиная с Android 15, текст можно выравнивать с использованием межбуквенного интервала с помощью JUSTIFICATION_MODE_INTER_CHARACTER
. Выравнивание между словами было впервые представлено в Android 8.0 (уровень API 26), а выравнивание между символами предоставляет аналогичные возможности для языков, которые используют символ пробела для сегментации, таких как китайский, японский и другие.
Автоматическая настройка разрыва строки
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_NONE
, как показано на следующем рисунке:
Дополнительный японский шрифт Hentaigana
В Android 15 по умолчанию включен файл шрифта для старой японской хираганы (известной как хентайгана). Уникальные формы символов хентайганы могут придать особый шарм произведениям искусства или дизайну, а также помогают сохранить точную передачу и понимание древних японских документов.
Конус VideoLAN Copyright (c) 1996-2010 VideoLAN. Этот логотип или его измененная версия может использоваться или изменяться кем-либо для ссылки на проект VideoLAN или любой продукт, разработанный командой VideoLAN, но не означает одобрения проекта.
Vulkan и логотип Vulkan являются зарегистрированными торговыми марками Khronos Group Inc.
OpenGL является зарегистрированной торговой маркой, а логотип OpenGL ES является торговой маркой Hewlett Packard Enterprise, используемой с разрешения Khronos.