Menyesuaikan aplikasi

Setelah komponen dan resource library UI Mobil dimasukkan ke dalam aplikasi, untuk menyesuaikan aplikasi ini, OEM harus menyediakan dua overlay:

  • Overlay waktu build menambahkan resource yang diperlukan untuk runtime resource overlay (RRO). Hal ini mencakup:

    • Drawable
    • Gaya (misalnya, tampilan teks)
    • Resource bersama (misalnya, warna)
  • Folder overlay RRO berisi resource yang digunakan untuk membuat satu RRO per aplikasi target. Resource ini hanya dapat merujuk ke:

    • Nilai yang ditentukan dalam RRO yang sama (misalnya, untuk warna, ini akan berupa nilai heksadesimal).
    • Resource framework Android (misalnya, @android:color/accent).
    • Resource yang ditentukan dalam overlay waktu build di atas.

Struktur umum

Struktur overlay penyesuaian yang diusulkan adalah sebagai berikut:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/. Resource overlay waktu build

    • rro/

      • Android.mk. Makefile yang digunakan untuk membuat RRO untuk setiap paket target berdasarkan resource yang terdapat dalam folder ini.

      • AndroidManifest.xml. Template file manifes yang digunakan oleh makefile di atas.

      • res/. Overlay runtime yang akan diterapkan ke semua aplikasi target.

OEM mungkin memiliki lebih dari satu struktur ini, bergantung pada jumlah merek yang ingin mereka tangani dalam satu target build (lihat Menangani beberapa merek).

Overlay resource runtime

Folder RRO di folder overlay OEM harus berisi resource yang akan diterapkan ke semua aplikasi target. RRO memiliki batasan yang memengaruhi kemampuannya untuk menempatkan resource gabungan. Singkatnya, RRO:

  • Tidak dapat merujuk ke ID resource yang ditentukan dalam APK target, atau dalam RRO itu sendiri. Artinya, RRO tidak dapat menambahkan ID baru seperti drawable, warna, atau gaya baru.

  • Dapat merujuk ke ID resource yang ditentukan dalam framework, baik resource tersebut ditentukan di /frameworks/base/core/res atau melalui overlay waktu build. ID ini harus dirujuk menggunakan namespace android::

    • Untuk RRO DeviceDefault publik, gunakan android.
      Misalnya, @android:style/TextAppearance.DeviceDefault.Large.

    • Untuk semua yang lain (non-publik atau resource yang ditambahkan melalui overlay waktu build), gunakan *android.
      Misalnya, @*android/style:TextAppearance.OEM.Brand1.Title.

Selain resource, folder RRO harus berisi:

  • AndroidManifest.xml. Dalam contoh di bawah, RRO_PACKAGE_NAME dan TARGET_PACKAGE_NAME adalah placeholder untuk makefile:

    <?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 dengan oem dalam makefile berikut menentukan awalan yang akan dimiliki semua RRO yang dihasilkan.
      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
      

Mengonfigurasi RRO

File konfigurasi baru didukung, overlayable.xml, yang dapat Anda gunakan untuk menentukan kontrol akses. Misalnya, Anda dapat menentukan siapa yang dapat menempatkan overlay pada resource serta resource mana yang dapat ditempatkan overlay. Akibatnya, resource kini dapat dikelompokkan dengan cara yang berbeda agar tersedia untuk ditempatkan oleh RRO yang berbeda.

Untuk menyiapkan kontrol akses RRO:

  1. Di folder res/values, buat overlayable.xml.
  2. Buat tag resource <overlayable>.
  3. Tentukan atribut name untuk tag <overlayable>, yang harus unik dalam paket. Setiap overlay dapat menargetkan hanya satu grup yang dapat di-overlay.
  4. Tentukan tag <policy> di dalam <overlayable>.
  5. Tentukan grup resource yang dapat ditempatkan. Contoh:
      <resources>
          <overlayable name="OverlayableResources">
              <policy type="public">
                  <item type="string" name="app_title" />
              </policy>
          </overlayable>
      </resources>
      

Untuk menerapkan perubahan berikut pada project RRO Anda:

  1. Di folder res/xml, buat overlays.xml. Lihat entri dalam contoh kode di bawah untuk overlay.
  2. Tentukan resource yang akan diganti.
  3. Tambahkan android:resourcesMap="@xml/overlays" ke tag <overlay> di AndroidManifest.xml. Misalnya, dalam contoh kode di bawah, lihat entri untuk <overlay> .
  4. Tetapkan android:isStatic=”true” untuk overlay statis. Setiap overlay hanya dapat menarget salah satu grup yang dapat ditempatkan.

Perhatikan contoh berikut. Bagian pertama adalah milik AndroidManifest.xml, sedangkan bagian kedua berkaitan dengan 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>
  

Dengan satu pengecualian, RRO yang ada sebelumnya berfungsi di Android 10. Namun, untuk diinstal dengan PackageManagerRRO, paket harus diinstal sebelumnya atau ditandatangani dengan kunci yang sama dengan aplikasi target. Di Android 10, file tata letak dapat ditempatkan. Namun, melakukannya memerlukan penggunaan requireViewById() saat mendapatkan tampilan, bukan findViewById(). Di Android 10, perubahan ini telah diterapkan ke car-ui-lib untuk mendukung overlay tata letak.

Rilis utama Android berikutnya akan memungkinkan Anda menempatkan file tata letak dan menentukan resource baru dalam paket RRO serta merujuknya secara internal.

Menambahkan resource khusus OEM

Untuk mengatasi batasan RRO yang mencegah penambahan resource OEM:

  • Memperluas framework/basis menggunakan overlay build-time, dengan menambahkan resource yang diperlukan.
  • Lihat resource ini dari RRO OEM menggunakan namespace *android:.

Misalnya, berikut adalah cara menambahkan drawable khusus OEM dan menggunakannya di 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>

Menangani beberapa merek

File manifes RRO memiliki sintaksis untuk memungkinkannya diterapkan secara kondisional berdasarkan properti sistem. Untuk menangani beberapa merek dalam satu image sistem, OEM dapat menggunakannya sebagai berikut (lihat Struktur umum).

<?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>

Sintaksis untuk android:requiredSystemPropertyName dan android:requiredSystemPropertyValue akan menyebabkan RRO ini diaktifkan hanya jika properti sistem yang sesuai cocok dengan nilai yang diberikan. OEM kemudian dapat menentukan beberapa RRO ini, semuanya diaktifkan secara statis, dan hanya memiliki satu yang aktif dalam satu waktu.

Menambahkan library UI Mobil ke target

Untuk menggabungkan library UI Mobil ke target Android, Anda harus menyertakan cuplikan kode berikut:

# 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 \
      ...
  • Menyebabkan <path-to-OEM-overlays>/rro/Android.mk menghasilkan satu RRO untuk setiap paket yang diberi nama di CAR_UI_RRO_PACKAGE_NAMES.

  • Mencakup RRO yang dihasilkan di PRODUCT_PACKAGES.

  • Menyertakan overlay waktu build di PRODUCT_PACKAGE_OVERLAYS untuk menambahkan resource khusus OEM.

Untuk mempelajari paket yang mendukung car-ui-lib, lihat Daftar paket yang berisi car-ui-lib.