앱 맞춤설정

차량 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

    • 그 외 모든 RRO(비공개 또는 빌드 시간 오버레이를 통해 추가된 리소스)의 경우 *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>
  • Android.mk. 여기서 다음 makefile의 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 액세스 제어를 설정하려면 다음 단계를 진행하세요.

  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. android:resourcesMap="@xml/overlays"AndroidManifest.xml<overlay> 태그에 추가합니다. 예를 들어 아래 코드 샘플에서 <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.mkCAR_UI_RRO_PACKAGE_NAMES에 명명된 패키지마다 RRO를 하나씩 생성하게 됩니다.

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

  • PRODUCT_PACKAGE_OVERLAYS에 빌드 시간 오버레이를 포함하여 OEM 관련 리소스를 추가합니다.

car-ui-lib를 지원하는 패키지에 관해 알아보려면 car-ui-lib에서 지원하는 패키지를 참고하세요.