اکنون که مؤلفهها و منابع کتابخانه UI Car وارد برنامهها شدهاند، برای سفارشیسازی این برنامهها، OEMها باید دو پوشش ارائه دهند:
همپوشانی Build-time منابع مورد نیاز برای پوشش منابع زمان اجرا (RRO) را اضافه می کند. این شامل:
- قرعه کشی ها
- سبک ها (به عنوان مثال، ظاهر متن)
- منابع مشترک (به عنوان مثال، رنگ ها)
پوشه پوشش RRO حاوی منابعی است که برای تولید یک RRO در هر برنامه هدف استفاده می شود. این منابع فقط می توانند به موارد زیر اشاره کنند:
- مقادیر تعریف شده در همان RRO (به عنوان مثال، برای یک رنگ این مقدار هگزادسیمال خواهد بود).
- منابع فریمورک اندروید (به عنوان مثال
@android:color/accent
). - منبعی که در همپوشانی زمان ساخت بالا تعریف شده است.
ساختار کلی
ساختار همپوشانی سفارشی سازی پیشنهادی به شرح زیر است:
<path-to-OEM-overlays>/
overlay/framework/base/core/res/
. منابع همپوشانی زمان ساختrro/
Android.mk
. Makefile برای تولید RRO برای هر بسته هدف بر اساس منابع موجود در این پوشه استفاده می شود.AndroidManifest.xml
. یک الگوی فایل مانیفست که توسط makefile بالا استفاده می شود.res/
. پوششهای زمان اجرا برای اعمال روی همه برنامههای هدف.
OEM ها ممکن است بیش از یکی از این ساختارها را داشته باشند، بسته به تعداد مارک هایی که می خواهند در یک هدف ساخت واحد مدیریت کنند (به Handle multiple brands مراجعه کنید).
همپوشانی منابع زمان اجرا
پوشه RRO در پوشه OEM overlay باید حاوی منابعی باشد که باید برای همه برنامههای هدف اعمال شود. RROها دارای محدودیت هایی هستند که بر توانایی آنها برای همپوشانی منابع ترکیبی تأثیر می گذارد. به طور خلاصه، یک RRO:
نمی توان به شناسه های منبع تعریف شده در APK هدف یا در خود RRO اشاره کرد. این بدان معناست که RRO ها نمی توانند شناسه های جدیدی مانند ترسیم، رنگ ها یا سبک های جدید اضافه کنند.
می تواند به شناسه های منبع تعریف شده در چارچوب مراجعه کنید، چه این منابع در
/frameworks/base/core/res
تعریف شده باشند یا با استفاده از یک پوشش زمان ساخت. این شناسه ها باید با استفاده ازandroid:
name-space:برای RROهای DeviceDefault عمومی ، از
android
استفاده کنید.
برای مثال@android:style/TextAppearance.DeviceDefault.Large
.برای سایر موارد (غیر عمومی یا منابع اضافه شده از طریق همپوشانی زمان ساخت)، از
*android
استفاده کنید .
به عنوان مثال،@*android/style:TextAppearance.OEM.Brand1.Title
.
علاوه بر منابع، پوشه RRO باید شامل موارد زیر باشد:
AndroidManifest.xml
. در نمونه زیر،RRO_PACKAGE_NAME
وTARGET_PACKAGE_NAME
مکانهایی برای فایلهای ساخت هستند:<?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
در makefile زیر پیشوندی را تعریف می کند که همه 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>
را ایجاد کنید. - ویژگی
name
برای تگ<overlayable>
تعریف کنید، که باید در بسته منحصر به فرد باشد. هر همپوشانی می تواند تنها یک گروه قابل همپوشانی را هدف قرار دهد. - تگ
<policy>
را در داخل<overlayable>
تعریف کنید. - گروه هایی از منابع را که می توان روی هم قرار داد را تعریف کنید. به عنوان مثال:
<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"
به تگ<overlay>
درAndroidManifest.xml
اضافه کنید. برای مثال، در نمونه کد زیر، ورودی<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، بسته ها باید یا از قبل نصب شده باشند یا با همان کلید برنامه هدف امضا شده باشند. در اندروید 10، فایل های طرح بندی را می توان روی هم قرار داد. با این حال، انجام این کار مستلزم استفاده از requireViewById()
در حین دریافت view به جای findViewById()
است. در اندروید 10، این تغییر در car-ui-lib برای پشتیبانی از پوششهای طرحبندی اعمال شده است.
نسخه اصلی بعدی اندروید به شما این امکان را می دهد که یک فایل طرح بندی را پوشش دهید و منابع جدیدی را در بسته RRO تعریف کنید و به آنها به صورت داخلی مراجعه کنید.
منابع اختصاصی OEM را اضافه کنید
برای غلبه بر محدودیت های RRO که از اضافه شدن منابع OEM جلوگیری می کند:
- چارچوب ها/پایه ها را با استفاده از همپوشانی زمان ساخت گسترش دهید و هر گونه منابع لازم را اضافه کنید.
- به این منابع از RROهای OEM با استفاده از
*android:
namespacing مراجعه کنید.
به عنوان مثال، روش زیر برای اضافه کردن یک drawable خاص 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 ماشین را به یک هدف اضافه کنید
برای ادغام کتابخانه Car UI به هدف اندروید، باید قطعه کد زیر را وارد کنید:
# 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 مراجعه کنید.