Giờ đây, các thành phần và tài nguyên của thư viện Giao diện người dùng ô tô đã được đưa vào ứng dụng. Để tuỳ chỉnh các ứng dụng này, nhà sản xuất thiết bị gốc (OEM) phải cung cấp hai lớp phủ:
-
Lớp phủ tại thời điểm tạo bản dựng sẽ thêm mọi tài nguyên cần thiết cho lớp phủ tài nguyên thời gian chạy (RRO). Trong đó có:
- Đối tượng có thể vẽ
- Kiểu (ví dụ: giao diện văn bản)
- Tài nguyên dùng chung (ví dụ: màu sắc)
-
Thư mục Lớp phủ RRO chứa các tài nguyên dùng để tạo một RRO cho mỗi ứng dụng mục tiêu. Các tài nguyên này chỉ có thể tham chiếu đến:
- Các giá trị được xác định trong cùng một RRO (ví dụ: đối với màu, đây sẽ là giá trị thập lục phân).
- Tài nguyên khung Android (ví dụ:
@android:color/accent
). - Một tài nguyên được xác định trong lớp phủ thời gian tạo bản dựng ở trên.
Cấu trúc chung
Cấu trúc lớp phủ tuỳ chỉnh được đề xuất như sau:
-
<path-to-OEM-overlays>/
-
overlay/framework/base/core/res/
. Tài nguyên lớp phủ tại thời điểm tạo bản dựng -
rro/
-
Android.mk
. Makefile dùng để tạo RRO cho từng gói mục tiêu dựa trên các tài nguyên có trong thư mục này. -
AndroidManifest.xml
. Mẫu tệp kê khai mà tệp makefile ở trên sử dụng. -
res/
. Lớp phủ thời gian chạy để áp dụng cho tất cả ứng dụng mục tiêu.
-
-
Nhà sản xuất thiết bị gốc (OEM) có thể có nhiều cấu trúc trong số này, tuỳ thuộc vào số lượng thương hiệu mà họ muốn xử lý trong một mục tiêu bản dựng (xem phần Xử lý nhiều thương hiệu).
Lớp phủ tài nguyên thời gian chạy
Thư mục RRO trong thư mục lớp phủ OEM phải chứa các tài nguyên được áp dụng cho tất cả ứng dụng mục tiêu. RRO có những hạn chế ảnh hưởng đến khả năng phủ lên các tài nguyên phức hợp. Tóm lại, RRO:
-
Không thể tham chiếu đến giá trị nhận dạng tài nguyên được xác định trong tệp APK mục tiêu hoặc trong chính RRO. Điều này có nghĩa là RRO không thể thêm giá trị nhận dạng mới như đối tượng có thể vẽ, màu sắc hoặc kiểu mới.
-
Có thể tham chiếu đến giá trị nhận dạng tài nguyên được xác định trong khung, cho dù các tài nguyên đó được xác định trong
/frameworks/base/core/res
hay bằng cách sử dụng lớp phủ tại thời điểm tạo bản dựng. Bạn phải tham chiếu các giá trị nhận dạng này bằng cách sử dụng không gian tênandroid:
:-
Đối với các RRO DeviceDefault công khai, hãy sử dụng
android
.
Ví dụ:@android:style/TextAppearance.DeviceDefault.Large
. -
Đối với tất cả các tài nguyên khác (không công khai hoặc tài nguyên được thêm thông qua lớp phủ thời gian xây dựng), hãy sử dụng
*android
.
Ví dụ:@*android/style:TextAppearance.OEM.Brand1.Title
.
-
Ngoài tài nguyên, thư mục RRO phải chứa:
-
AndroidManifest.xml
. Trong mẫu bên dưới,RRO_PACKAGE_NAME
vàTARGET_PACKAGE_NAME
là phần giữ chỗ cho tệp 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
trong đóoem
trong tệp makefile sau đây xác định tiền tố mà tất cả các RRO được tạo sẽ có.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
Định cấu hình RRO
Tệp cấu hình mới được hỗ trợ, overlayable.xml
, bạn có thể sử dụng để xác định các chế độ kiểm soát quyền truy cập. Ví dụ: bạn có thể chỉ định người có thể phủ lên tài nguyên cũng như tài nguyên nào có thể được phủ lên. Do đó, giờ đây, bạn có thể nhóm các tài nguyên theo nhiều cách để các tài nguyên đó có thể được phủ lên nhau bằng nhiều RRO.
Cách thiết lập chế độ kiểm soát quyền truy cập RRO:
- Trong thư mục
res/values
, hãy tạooverlayable.xml
. - Tạo thẻ tài nguyên
<overlayable>
. - Xác định thuộc tính
name
cho thẻ<overlayable>
. Thuộc tính này phải là duy nhất trong gói. Mỗi lớp phủ chỉ có thể nhắm đến một nhóm có thể phủ. - Xác định thẻ
<policy>
bên trong<overlayable>
. - Xác định các nhóm tài nguyên có thể được phủ lên nhau. Ví dụ:
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
Cách áp dụng các thay đổi sau cho dự án RRO:
- Trong thư mục
res/xml
, hãy tạooverlays.xml
. Hãy xem mục nhập trong mã mẫu bên dưới chooverlay
. - Xác định các tài nguyên cần ghi đè.
- Thêm
android:resourcesMap="@xml/overlays"
vào thẻ<overlay>
trongAndroidManifest.xml
. Ví dụ: trong mã mẫu bên dưới, hãy xem mục nhập cho<overlay>
. - Đặt
android:isStatic=”true”
cho lớp phủ tĩnh. Mỗi lớp phủ chỉ có thể nhắm đến một trong các nhóm có thể được phủ.
Hãy xem ví dụ sau đây. Phần đầu tiên thuộc về AndroidManifest.xml
còn phần thứ hai thuộc về 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>
Tuy nhiên, các RRO hiện có vẫn hoạt động trong Android 10. Lưu ý là để được cài đặt bằng PackageManagerRRO, các gói phải được cài đặt trước hoặc được ký bằng cùng một khoá với ứng dụng mục tiêu. Trong Android 10, các tệp bố cục có thể được phủ lên nhau. Tuy nhiên, việc này yêu cầu bạn phải sử dụng requireViewById()
trong khi lấy thành phần hiển thị thay vì findViewById()
. Trong Android 10, thay đổi này đã được triển khai cho car-ui-lib để hỗ trợ lớp phủ bố cục.
Bản phát hành chính tiếp theo của Android sẽ cho phép bạn phủ một tệp bố cục và xác định các tài nguyên mới trong gói RRO, đồng thời tham chiếu các tài nguyên đó trong nội bộ.
Thêm tài nguyên dành riêng cho OEM
Cách khắc phục các giới hạn của RRO khiến bạn không thể thêm tài nguyên của OEM:
- Mở rộng khung/cơ sở bằng lớp phủ thời gian tạo bản dựng, thêm mọi tài nguyên cần thiết.
- Tham khảo các tài nguyên này từ RRO của OEM bằng cách sử dụng không gian tên
*android:
.
Ví dụ: sau đây là cách thêm một đối tượng có thể vẽ dành riêng cho OEM và sử dụng đối tượng đó trong 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>
-
-
Xử lý nhiều thương hiệu
Tệp kê khai RRO có cú pháp cho phép áp dụng có điều kiện dựa trên các thuộc tính hệ thống. Để xử lý nhiều thương hiệu trong một hình ảnh hệ thống, OEM có thể sử dụng như sau (xem Cấu trúc chung).
<?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>
Cú pháp cho android:requiredSystemPropertyName
và android:requiredSystemPropertyValue
sẽ khiến RRO này được bật chỉ nếu thuộc tính hệ thống tương ứng khớp với giá trị được cung cấp. Sau đó, OEM có thể xác định nhiều RRO này, tất cả đều được bật tĩnh và chỉ có một RRO hoạt động cùng một lúc.
Thêm thư viện giao diện người dùng trên ô tô vào một mục tiêu
Để đưa thư viện Giao diện người dùng ô tô vào một mục tiêu Android, bạn phải thêm đoạn mã sau:
# 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 \ ...
-
Khiến
<path-to-OEM-overlays>/rro/Android.mk
tạo một RRO cho mỗi gói được đặt tên trongCAR_UI_RRO_PACKAGE_NAMES
. -
Bao gồm các RRO đã tạo trong
PRODUCT_PACKAGES
. -
Bao gồm một lớp phủ tại thời điểm tạo bản dựng trong
PRODUCT_PACKAGE_OVERLAYS
để thêm tài nguyên dành riêng cho OEM.
Để tìm hiểu những gói nào hỗ trợ car-ui-lib
, hãy xem Danh sách các gói chứa car-ui-lib.