Теперь, когда компоненты и ресурсы библиотеки автомобильного пользовательского интерфейса добавлены в приложения, для настройки этих приложений OEM-производители должны предоставить два наложения:
Наложение времени сборки добавляет любые ресурсы, необходимые для наложения ресурсов времени выполнения (RRO). Это включает в себя:
- Рисованные
- Стили (например, внешний вид текста)
- Общие ресурсы (например, цвета)
Папка наложения RRO содержит ресурсы, используемые для создания одного RRO для каждого целевого приложения. Эти ресурсы могут относиться только к:
- Значения, определенные в одном и том же RRO (например, для цвета это будет шестнадцатеричное значение).
- Ресурсы платформы Android (например,
@android:color/accent
). - Ресурс, определенный в приведенном выше наложении времени сборки.
Общая структура
Предлагаемая структура наложения настройки выглядит следующим образом:
<path-to-OEM-overlays>/
overlay/framework/base/core/res/
. Ресурсы наложения во время сборкиrro/
Android.mk
. Makefile, используемый для создания RRO для каждого целевого пакета на основе ресурсов, содержащихся в этой папке.AndroidManifest.xml
. Шаблон файла манифеста, используемый приведенным выше make-файлом.res/
. Наложения времени выполнения, которые применяются ко всем целевым приложениям.
OEM-производители могут иметь более одной из этих структур, в зависимости от количества брендов, которые они хотят обрабатывать в одной целевой сборке (см. Обработка нескольких брендов ).
Наложения ресурсов среды выполнения
Папка RRO в папке наложения OEM должна содержать ресурсы, которые будут применяться ко всем целевым приложениям. У RRO есть ограничения, влияющие на их способность накладывать сложные ресурсы. Вкратце, RRO:
Невозможно ссылаться на идентификаторы ресурсов, определенные в целевом APK или в самом RRO. Это означает, что RRO не могут добавлять новые идентификаторы, такие как новые объекты рисования, цвета или стили.
Может относятся к идентификаторам ресурсов, определенным в платформе, независимо от того, определены ли эти ресурсы в
/frameworks/base/core/res
или посредством наложения во время сборки. Эти идентификаторы должны передаваться с использованием пространства именandroid:
::Для общедоступных RRO DeviceDefault используйте
android
.
Например,@android:style/TextAppearance.DeviceDefault.Large
.Для всех остальных (частных или ресурсов, добавленных посредством наложения во время сборки) используйте
*android
.
Например,@*android/style:TextAppearance.OEM.Brand1.Title
.
Помимо ресурсов, папка RRO должна содержать:
AndroidManifest.xml
. В приведенном ниже примереRRO_PACKAGE_NAME
иTARGET_PACKAGE_NAME
являются заполнителями для make-файлов:<?xml version=“1.0” encoding=“utf-8”?> <manifest xmlns:android=“http://schemas.android.com/apk/res/android” package=“{{RRO_PACKAGE_NAME}}” /> <application android:hasCode=“false” /> <overlay android:priority=“10” android:targetPackage=“{{TARGET_PACKAGE_NAME}}” android:requiredSystemPropertyName=“ro.product.sku” android:requiredSystemPropertyValue=“<your-product-sku>” /> </manifest>
Android.mk
, в которомoem
в следующем make-файле определяет префикс, который будут иметь все сгенерированные RRO.LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) CAR_UI_RRO_SET_NAME := oem CAR_UI_RESOURCE_DIR := $(LOCAL_PATH)/res CAR_UI_RRO_TARGETS := $(CAR_UI_RRO_PACKAGE_NAMES) include packages/apps/Car/libs/car-ui-lib/generate_rros.mk
Настройка RRO
Поддерживается новый файл конфигурации overlayable.xml
, который можно использовать для определения элементов управления доступом. Например, вы можете указать, кто может накладывать ресурсы, а также какие ресурсы можно накладывать. В результате ресурсы теперь можно группировать по-разному, чтобы сделать их доступными для наложения различных RRO.
Чтобы настроить контроль доступа RRO:
- В папке
res/values
создайтеoverlayable.xml
. - Создайте теги ресурсов
<overlayable>
. - Определите атрибут
name
для тега<overlayable>
, который должен быть уникальным в пакете. Каждое наложение может быть нацелено только на одну накладываемую группу. - Определите тег
<policy>
внутри<overlayable>
. - Определите группы ресурсов, которые можно накладывать. Например:
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
Чтобы применить следующие изменения к вашему проекту RRO:
- В папке
res/xml
создайтеoverlays.xml
. См. запись в примере кода ниже дляoverlay
. - Определите ресурсы, которые будут переопределены.
- Добавьте
android:resourcesMap="@xml/overlays"
в тег<overlay>
вAndroidManifest.xml
. Например, в приведенном ниже примере кода см. запись для<overlay>
. - Установите
android:isStatic=”true”
для статического наложения. Каждое наложение может быть нацелено только на одну из групп, которые могут быть наложены.
Рассмотрим следующий пример. Первый раздел принадлежит AndroidManifest.xml
, а второй раздел — overlays.xml
.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.car.ui.rro" android:versionCode="1" android:versionName="1.0"> <overlay android:targetName="OverlayableResources" android:resourcesMap="@xml/overlays" android:targetPackage="com.android.car.ui" android:priority="1" android:isStatic="false" /> </manifest> <overlay> <item target="string/app_title" value="@ string/app_title" /> </overlay>
С одной оговоркой: ранее существовавшие RRO работают в Android 10. Предостережение заключается в том, что для установки с помощью PackageManagerRRO пакеты должны быть либо предварительно установлены, либо подписаны тем же ключом, что и целевое приложение. В Android 10 файлы макета можно накладывать. Однако для этого необходимо использовать requireViewById()
при получении представления вместо findViewById()
. В Android 10 это изменение было реализовано в car-ui-lib для поддержки наложений макета.
Следующий основной выпуск Android позволит вам накладывать файл макета, определять новые ресурсы в пакете RRO и ссылаться на них внутри.
Добавьте ресурсы, специфичные для OEM-производителей
Чтобы преодолеть ограничения RRO, которые не позволяют добавлять OEM-ресурсы:
- Расширяйте фреймворки/базу, используя оверлей во время сборки , добавляя любые необходимые ресурсы.
- Обратитесь к этим ресурсам OEM-RRO, используя пространство имен
*android:
Например, ниже приведен способ добавить специальный объект OEM и использовать его в RRO:
<path-to-OEM-overlays>
overlay/framework/base/core/res/res/drawable/
oem_background_drawable.xml
rro/res/values
drawables.xml
<resources> <item type="drawable" name="car_ui_toolbar_background"> @*android:drawable/oem_background_drawable </item> </resources>
Работайте с несколькими брендами
Файлы манифеста RRO имеют синтаксис, позволяющий применять их условно в зависимости от свойств системы. Чтобы обрабатывать несколько брендов в одном образе системы, OEM-производители могут использовать это следующим образом (см. Общая структура ).
<?xml version=“1.0” encoding=“utf-8”?> <manifest xmlns:android=“http://schemas.android.com/apk/res/android” package=“{{RRO_PACKAGE_NAME}}”/> <application android:hasCode=“false”/> <overlay android:priority=“10” android:targetPackage=“{{TARGET_PACKAGE_NAME}}” android:requiredSystemPropertyName=“ro.product.sku” android:requiredSystemPropertyValue=“<your-product-sku>”/> </manifest>
Синтаксис android:requiredSystemPropertyName
и android:requiredSystemPropertyValue
приведет к включению этого RRO только в том случае, если соответствующее системное свойство соответствует предоставленному значению. Затем OEM-производители могут определить несколько таких RRO, все они будут статически включены и активны только по одному.
Добавить библиотеку пользовательского интерфейса автомобиля в цель
Чтобы включить библиотеку пользовательского интерфейса автомобиля в цель Android, необходимо включить следующий фрагмент кода:
# Include build-time overlays PRODUCT_PACKAGE_OVERLAYS += \ <path-to-oem-overlays>/overlay # Define package names to generate RROs for CAR_UI_RRO_PACKAGE_NAMES += \ com.android.car.ui.paintbooth \ com.android.car.media \ com.android.car.dialer \ com.android.car.linkviewer \ com.android.car.settings \ com.android.car.systemupdater \ com.google.android.apps.automotive.inputmethod \ com.google.android.apps.automotive.templates.host \ ... # Include generated RROs PRODUCT_PACKAGES += \ oem-com-android-car-ui-paintbooth \ oem-com-android-car-media \ oem-com-android-car-dialer \ oem-com-android-car-linkviewer \ oem-com-android-car-settings \ oem-com-android-car-systemupdater \ oem-com-google-android-apps-automotive-inputmethod \ oem-com-google-android-apps-automotive-templates-host \ ...
Приводит к тому, что
<path-to-OEM-overlays>/rro/Android.mk
генерирует один RRO для каждого из пакетов, указанных вCAR_UI_RRO_PACKAGE_NAMES
.Включает сгенерированные RRO в
PRODUCT_PACKAGES
.Включает наложение времени сборки в
PRODUCT_PACKAGE_OVERLAYS
для добавления ресурсов, специфичных для OEM.
Чтобы узнать, какие пакеты поддерживают car-ui-lib
, см. Список пакетов, содержащих car-ui-lib .