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