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