Da die Komponenten und Ressourcen der Car-UI-Bibliothek nun in den Apps enthalten sind, können Sie müssen OEMs zwei Overlays bereitstellen:
-
Build-Time-Overlay: Fügen alle Ressourcen hinzu, die für den Runtime Resource Overlay (RROs) an. Sie beinhalten die folgenden Funktionen:
- Drawables
- Stile (z. B. Textdarstellung)
- Gemeinsam genutzte Ressourcen (z. B. Farben)
-
Der Ordner RROoverlay enthält die Ressourcen, die zum Generieren einer RRO pro Ziel-App an. Diese Ressourcen können sich nur auf Folgendes beziehen:
- Werte, die innerhalb derselben RRO definiert sind (für eine Farbe wäre dies z. B. ein hexadezimaler Wert) -Wert).
- Android-Framework-Ressourcen (z. B.
@android:color/accent
). - Eine Ressource, die im obigen Build-Zeit-Overlay definiert ist.
Allgemeine Struktur
Die vorgeschlagene Struktur für Anpassungs-Overlays sieht so aus:
-
<path-to-OEM-overlays>/
-
overlay/framework/base/core/res/
Overlay-Ressourcen zur Build-Zeit -
rro/
-
Android.mk
Makefile zum Generieren der RROs für jedes Zielpaket basierend auf den Ressourcen in diesem Ordner. -
AndroidManifest.xml
Eine Manifestdateivorlage, die oben verwendet wird Makefile zu erstellen. -
res/
Laufzeit-Overlays, die auf alle Ziel-Apps angewendet werden sollen.
-
-
OEMs können mehrere dieser Strukturen haben, je nachdem, wie viele Marken sie Handle in einem einzelnen Build-Ziel (siehe mehrere Marken verarbeiten.
Laufzeitressourcen-Overlays
Der RRO-Ordner im OEM-Overlay-Ordner sollte Ressourcen enthalten, die auf alle Ziel-Apps angewendet werden sollen. RROs haben Einschränkungen, die sich darauf auswirken, ob sie zusammengesetzte Ressourcen überlagern können. Zusammenfassung:
-
Darf nicht auf Ressourcen-IDs verweisen, die im Ziel-APK oder in der RRO selbst. Das bedeutet, dass RROs keine neuen Kennzeichnungen wie neue Drawables, Farben oder Stile.
-
Kann auf Ressourcen-IDs verweisen, die in den unabhängig davon, ob diese Ressourcen in
/frameworks/base/core/res
oder durch eines Overlays während der Build-Erstellung. Auf diese Kennungen muss mithilfe derandroid:
verwiesen werden. Namens-Leerzeichen:-
Verwenden Sie für öffentliche DeviceDefault-RROs
android
.
Beispiel:@android:style/TextAppearance.DeviceDefault.Large
. -
Für alle anderen (nicht öffentliche oder Ressourcen, die über Erstellungszeit-Overlay) verwenden
*android
.
Beispiel:@*android/style:TextAppearance.OEM.Brand1.Title
.
-
Zusätzlich zu den Ressourcen muss der RRO-Ordner Folgendes enthalten:
-
AndroidManifest.xml
Im folgenden Beispiel sindRRO_PACKAGE_NAME
undTARGET_PACKAGE_NAME
sind Platzhalter für die Makefiles:<?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
, wobeioem
im folgenden Makefile das Präfix definiert die alle generierten RROs haben würden.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
RROs konfigurieren
Die neue Konfigurationsdatei overlayable.xml
wird unterstützt, mit der Sie definieren können,
Zugriffssteuerungen. Sie können beispielsweise angeben, wer Ressourcen einblenden darf
überlagert werden kann. Daher können Ressourcen jetzt auf unterschiedliche Weise gruppiert werden,
von verschiedenen RROs überlagert werden.
So richten Sie die RRO-Zugriffssteuerung ein:
- Erstellen Sie
overlayable.xml
im Ordnerres/values
. - Erstellen Sie die
<overlayable>
-Ressourcen-Tags. - Definieren Sie das
name
-Attribut für das<overlayable>
-Tag, das muss im Paket eindeutig sein. Jedes Overlay kann nur auf eine überspringbare Gruppe ausgerichtet werden. - Definieren Sie das
<policy>
-Tag innerhalb von<overlayable>
. - Definieren Sie die Ressourcengruppen, die überlagert werden können. Hier einige Beispiele:
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
So wenden Sie die folgenden Änderungen auf Ihr RRO-Projekt an:
- Erstellen Sie
overlays.xml
im Ordnerres/xml
. Siehe den Eintrag in der Codebeispiel füroverlay
. - Definieren Sie die zu überschreibenden Ressourcen.
android:resourcesMap="@xml/overlays"
zu<overlay>
hinzufügen inAndroidManifest.xml
. Im Codebeispiel unten sehen Sie beispielsweise den Eintrag für<overlay>
- Legen Sie
android:isStatic=”true”
für ein statisches Overlay fest. Jedes Overlay kann nur auf einer der Gruppen, die eingeblendet werden können.
Betrachten Sie das folgende Beispiel. Der erste Abschnitt gehört zu AndroidManifest.xml
während sich der zweite Abschnitt auf overlays.xml
bezieht.
<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>
Mit einem Vorbehalt funktionieren zuvor vorhandene RROs unter Android 10. Der Warnhinweis
Da Pakete mit der PackageManagerRRO installiert werden, müssen sie entweder vorinstalliert oder
mit demselben Schlüssel wie die Ziel-App signiert. In Android 10 können Layoutdateien überlagert werden. Sie können jedoch
Hierfür muss beim Abrufen der Ansicht requireViewById()
anstelle von
findViewById()
. In Android 10 wurde diese Änderung in car-ui-lib zu
unterstützen Layout-Overlays.
Mit der nächsten Hauptversion von Android können Sie Layoutdateien überlagern und neue Ressourcen im RRO-Paket zu definieren und intern auf sie zu verweisen.
OEM-spezifische Ressourcen hinzufügen
So überwinden Sie die RRO-Einschränkungen, die verhindern, dass OEM-Ressourcen hinzugefügt werden:
- Erweitern Sie die Frameworks/Basis mithilfe eines Build-time-Overlays, indem Sie Ressourcen.
- Weitere Informationen finden Sie in den Ressourcen der OEM-RROs, die die
*android:
-Namespaces verwenden.
So können Sie beispielsweise ein OEM-spezifisches Drawable hinzufügen und in einer RRO verwenden:
-
<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>
-
-
Mehrere Marken verarbeiten
RRO-Manifestdateien haben eine Syntax, mit der sie basierend auf dem System bedingt angewendet werden können Eigenschaften. Um mehrere Marken in einem einzigen System-Image zu verarbeiten, können OEMs dieses als (siehe Allgemeine Struktur).
<?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>
Die Syntax für android:requiredSystemPropertyName
und
android:requiredSystemPropertyValue
würde dazu führen, dass dieser RRO nur aktiviert wird.
wenn die entsprechende Systemeigenschaft mit dem angegebenen Wert übereinstimmt. OEMs können dann mehrere
sind alle statisch aktiviert und es ist jeweils nur eine aktiv.
Auto-UI-Bibliothek zu einem Ziel hinzufügen
Um die Auto-UI-Bibliothek in ein Android-Ziel einzubinden, musst du das folgende Code-Snippet einfügen:
# 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 \ ...<ph type="x-smartling-placeholder"> <ph type="x-smartling-placeholder">
- </ph>
-
<path-to-OEM-overlays>/rro/Android.mk
generiert eine RRO pro der inCAR_UI_RRO_PACKAGE_NAMES
genannten Pakete. -
Enthält die generierten RROs in
PRODUCT_PACKAGES
. -
Enthält ein Build-Zeit-Overlay in
PRODUCT_PACKAGE_OVERLAYS
zum Hinzufügen eines OEM-spezifischen Ressourcen.
Informationen dazu, welche Pakete car-ui-lib
unterstützen, finden Sie unter Liste der Pakete, die car-ui-lib enthalten.