ปรับแต่งแอพ

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

  • การซ้อนทับเวลาบิลด์ เพิ่มทรัพยากรใดๆ ที่จำเป็นสำหรับการซ้อนทับทรัพยากรรันไทม์ (RRO) ซึ่งรวมถึง:

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

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

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

โครงสร้างโอเวอร์เลย์การปรับแต่งที่เสนอมีดังนี้:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ ทรัพยากรการซ้อนทับเวลาบิลด์

    • rro/

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

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

      • res/ . รันไทม์ซ้อนทับเพื่อนำไปใช้กับแอปเป้าหมายทั้งหมด

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

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

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

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

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

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

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

นอกจากทรัพยากรแล้ว โฟลเดอร์ RRO จะต้องมี:

  • AndroidManifest.xml ในตัวอย่างด้านล่าง RRO_PACKAGE_NAME และ TARGET_PACKAGE_NAME เป็นตัวยึดตำแหน่งสำหรับ makefiles:

    <?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. ในโฟลเดอร์ res/values ​​ให้สร้าง overlayable.xml
  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. ในโฟลเดอร์ res/xml ให้สร้าง overlays.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:

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

ตัวอย่างเช่น ต่อไปนี้เป็นวิธีเพิ่ม Drawable เฉพาะของ 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>
        

รับมือหลายยี่ห้อ

ไฟล์รายการ 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 เหล่านี้ได้หลายรายการ โดยทั้งหมดเปิดใช้งานแบบคงที่ และมีการใช้งานเพียงครั้งละรายการเท่านั้น

เพิ่มไลบรารี Car UI ให้กับเป้าหมาย

หากต้องการรวมไลบรารี Car 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 หนึ่งรายการสำหรับแต่ละแพ็คเกจที่มีชื่อใน CAR_UI_RRO_PACKAGE_NAMES

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

  • รวมการซ้อนทับเวลาบิลด์ใน PRODUCT_PACKAGE_OVERLAYS เพื่อเพิ่มทรัพยากรเฉพาะของ OEM

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