ปรับแต่งแอป

เมื่อนำคอมโพเนนต์และทรัพยากรของไลบรารี 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 ที่ใช้โดย Makefile

      • 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 เป็นตัวยึดตำแหน่งสำหรับไฟล์ 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 ซึ่ง oem ในไฟล์ต่อไปนี้กำหนดคำนำหน้า ที่ 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 ในขณะที่ส่วนที่ 2 เกี่ยวข้องกับ 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:

ตัวอย่างเช่น วิธีเพิ่มปุ่มที่ถอนออกได้สำหรับ 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 เหล่านี้ทั้งหมดเปิดใช้อยู่แบบคงที่และใช้งานได้ครั้งละ 1 รายการเท่านั้น

เพิ่มไลบรารี UI ของ Car ไปยังเป้าหมาย

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

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

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

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