ปรับแต่งแอป

เมื่อใส่คอมโพเนนต์และทรัพยากรของไลบรารี UI ของรถลงในแอปแล้ว OEM จะต้องใส่การวางซ้อน 2 รายการต่อไปนี้เพื่อปรับแต่งแอป

  • การซ้อนทับเวลาสร้างจะเพิ่มทรัพยากรที่จําเป็นสําหรับการซ้อนทับทรัพยากรรันไทม์ (RRO) ซึ่งรวมถึงข้อมูลต่อไปนี้

    • เนื้อหาที่ถอนออกได้
    • สไตล์ (เช่น ลักษณะข้อความ)
    • ทรัพยากรที่แชร์ (เช่น สี)
  • โฟลเดอร์การวางซ้อน RRO มีทรัพยากรที่ใช้สร้าง RRO 1 รายการต่อแอปเป้าหมาย ทรัพยากรเหล่านี้จะอ้างอิงถึงสิ่งต่อไปนี้ได้เท่านั้น

    • ค่าที่กําหนดภายใน RRO เดียวกัน (เช่น สําหรับสี ค่าจะเป็นค่าเลขฐานสิบหก)
    • แหล่งข้อมูลเฟรมเวิร์ก Android (เช่น @android:color/accent)
    • ทรัพยากรที่กําหนดไว้ในการวางซ้อนเวลาสร้างด้านบน

โครงสร้างทั่วไป

โครงสร้างการซ้อนทับการปรับแต่งที่เสนอมีดังนี้

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/. ทรัพยากรการวางซ้อนสำหรับเวลาสร้าง

    • rro/

      • Android.mk. Makefile ที่ใช้ในการสร้าง RRO สำหรับแพ็กเกจเป้าหมายแต่ละรายการโดยอิงตามทรัพยากรที่อยู่ในโฟลเดอร์นี้

      • AndroidManifest.xml. เทมเพลตไฟล์ Manifest ที่ใช้โดยไฟล์ make ด้านบน

      • res/ การวางซ้อนรันไทม์ที่จะใช้กับแอปเป้าหมายทั้งหมด

OEM อาจมีโครงสร้างเหล่านี้มากกว่า 1 รายการ ทั้งนี้ขึ้นอยู่กับจำนวนแบรนด์ที่ต้องการจัดการในเป้าหมายการสร้างรายการเดียว (ดูจัดการหลายแบรนด์)

การซ้อนทับทรัพยากรรันไทม์

โฟลเดอร์ RRO ในโฟลเดอร์การวางซ้อน OEM ควรมีทรัพยากรที่จะนำไปใช้กับแอปเป้าหมายทั้งหมด RRO มีข้อจำกัดที่ส่งผลต่อความสามารถในการวางซ้อนทรัพยากรคอมโพเนนต์ โดยสรุปแล้ว RRO จะมีลักษณะดังนี้

  • อ้างอิงตัวระบุทรัพยากรที่กําหนดไว้ใน APK เป้าหมายหรือใน RRO ไม่ได้ ซึ่งหมายความว่า RRO จะเพิ่มตัวระบุใหม่ไม่ได้ เช่น รูปภาพที่วาดได้ สี หรือสไตล์ใหม่

  • สามารถ อ้างอิงตัวระบุทรัพยากรที่กําหนดไว้ในเฟรมเวิร์ก ไม่ว่าทรัพยากรเหล่านั้นจะกําหนดไว้ใน /frameworks/base/core/res หรือใช้การซ้อนทับเวลาสร้าง ต้องอ้างอิงตัวระบุเหล่านี้โดยใช้เนมสเปซ android: ดังนี้

    • สำหรับ RRO ของ DeviceDefault สาธารณะ ให้ใช้ android
      เช่น @android:style/TextAppearance.DeviceDefault.Large

    • สําหรับรายการอื่นๆ ทั้งหมด (รายการที่ไม่ใช่สาธารณะหรือทรัพยากรที่เพิ่มผ่านการวางซ้อนเวลาสร้าง) ให้ใช้ *android
      ตัวอย่างเช่น @*android/style:TextAppearance.OEM.Brand1.Title

นอกจากทรัพยากรแล้ว โฟลเดอร์ RRO ต้องมีสิ่งต่อไปนี้ด้วย

  • AndroidManifest.xml ในตัวอย่างด้านล่าง RRO_PACKAGE_NAME และ TARGET_PACKAGE_NAME เป็นตัวยึดตําแหน่งสําหรับไฟล์ Make

    <?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 โดยที่ oem ในไฟล์ makefile ต่อไปนี้จะกำหนดคำนำหน้าของ 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
      

กำหนดค่า RRO

ระบบรองรับไฟล์การกําหนดค่าใหม่ overlayable.xml ซึ่งคุณใช้เพื่อกําหนดการควบคุมการเข้าถึงได้ เช่น คุณสามารถระบุผู้ที่วางซ้อนทรัพยากรได้ รวมถึงทรัพยากรที่วางซ้อนได้ ด้วยเหตุนี้ ตอนนี้คุณจึงจัดกลุ่มทรัพยากรได้หลายวิธีเพื่อให้ RRO ต่างๆ วางซ้อนกันได้

