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