Теперь, когда компоненты и ресурсы библиотеки пользовательского интерфейса автомобиля добавлены в приложения, чтобы настроить эти приложения, OEM-производители должны предоставить два наложения:
Наложение времени сборки. Это наложение добавит любые ресурсы, необходимые для 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 есть ограничения, влияющие на их способность накладывать составные ресурсы. Таким образом, РРО:
Не может ссылаться на идентификаторы ресурсов, определенные в целевом 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/valuesdrawables.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 .