Menyesuaikan Aplikasi

Sekarang komponen perpustakaan UI Mobil dan sumber daya ke dalam aplikasi, untuk menyesuaikan aplikasi ini, OEM harus menyediakan dua overlay:

  • Overlay waktu pembuatan. Overlay ini akan menambah sumber daya yang dibutuhkan untuk RRO. Ini termasuk:

    • dapat digambar
    • Gaya (misalnya, tampilan teks)
    • Sumber daya bersama (misalnya, warna)

  • lapisan RRO. Folder ini berisi sumber daya yang digunakan untuk menghasilkan satu RRO per aplikasi target. Sumber daya ini hanya dapat merujuk ke:

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

Struktur Umum

Struktur overlay kustomisasi yang diusulkan adalah sebagai berikut:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ . Sumber daya overlay waktu pembuatan

    • rro/

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

      • AndroidManifest.xml . Template 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 pembuatan (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 memengaruhi kemampuannya untuk melapisi sumber daya majemuk. Singkatnya, RRO:

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

  • Bisa merujuk ke pengidentifikasi sumber daya yang ditentukan dalam kerangka kerja, apakah sumber daya tersebut didefinisikan di /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 semua yang lain (non-publik atau sumber daya ditambahkan melalui overlay waktu build), gunakan *android
      Misalnya, @*android/style:TextAppearance.OEM.Brand1.Title

Selain sumber daya, 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 di mana oem dalam makefile berikut mendefinisikan awalan yang akan dimiliki oleh 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 Hamparan 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. Akibatnya, sumber daya sekarang dapat dikelompokkan dengan cara yang berbeda untuk membuatnya tersedia untuk dilapiskan oleh RRO yang berbeda.

Untuk menyiapkan 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 overlay hanya dapat menargetkan satu grup overlay.
  4. Tentukan tag <policy> di dalam <overlayable> .
  5. Tentukan kelompok sumber daya yang dapat dilapis. Misalnya:
      <resources>
          <overlayable name="OverlayableResources">
              <policy type="public">
                  <item type="string" name="app_title" />
              </policy>
          </overlayable>
      </resources>
      

Untuk menerapkan perubahan berikut ke proyek RRO Anda:

  1. Di folder res/xml , buat overlays.xml . Lihat entri dalam contoh kode di bawah ini untuk overlay .
  2. Tentukan sumber daya yang akan ditimpa.
  3. Tambahkan android:resourcesMap="@xml/overlays" ke tag <overlay> di AndroidManifest.xml . Misalnya, dalam contoh kode di bawah ini, lihat entri untuk <overlay> .
  4. Setel android:isStatic=”true” untuk hamparan statis. Setiap hamparan hanya dapat menargetkan satu grup yang dapat dilapis.

Perhatikan contoh berikut. Bagian pertama 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 akan terus berfungsi di Android 10. Peringatan 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, melakukannya memerlukan penggunaan requireViewById() saat mendapatkan tampilan alih-alih findViewById() . Di Android 10, perubahan ini telah diterapkan ke car-ui-lib untuk mendukung overlay tata letak.

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

Menambahkan Sumber Daya Khusus OEM

Untuk mengatasi batasan RRO yang mencegah sumber daya OEM ditambahkan:

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

Misalnya, berikut ini adalah cara untuk menambahkan sumber daya dapat digambar 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 sintaks untuk memungkinkannya diterapkan secara kondisional berdasarkan properti sistem. Untuk menangani beberapa merek dalam satu citra sistem, OEM dapat menggunakan ini 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 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 Perpustakaan UI Mobil ke Target

Untuk menggabungkan perpustakaan 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 .

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

Untuk mempelajari paket mana yang mendukung car-ui-lib , lihat Paket yang Didukung oleh car-ui-lib .