Настройка приложений

Теперь, когда компоненты и ресурсы библиотеки автомобильного пользовательского интерфейса добавлены в приложения, для настройки этих приложений OEM-производители должны предоставить два наложения:

  • Наложение времени сборки добавляет любые ресурсы, необходимые для наложения ресурсов времени выполнения (RRO). Это включает в себя:

    • Рисованные
    • Стили (например, внешний вид текста)
    • Общие ресурсы (например, цвета)
  • Папка наложения RRO содержит ресурсы, используемые для создания одного RRO для каждого целевого приложения. Эти ресурсы могут относиться только к:

    • Значения, определенные в одном и том же RRO (например, для цвета это будет шестнадцатеричное значение).
    • Ресурсы платформы Android (например, @android:color/accent ).
    • Ресурс, определенный в приведенном выше наложении времени сборки.

Общая структура

Предлагаемая структура наложения настройки выглядит следующим образом:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ . Ресурсы наложения во время сборки

    • rro/

      • Android.mk . Makefile, используемый для создания RRO для каждого целевого пакета на основе ресурсов, содержащихся в этой папке.

      • AndroidManifest.xml . Шаблон файла манифеста, используемый приведенным выше make-файлом.

      • res/ . Наложения времени выполнения, которые применяются ко всем целевым приложениям.

OEM-производители могут иметь более одной из этих структур, в зависимости от количества брендов, которые они хотят обрабатывать в одной целевой сборке (см. Обработка нескольких брендов ).

Наложения ресурсов среды выполнения

Папка 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 в следующем make-файле определяет префикс, который будут иметь все сгенерированные 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:

  1. В папке res/values ​​создайте overlayable.xml .
  2. Создайте теги ресурсов <overlayable> .
  3. Определите атрибут name для тега <overlayable> , который должен быть уникальным в пакете. Каждое наложение может быть нацелено только на одну накладываемую группу.
  4. Определите тег <policy> внутри <overlayable> .
  5. Определите группы ресурсов, которые можно накладывать. Например:
      <resources>
          <overlayable name="OverlayableResources">
              <policy type="public">
                  <item type="string" name="app_title" />
              </policy>
          </overlayable>
      </resources>
      

Чтобы применить следующие изменения к вашему проекту RRO:

  1. В папке res/xml создайте overlays.xml . См. запись в примере кода ниже для overlay .
  2. Определите ресурсы, которые будут переопределены.
  3. Добавьте android:resourcesMap="@xml/overlays" в тег <overlay> в AndroidManifest.xml . Например, в приведенном ниже примере кода см. запись для <overlay> .
  4. Установите 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-ресурсы:

  • Расширяйте фреймворки/базу, используя оверлей во время сборки , добавляя любые необходимые ресурсы.
  • Обратитесь к этим ресурсам 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>

Работайте с несколькими брендами

Файлы манифеста 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, все они будут статически включены и активны только по одному.

Добавить библиотеку пользовательского интерфейса автомобиля в цель

Чтобы включить библиотеку пользовательского интерфейса автомобиля в цель 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 для каждого из пакетов, указанных в CAR_UI_RRO_PACKAGE_NAMES .

  • Включает сгенерированные RRO в PRODUCT_PACKAGES .

  • Включает наложение времени сборки в PRODUCT_PACKAGE_OVERLAYS для добавления ресурсов, специфичных для OEM.

Чтобы узнать, какие пакеты поддерживают car-ui-lib , см. Список пакетов, содержащих car-ui-lib .