이제 자동차 UI 라이브러리 구성요소와 리소스를 앱에 추가했으므로 OEM은 두 개의 오버레이를 제공해야 합니다.
-
빌드 시간 오버레이는 런타임 리소스 오버레이 (RRO) 여기에는 다음이 포함됩니다.
- 드로어블
- 스타일(예: 텍스트 모양)
- 공유 리소스(예: 색상)
-
RRO overlay 폴더에는 RRO 1개를 생성하는 데 사용되는 리소스가 포함되어 있습니다. 확인할 수 있습니다 이러한 리소스는 다음 항목만 참조할 수 있습니다.
- 동일한 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_NAME
및TARGET_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 액세스 제어를 설정하려면 다음 단계를 진행하세요.
res/values
폴더에서overlayable.xml
을 만듭니다.<overlayable>
리소스 태그를 만듭니다.<overlayable>
태그의name
속성을 정의합니다. 이 속성은 패키지 내에서 고유해야 합니다. 각 오버레이는 오버레이 가능한 그룹을 하나만 타겟팅할 수 있습니다.<overlayable>
내에서<policy>
태그를 정의합니다.- 오버레이할 수 있는 리소스 그룹을 정의합니다. 예를 들면 다음과 같습니다.
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
RRO 프로젝트에 다음 변경사항을 적용하려면 다음을 진행합니다.
res/xml
폴더에서overlays.xml
을 만듭니다. 아래 코드 샘플에서overlay
항목을 참고하세요.- 재정의할 리소스를 정의합니다.
android:resourcesMap="@xml/overlays"
를AndroidManifest.xml
의<overlay>
태그에 추가합니다. 예를 들어 아래 코드 샘플에서<overlay>
항목을 참고하세요.- 정적 오버레이에
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:requiredSystemPropertyName
및 android: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를 하나씩 생성하게 됩니다. -
생성된 RRO를
PRODUCT_PACKAGES
에 포함합니다. -
PRODUCT_PACKAGE_OVERLAYS
에 빌드 시간 오버레이를 포함하여 OEM 관련 리소스를 추가합니다.
car-ui-lib
를 지원하는 패키지를 알아보려면 car-ui-lib가 포함된 패키지 목록을 참고하세요.