Sesuaikan aplikasi

Kini setelah komponen dan sumber daya pustaka UI Mobil dimasukkan ke dalam aplikasi, untuk menyesuaikan aplikasi ini, OEM harus menyediakan dua overlay:

  • Hamparan waktu build menambahkan sumber daya apa pun yang diperlukan untuk overlay sumber daya runtime (RRO). Ini termasuk:

    • Sumber daya dapat digambar
    • Gaya (misalnya, tampilan teks)
    • Sumber daya bersama (misalnya, warna)
  • Folder overlay RRO berisi sumber daya yang digunakan untuk menghasilkan satu RRO per aplikasi target. Sumber daya ini hanya dapat merujuk pada:

    • Nilai yang ditentukan dalam RRO yang sama (misalnya, untuk warna, nilainya adalah nilai heksadesimal).
    • Sumber daya kerangka kerja Android (misalnya, @android:color/accent ).
    • Sumber daya yang ditentukan dalam hamparan waktu pembangunan di atas.

Struktur umum

Struktur overlay kustomisasi yang diusulkan adalah sebagai berikut:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ . Sumber daya hamparan waktu pembangunan

    • rro/

      • Android.mk . Makefile digunakan untuk menghasilkan RRO untuk setiap paket target berdasarkan sumber daya yang terdapat dalam folder ini.

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

      • res/ . Hamparan waktu proses untuk diterapkan ke semua aplikasi target.

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

Hamparan sumber daya waktu proses

Folder RRO di folder overlay OEM harus berisi sumber daya untuk diterapkan ke semua aplikasi target. RRO memiliki keterbatasan yang mempengaruhi kemampuannya untuk menggabungkan sumber daya. Singkatnya, RRO:

  • Tidak dapat merujuk ke pengidentifikasi sumber daya yang ditentukan dalam APK target, atau dalam RRO itu sendiri. Artinya, RRO tidak dapat menambahkan pengidentifikasi baru seperti sumber daya dapat digambar, warna, atau gaya baru.

  • Bisa mengacu pada pengidentifikasi sumber daya yang ditentukan dalam kerangka kerja, baik sumber daya tersebut ditentukan dalam /frameworks/base/core/res atau melalui overlay waktu pembangunan. Pengidentifikasi ini harus dirujuk menggunakan android: name-space:

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

    • Untuk yang lainnya (non-publik atau sumber daya yang ditambahkan melalui overlay waktu pembangunan), gunakan *android .
      Misalnya, @*android/style:TextAppearance.OEM.Brand1.Title .

Selain sumber daya, folder RRO harus berisi:

  • AndroidManifest.xml . Pada 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 di makefile berikut mendefinisikan 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
      

Konfigurasikan RRO

File konfigurasi baru didukung, overlayable.xml , yang dapat Anda gunakan untuk menentukan kontrol akses. Misalnya, Anda dapat menentukan siapa yang dapat melapisi sumber daya serta sumber daya mana yang dapat dilapis. Hasilnya, sumber daya kini dapat dikelompokkan dengan cara berbeda agar tersedia untuk dilapis oleh RRO berbeda.

Untuk mengatur kontrol akses RRO:

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

Untuk menerapkan perubahan berikut pada proyek RRO Anda:

  1. Di folder res/xml , buat overlays.xml . Lihat entri dalam contoh kode di bawah untuk overlay .
  2. Tentukan sumber daya 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. Setel android:isStatic=”true” untuk overlay statis. Setiap overlay hanya dapat menargetkan satu grup yang dapat di-overlay.

Perhatikan contoh berikut. Bagian pertama milik AndroidManifest.xml sedangkan bagian kedua milik 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 berfungsi di Android 10. Peringatannya adalah bahwa untuk diinstal dengan PackageManagerRRO, paket harus sudah diinstal sebelumnya atau ditandatangani dengan kunci yang sama dengan aplikasi target. Di Android 10, file tata letak dapat di-overlay. Namun, hal tersebut memerlukan penggunaan requireViewById() saat mendapatkan tampilan, bukan findViewById() . Di Android 10, perubahan ini telah diterapkan pada car-ui-lib untuk mendukung overlay tata letak.

Rilis besar Android berikutnya akan memungkinkan Anda untuk menghamparkan file tata letak dan menentukan sumber daya baru dalam paket RRO dan merujuknya secara internal.

Tambahkan sumber daya khusus OEM

Untuk mengatasi keterbatasan RRO yang mencegah penambahan sumber daya OEM:

  • Perluas kerangka kerja/basis menggunakan overlay waktu pembangunan , tambahkan sumber daya apa pun yang diperlukan.
  • Lihat sumber daya ini dari OEM RRO menggunakan *android: namespace.

Misalnya, berikut ini adalah cara 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 banyak merek

File manifes RRO memiliki sintaksis yang memungkinkannya diterapkan secara kondisional berdasarkan properti sistem. Untuk menangani beberapa merek dalam satu citra 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>

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

Tambahkan perpustakaan UI Mobil ke target

Untuk menggabungkan pustaka 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 \
      ...
  • Penyebab <path-to-OEM-overlays>/rro/Android.mk menghasilkan satu RRO untuk setiap paket yang disebutkan dalam CAR_UI_RRO_PACKAGE_NAMES .

  • Termasuk RRO yang dihasilkan di PRODUCT_PACKAGES .

  • Menyertakan hamparan waktu pembuatan di PRODUCT_PACKAGE_OVERLAYS untuk menambahkan sumber daya khusus OEM.

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