앱 맞춤설정

이제 자동차 UI 라이브러리 구성요소와 리소스를 앱에 추가하므로 이러한 앱을 맞춤설정하려면 OEM은 두 가지 오버레이를 제공해야 합니다.

  • 빌드 타임 오버레이는 RRO(런타임 리소스 오버레이)에 필요한 모든 리소스를 추가합니다. 여기에는 다음이 포함됩니다.

    • 드로어블
    • 스타일(예: 텍스트 모양)
    • 공유 리소스(예: 색상)
  • RRO 오버레이 폴더에는 대상 앱당 하나의 RRO를 생성하는 데 사용되는 리소스가 포함되어 있습니다. 이러한 리소스는 다음만 참조할 수 있습니다.

    • 동일한 RRO 내에 정의된 값(예: 색상의 경우 16진수 값)
    • Android 프레임워크 리소스(예: @android:color/accent )
    • 위의 빌드 타임 오버레이에 정의된 리소스입니다.

일반 구조

제안된 사용자 정의 오버레이 구조는 다음과 같습니다.

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ . 빌드 타임 오버레이 리소스

    • rro/

      • Android.mk . 이 폴더에 포함된 리소스를 기반으로 각 대상 패키지에 대한 RRO를 생성하는 데 사용되는 Makefile입니다.

      • AndroidManifest.xml . 위 makefile에서 사용되는 매니페스트 파일 템플릿입니다.

      • res/ . 모든 대상 앱에 적용할 런타임 오버레이입니다.

OEM은 단일 빌드 대상에서 처리하려는 브랜드 수에 따라 이러한 구조 중 하나 이상을 가질 수 있습니다( 여러 브랜드 처리 참조).

런타임 리소스 오버레이

OEM 오버레이 폴더의 RRO 폴더에는 모든 대상 앱에 적용할 리소스가 포함되어 있어야 합니다. RRO에는 복합 리소스를 오버레이하는 기능에 영향을 미치는 제한 사항이 있습니다. 요약하면 RRO는 다음과 같습니다.

  • 대상 APK 또는 RRO 자체에 정의된 리소스 식별자를 참조 할 수 없습니다 . 이는 RRO가 새로운 드로어블, 색상 또는 스타일과 같은 새로운 식별자를 추가할 수 없음을 의미합니다.

  • 할 수 있다 해당 리소스가 /frameworks/base/core/res 에 정의되어 있는지 아니면 빌드 타임 오버레이를 통해 정의되는지에 관계없이 프레임워크에 정의된 리소스 식별자를 참조하세요. 이러한 식별자는 android: 네임스페이스를 사용하여 참조되어야 합니다.

    • 공개 DeviceDefault RRO의 경우 android 사용하세요.
      예를 들어 @android:style/TextAppearance.DeviceDefault.Large 입니다.

    • 기타 모든 항목(비공개 또는 빌드 타임 오버레이를 통해 추가된 리소스)의 경우 *android 사용하세요 .
      예를 들어 @*android/style:TextAppearance.OEM.Brand1.Title .

리소스 외에도 RRO 폴더에는 다음이 포함되어야 합니다.

  • AndroidManifest.xml . 아래 샘플에서 RRO_PACKAGE_NAMETARGET_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>
    
  • 다음 makefile의 oem 생성된 모든 RRO가 갖는 접두사를 정의하는 Android.mk 입니다.
      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. 패키지에서 고유해야 하는 <overlayable> 태그의 name 속성을 정의합니다. 각 오버레이는 오버레이 가능한 그룹 하나만 타겟팅할 수 있습니다.
  4. <overlayable> 내에 <policy> 태그를 정의합니다.
  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. AndroidManifest.xml<overlay> 태그에 android:resourcesMap="@xml/overlays" 추가합니다. 예를 들어 아래 코드 샘플에서 <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에서는 레이아웃 파일을 오버레이할 수 있습니다. 그러나 그렇게 하려면 findViewById() ) 대신 뷰를 가져오는 동안 requireViewById() 를 사용해야 합니다. Android 10에서는 레이아웃 오버레이를 지원하기 위해 이 변경 사항이 car-ui-lib에 구현되었습니다.

Android의 다음 주요 릴리스에서는 레이아웃 파일을 오버레이하고 RRO 패키지에 새 리소스를 정의하고 내부적으로 참조할 수 있게 됩니다.

OEM 관련 리소스 추가

OEM 리소스가 추가되지 못하게 하는 RRO 제한 사항을 극복하려면 다음을 수행하십시오.

  • 빌드 시간 오버레이를 사용하여 프레임워크/베이스를 확장하고 필요한 리소스를 추가하세요.
  • *android: 네임스페이스를 사용하여 OEM RRO의 리소스를 참조하세요.

예를 들어 다음은 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:requiredSystemPropertyNameandroid:requiredSystemPropertyValue 구문을 사용하면 해당 시스템 속성이 제공된 값과 일치하는 경우 에만 이 RRO가 활성화됩니다. 그런 다음 OEM은 이러한 RRO를 여러 개 정의할 수 있으며, 모두 정적으로 활성화되고 한 번에 하나만 활성화됩니다.

타겟에 자동차 UI 라이브러리 추가

자동차 UI 라이브러리를 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 CAR_UI_RRO_PACKAGE_NAMES 에 명명된 각 패키지에 대해 하나의 RRO를 생성합니다.

  • PRODUCT_PACKAGES 에 생성된 RRO를 포함합니다.

  • OEM별 리소스를 추가하기 위해 PRODUCT_PACKAGE_OVERLAYS 에 빌드 시간 오버레이를 포함합니다.

car-ui-lib 를 지원하는 패키지를 알아보려면 car-ui-lib 가 포함된 패키지 목록을 참조하세요.