Tùy chỉnh ứng dụng

Giờ đây, khi các thành phần và tài nguyên của thư viện Car UI được đưa vào ứng dụng, để tùy chỉnh các ứng dụng này, OEM phải cung cấp hai lớp phủ:

  • Lớp phủ thời gian xây dựng sẽ thêm bất kỳ tài nguyên nào cần thiết cho lớp phủ tài nguyên thời gian chạy (RRO). Điêu nay bao gôm:

    • Có thể vẽ
    • Kiểu (ví dụ: giao diện văn bản)
    • Tài nguyên được chia sẻ (ví dụ: màu sắc)
  • Thư mục lớp phủ RRO chứa các tài nguyên được sử dụng để tạo một RRO cho mỗi ứng dụng mục tiêu. Những tài nguyên này chỉ có thể đề cập đến:

    • Các giá trị được xác định trong cùng một RRO (ví dụ: đối với một 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 xây dựng ở trên.

Cấu trúc chung

Cấu trúc lớp phủ tùy chỉnh được đề xuất như sau:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ . Tài nguyên lớp phủ thời gian xây dựng

    • rro/

      • Android.mk . Makefile được sử dụng để tạo RRO cho từng gói mục tiêu dựa trên tài nguyên có trong thư mục này.

      • AndroidManifest.xml . Mẫu tệp kê khai được sử dụng bởi tệp thực hiện ở trên.

      • res/ . Lớp phủ thời gian chạy để áp dụng cho tất cả các ứng dụng mục tiêu.

Các OEM có thể có nhiều cấu trúc trong số này, tùy thuộc vào số lượng thương hiệu mà họ muốn xử lý trong một mục tiêu xây dựng duy nhất (xem 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ả các ứng dụng mục tiêu. RRO có những hạn chế ảnh hưởng đến khả năng che phủ các tài nguyên phức hợp. Tóm lại, một RRO:

  • Không thể tham chiếu đến số nhận dạng tài nguyên được xác định trong 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 số nhận dạng mới chẳng hạn như các đối tượng có thể kéo, màu hoặc kiểu mới.

  • Có thể tham chiếu đến các mã định danh 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 lớp phủ thời gian xây dựng. Những mã định danh này phải được giới thiệu bằng cách sử dụng android: name-space:

    • Đối với RRO DeviceDefault công khai , hãy sử dụng android .
      Ví dụ: @android:style/TextAppearance.DeviceDefault.Large .

    • Đối với tất cả những thứ 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_NAMETARGET_PACKAGE_NAME là phần giữ chỗ cho tệp tạo tệp:

    <?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 tạo tệp sau 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 mà bạn có thể sử dụng để xác định các biện pháp kiểm soát quyền truy cập. Ví dụ: bạn có thể chỉ định ai có thể xếp chồng các tài nguyên cũng như những tài nguyên nào có thể được xếp chồng. Kết quả là, các tài nguyên hiện có thể được nhóm theo nhiều cách khác nhau để sẵn sàng sử dụng cho các RRO khác nhau.

Để thiết lập kiểm soát truy cập RRO:

  1. Trong thư mục res/values , tạo overlayable.xml .
  2. Tạo thẻ tài nguyên <overlayable> .
  3. Xác định thuộc tính name cho thẻ <overlayable> , thẻ này phải là duy nhất trong gói. Mỗi lớp phủ chỉ có thể nhắm mục tiêu một nhóm có thể phủ.
  4. Xác định thẻ <policy> bên trong <overlayable> .
  5. Xác định các nhóm tài nguyên có thể được phủ lên. Ví dụ:
      <resources>
          <overlayable name="OverlayableResources">
              <policy type="public">
                  <item type="string" name="app_title" />
              </policy>
          </overlayable>
      </resources>
      

Để áp dụng những thay đổi sau cho dự án RRO của bạn:

  1. Trong thư mục res/xml , tạo overlays.xml . Xem mục trong mẫu mã bên dưới để biết overlay .
  2. Xác định các tài nguyên cần ghi đè.
  3. Thêm android:resourcesMap="@xml/overlays" vào thẻ <overlay> trong AndroidManifest.xml . Ví dụ: trong mẫu mã bên dưới, hãy xem mục nhập <overlay> .
  4. Đặt android:isStatic=”true” cho lớp phủ tĩnh. Mỗi lớp phủ chỉ có thể nhắm mục tiêu một trong các nhóm có thể được phủ.

Hãy xem xét ví dụ sau. Phần đầu tiên thuộc về AndroidManifest.xml trong khi phần thứ hai liên quan đến 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>
  

Với một lưu ý, các RRO hiện có trước đây sẽ hoạt động trong Android 10. Lưu ý là để được cài đặt với PackageManagerRRO, các gói phải được cài đặt sẵn hoặc được ký bằng cùng khóa với ứng dụng đích. Trong Android 10, các tệp bố cục có thể được phủ lên. Tuy nhiên, làm như vậy đòi hỏi phải sử dụng requireViewById() trong khi lấy chế độ xem thay vì findViewById() . Trong Android 10, thay đổi này đã được triển khai đối với 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 và tham chiếu chúng trong nội bộ.

Thêm tài nguyên dành riêng cho OEM

Để khắc phục các hạn chế RRO ngăn tài nguyên OEM được thêm vào:

  • Mở rộng khung/cơ sở bằng cách sử dụng lớp phủ thời gian xây 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ừ các RRO OEM bằng cách sử dụng *android: không gian tên.

Ví dụ: sau đây là cách để thêm một đối tượng có thể vẽ cụ thể của OEM và sử dụng nó 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 chúng được áp dụng có điều kiện dựa trên 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 hình ảnh này 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:requiredSystemPropertyNameandroid:requiredSystemPropertyValue sẽ khiến RRO này chỉ được bật nếu thuộc tính hệ thống tương ứng khớp với giá trị được cung cấp. Sau đó, các OEM có thể xác định nhiều RRO này, tất cả chúng đều được kích hoạt tĩnh và chỉ có một hoạt động tại một thời điểm.

Thêm thư viện Car UI vào mục tiêu

Để kết hợp thư viện Car UI vào mục tiêu Android, bạn phải bao gồ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 \
      ...
  • Nguyên nhân <path-to-OEM-overlays>/rro/Android.mk tạo một RRO cho mỗi gói có tên trong CAR_UI_RRO_PACKAGE_NAMES .

  • Bao gồm các RRO được tạo trong PRODUCT_PACKAGES .

  • Bao gồm lớp phủ thời gian xây dựng trong PRODUCT_PACKAGE_OVERLAYS để thêm tài nguyên dành riêng cho OEM.

Để tìm hiểu gói nào hỗ trợ car-ui-lib , hãy xem Danh sách các gói chứa car-ui-lib .