ขณะนี้คอมโพเนนต์ไลบรารี 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:
- ในโฟลเดอร์
res/values
ให้สร้างoverlayable.xml
- สร้างแท็กทรัพยากร
<overlayable>
- กำหนดแอตทริบิวต์
name
สำหรับแท็ก<overlayable>
ซึ่งจะต้องไม่ซ้ำกันในแพ็คเกจ การวางซ้อนแต่ละรายการสามารถกำหนดเป้าหมายกลุ่มที่ซ้อนทับได้เพียงกลุ่มเดียว เท่านั้น - กำหนดแท็ก
<policy>
ภายใน<overlayable>
- กำหนดกลุ่มของทรัพยากรที่สามารถซ้อนทับได้ ตัวอย่างเช่น:
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
หากต้องการใช้การเปลี่ยนแปลงต่อไปนี้กับโครงการ RRO ของคุณ:
- ในโฟลเดอร์
res/xml
ให้สร้างoverlays.xml
ดูรายการในตัวอย่างโค้ดด้านล่างสำหรับoverlay
- กำหนดทรัพยากรที่จะแทนที่
- เพิ่ม
android:resourcesMap="@xml/overlays"
ให้กับแท็ก<overlay>
ในAndroidManifest.xml
ตัวอย่างเช่น ในตัวอย่างโค้ดด้านล่าง ดูรายการสำหรับ<overlay>
- ตั้งค่า
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