Apps anpassen

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 der android: 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 sind RRO_PACKAGE_NAME und TARGET_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, wobei oem 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:

  1. Erstellen Sie overlayable.xml im Ordner res/values.
  2. Erstellen Sie die <overlayable>-Ressourcen-Tags.
  3. 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.
  4. Definieren Sie das <policy>-Tag innerhalb von <overlayable>.
  5. 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:

  1. Erstellen Sie overlays.xml im Ordner res/xml. Siehe den Eintrag in der Codebeispiel für overlay.
  2. Definieren Sie die zu überschreibenden Ressourcen.
  3. android:resourcesMap="@xml/overlays" zu <overlay> hinzufügen in AndroidManifest.xml. Im Codebeispiel unten sehen Sie beispielsweise den Eintrag für <overlay>
  4. 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 in CAR_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.