การปรับแต่งแอพ

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

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

    • สำหรับ RRO เริ่มต้น ของ DeviceDefault ให้ใช้ 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 Library ไปยัง Target

หากต้องการรวมไลบรารี 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 โปรดดูที่ Packages Supported by car-ui-lib