วิธีตั้งค่าการควบคุมการเข้าถึง RRO

  1. สร้าง overlayable.xml ในโฟลเดอร์ res/values
  2. สร้างแท็กทรัพยากร <overlayable>
  3. กำหนดแอตทริบิวต์ name สำหรับแท็ก <overlayable> ซึ่งต้องไม่ซ้ำกันในแพ็กเกจ การวางซ้อนแต่ละรายการจะกําหนดเป้าหมายเป็นกลุ่มที่วางซ้อนได้เพียงกลุ่มเดียว
  4. กําหนดแท็ก <policy> ภายใน <overlayable>
  5. กำหนดกลุ่มทรัพยากรที่วางซ้อนกันได้ เช่น
      <resources>
          <overlayable name="OverlayableResources">
              <policy type="public">
                  <item type="string" name="app_title" />
              </policy>
          </overlayable>
      </resources>
      

วิธีใช้การเปลี่ยนแปลงต่อไปนี้กับโปรเจ็กต์ RRO

  1. สร้าง overlays.xml ในโฟลเดอร์ res/xml ดูรายการ overlay ในตัวอย่างโค้ดด้านล่าง
  2. กำหนดทรัพยากรที่จะลบล้าง
  3. เพิ่ม android:resourcesMap="@xml/overlays" ลงในแท็ก <overlay> ใน AndroidManifest.xml เช่น ในตัวอย่างโค้ดด้านล่าง ให้ดูรายการสำหรับ <overlay>
  4. ตั้งค่าเป็น android:isStatic=”true” สำหรับการวางซ้อนแบบคงที่ การวางซ้อนแต่ละรายการจะกําหนดเป้าหมายได้เพียงกลุ่มเดียวที่วางซ้อนได้

ลองดูตัวอย่างต่อไปนี้ ส่วนแรกเป็นของ AndroidManifest.xml ส่วนที่สองเป็นของ 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>
  

ข้อจํากัดเพียงอย่างเดียวคือ RRO ที่มีอยู่ก่อนหน้านี้จะใช้งานได้ใน Android 10 ข้อควรระวังคือ หากต้องการติดตั้งด้วย PackageManagerRRO แพ็กเกจต้องติดตั้งล่วงหน้าหรือลงนามด้วยคีย์เดียวกับแอปเป้าหมาย ใน Android 10 คุณจะวางซ้อนไฟล์เลย์เอาต์ได้ อย่างไรก็ตาม การดําเนินการดังกล่าวต้องใช้ requireViewById() ขณะรับมุมมองแทน findViewById() ใน Android 10 มีการใช้การเปลี่ยนแปลงนี้กับ car-ui-lib เพื่อรองรับการวางซ้อนเลย์เอาต์

Android เวอร์ชันหลักรุ่นถัดไปจะช่วยให้คุณวางซ้อนไฟล์เลย์เอาต์และกำหนดทรัพยากรใหม่ในแพ็กเกจ RRO รวมถึงอ้างอิงทรัพยากรเหล่านั้นได้ภายใน

เพิ่มแหล่งข้อมูลเฉพาะ OEM

วิธีแก้ไขข้อจำกัดของ RRO ที่ป้องกันไม่ให้เพิ่มทรัพยากร OEM

  • ขยายเฟรมเวิร์ก/ฐานโดยใช้การวางซ้อนเวลาสร้าง โดยเพิ่มทรัพยากรที่จำเป็น
  • โปรดดูแหล่งข้อมูลเหล่านี้จาก RRO ของ OEM โดยใช้การแยกชื่อ *android:

ตัวอย่างเช่น ต่อไปนี้เป็นวิธีเพิ่มไฟล์ภาพสำหรับ OEM ที่เฉพาะเจาะจงและใช้ไฟล์ดังกล่าวใน 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>

จัดการหลายแบรนด์

ไฟล์ Manifest ของ RRO มีไวยากรณ์ที่อนุญาตให้ใช้แบบมีเงื่อนไขตามพร็อพเพอร์ตี้ของระบบ หากต้องการจัดการหลายแบรนด์ในอิมเมจระบบเดียว OEM สามารถใช้ข้อมูลต่อไปนี้ (ดูโครงสร้างทั่วไป)

<?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:requiredSystemPropertyName และ android:requiredSystemPropertyValue จะทําให้เปิดใช้ RRO นี้เฉพาะ หากพร็อพเพอร์ตี้ระบบที่เกี่ยวข้องตรงกับค่าที่ระบุ จากนั้น OEM จะกำหนด RRO เหล่านี้ได้หลายรายการ โดยเปิดใช้ทั้งหมดแบบคงที่ และมีการใช้งานได้ครั้งละรายการเดียว

เพิ่มไลบรารี UI ของรถลงในเป้าหมาย

หากต้องการรวมไลบรารี UI ของรถยนต์เข้ากับเป้าหมาย Android คุณต้องใส่ข้อมูลโค้ดต่อไปนี้

# 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 \
      ...
  • ทําให้ <path-to-OEM-overlays>/rro/Android.mk สร้าง RRO 1 รายการสําหรับแต่ละแพ็กเกจที่ระบุชื่อใน CAR_UI_RRO_PACKAGE_NAMES

  • รวม RRO ที่สร้างขึ้นใน PRODUCT_PACKAGES

  • มีการวางซ้อนเวลาสร้างใน PRODUCT_PACKAGE_OVERLAYS เพื่อเพิ่มแหล่งข้อมูลสำหรับ OEM โดยเฉพาะ

หากต้องการดูว่าแพ็กเกจใดรองรับ car-ui-lib โปรดดูรายการแพ็กเกจที่มี car-ui-lib