Sesuaikan aplikasi

Setelah komponen dan resource library UI Mobil masuk ke aplikasi, untuk menyesuaikan aplikasi tersebut, OEM harus menyediakan dua overlay:

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

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

    • Nilai yang ditentukan dalam RRO yang sama (misalnya, untuk warna, ini akan berupa heksadesimal nilai).
    • 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 menghasilkan RRO untuk setiap paket target berdasarkan sumber daya yang terkandung dalam folder ini.

      • AndroidManifest.xml. Template file manifes yang digunakan oleh yang di atas {i>makefile<i}.

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

OEM mungkin memiliki lebih dari satu struktur ini, bergantung pada jumlah merek yang ingin 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 di RRO itu sendiri. Ini berarti bahwa RRO tidak dapat menambahkan ID baru seperti drawable, warna, atau gaya.

  • Dapat merujuk ke ID resource yang ditentukan di terlepas dari apakah resource tersebut ditentukan dalam /frameworks/base/core/res atau dengan cara dari overlay waktu build. ID ini harus dirujuk menggunakan android: nama-ruang:

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

    • Untuk semua lainnya (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 ini, 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 tempat oem dalam makefile berikut menentukan awalan yang dimiliki semua 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
      

Mengonfigurasi RRO

File konfigurasi baru didukung, overlayable.xml, yang dapat Anda gunakan untuk menentukan mengakses dengan kontrol akses yang sangat terperinci. Misalnya, Anda dapat menentukan siapa yang dapat menempatkan sumber daya dan sumber daya mana dapat menggunakan overlay. Akibatnya, sekarang resource dapat dikelompokkan dalam berbagai cara untuk membuatnya yang tersedia untuk ditempati oleh berbagai RRO.

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 akan harus unik di dalam paket. Setiap overlay hanya dapat menargetkan satu grup yang dapat ditempatkan.
  4. Tentukan tag <policy> di dalam <overlayable>.
  5. Menentukan grup resource yang dapat di-overlay. Contoh:
      <resources>
          <overlayable name="OverlayableResources">
              <policy type="public">
                  <item type="string" name="app_title" />
              </policy>
          </overlayable>
      </resources>
      

Untuk menerapkan perubahan berikut ke 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 <overlay> di AndroidManifest.xml. Misalnya, dalam contoh kode di bawah ini, lihat entri untuk <overlay> .
  4. Setel android:isStatic=”true” untuk overlay statis. Setiap overlay hanya dapat menargetkan salah satu grup yang dapat dihamparkan.

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 peringatan, RRO yang sudah ada sebelumnya dapat berfungsi di Android 10. Peringatan yang akan diinstal dengan PackageManagerRRO, paket harus sudah diinstal sebelumnya atau yang ditandatangani dengan kunci yang sama dengan aplikasi target. Di Android 10, file tata letak dapat ditempatkan sebagai overlay. Namun, sehingga diperlukan penggunaan requireViewById() saat mendapatkan tampilan, bukan findViewById(). Di Android 10, perubahan ini telah diimplementasikan ke car-ui-lib untuk mendukung overlay tata letak.

Rilis utama Android berikutnya akan memungkinkan Anda menempatkan file tata letak dan mendefinisikan sumber daya baru dalam paket RRO dan merujuknya secara internal.

Menambahkan resource khusus OEM

Untuk mengatasi batasan RRO yang mencegah penambahan resource OEM:

  • Memperluas framework/dasar menggunakan overlay build-time, dengan menambahkan overlay yang diperlukan Google Cloud Platform.
  • Lihat referensi ini dari RRO OEM menggunakan namespace *android:.

Misalnya, berikut adalah cara untuk menambahkan drawable khusus OEM dan menggunakannya dalam 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 bersyarat berdasarkan sistem properti baru. Untuk menangani beberapa merek dalam satu image sistem, OEM dapat menggunakan ini sebagai ikuti (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 hanya diaktifkan 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 pada satu waktu.

Menambahkan library UI Mobil ke target

Untuk menyertakan 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 peristiwa dari paket yang dinamai dalam CAR_UI_RRO_PACKAGE_NAMES.

  • Menyertakan RRO yang dihasilkan di PRODUCT_PACKAGES.

  • Menyertakan overlay waktu build di PRODUCT_PACKAGE_OVERLAYS untuk menambahkan fitur khusus OEM Google Cloud Platform.

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