Araba kullanıcı arayüzü kitaplığı bileşenleri ve kaynakları uygulamalara eklendiğinden, bu uygulamaları özelleştirmek için OEM'lerin iki yer paylaşımı sağlaması gerekir:
-
Derleme zamanı yer paylaşımı, çalışma zamanında kaynak Bu güvenlik özelliklerinden bazıları şunlardır:
- Çekilebilir öğeler
- Stiller (ör. metin görünümleri)
- Paylaşılan kaynaklar (ör. renkler)
-
RRO yer paylaşımı klasörü, hedef uygulama başına bir RRO oluşturmak için kullanılan kaynakları içerir. Bu kaynaklar yalnızca aşağıdakileri referans alabilir:
- Aynı RRO içinde tanımlanan değerler (örneğin, bir renk için onaltılık değerdir).
- Android çerçeve kaynakları (örneğin,
@android:color/accent
). - Yukarıdaki derleme zamanı yer paylaşımında tanımlanan bir kaynak.
Genel yapı
Önerilen özelleştirme yer paylaşımı yapısı şu şekildedir:
-
<path-to-OEM-overlays>/
-
overlay/framework/base/core/res/
. Derleme zamanı yer paylaşımı kaynakları -
rro/
-
Android.mk
. Bu klasördeki kaynaklara göre her hedef paket için RRO'ları oluşturmak amacıyla kullanılan Makefile. -
AndroidManifest.xml
. Yukarıdaki makefile tarafından kullanılan bir manifest dosyası şablonu. -
res/
. Tüm hedef uygulamalara uygulanacak çalışma zamanında yer paylaşımları.
-
-
OEM'ler, tek bir derleme hedefinde yönetmek istedikleri markaların sayısına bağlı olarak bu yapılardan birden fazlasına sahip olabilir (Birden fazla markayı yönetme bölümüne bakın).
Çalışma zamanında kaynak yer paylaşımları
OEM yer paylaşımı klasöründeki RRO klasörü, tüm hedef uygulamalara uygulanacak kaynakları içermelidir. RRO'ların, birleşik kaynakları yer paylaşımına uygun hale getirmelerini etkileyen sınırlamaları vardır. Özet olarak, RRO:
-
Hedef APK'da veya RRO'da tanımlanan kaynak tanımlayıcılarına atıfta bulunamaz. Bu, RRO'ların yeni çizilebilir öğeler, renkler veya stiller gibi yeni tanımlayıcıları ekleyemedikleri anlamına gelir.
-
Can bu kaynaklar
/frameworks/base/core/res
içinde veya derleme zamanı yer paylaşımı aracılığıyla tanımlanmış olsun, çerçevede tanımlanan kaynak tanımlayıcılarını referans alabilir. Bu tanımlayıcılar,android:
ad alanı kullanılarak referans verilmelidir:-
Herkese açık DeviceDefault RRO'ları için
android
değerini kullanın.
Örneğin,@android:style/TextAppearance.DeviceDefault.Large
. -
Diğer tüm kaynaklar (herkese açık olmayan veya derleme zamanı yer paylaşımı aracılığıyla eklenen kaynaklar) için
*android
'ı kullanın.
Örneğin,@*android/style:TextAppearance.OEM.Brand1.Title
.
-
RRO klasörü, kaynaklara ek olarak şunları içermelidir:
-
AndroidManifest.xml
. Aşağıdaki örnekteRRO_PACKAGE_NAME
veTARGET_PACKAGE_NAME
, makefile'ler için yer tutuculardır:<?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
. Aşağıdaki makefile'deoem
, oluşturulan tüm RRO'ların sahip olacağı öneki tanımlar.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'ları yapılandırma
Erişim denetimlerini tanımlamak için kullanabileceğiniz yeni bir yapılandırma dosyası (overlayable.xml
) desteklenir. Örneğin, hangi kaynakların yer paylaşımı yapabileceğini ve kimlerin yer paylaşımı yapabileceğini belirtebilirsiniz. Sonuç olarak, kaynaklar artık farklı RRO'lar tarafından yerleştirilebilecek şekilde farklı şekillerde gruplandırılabilir.
RRO erişim denetimini ayarlamak için:
res/values
klasöründeoverlayable.xml
oluşturun.<overlayable>
kaynak etiketlerini oluşturun.<overlayable>
etiketi içinname
özelliğini tanımlayın. Bu özellik pakette benzersiz olmalıdır. Her yer paylaşımı yalnızca bir yer paylaşımına uygun grubu hedefleyebilir.<overlayable>
içinde<policy>
etiketini tanımlayın.- Yerleştirilebilecek kaynak gruplarını tanımlayın. Örnek:
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
RRO projenize aşağıdaki değişiklikleri uygulamak için:
res/xml
klasöründeoverlays.xml
oluşturun.overlay
için aşağıdaki kod örneğindeki girişe bakın.- Üzerinden yazılacak kaynakları tanımlayın.
AndroidManifest.xml
'deki<overlay>
etiketineandroid:resourcesMap="@xml/overlays"
ekleyin. Örneğin, aşağıdaki kod örneğinde<overlay>
girişine bakın .- Statik yer paylaşımı için
android:isStatic=”true”
değerini ayarlayın. Her yer paylaşımı, yalnızca yer paylaşımı yapılabilen gruplardan birini hedefleyebilir.
Aşağıdaki örneği inceleyin. İlk bölüm AndroidManifest.xml
, ikinci bölüm ise overlays.xml
ile ilgilidir.
<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>
Daha önce mevcut olan RRO'lar Android 10'da çalışır ancak bir istisna vardır. Bununla birlikte, PackageManagerRRO ile yüklenmek için paketlerin önceden yüklenmiş veya hedef uygulamayla aynı anahtarla imzalanmış olması gerekir. Android 10'da ise düzen dosyaları örtüşebilir. Ancak bu işlemi yapmak için görünümü alırken findViewById()
yerine requireViewById()
kullanılması gerekir. Android 10'da bu değişiklik, düzen yer paylaşımlarını desteklemek için car-ui-lib'e uygulandı.
Android'in bir sonraki büyük sürümünde, bir düzen dosyasını yer paylaşımına almanıza, RRO paketinde yeni kaynaklar tanımlamanıza ve bunlara dahili olarak referans vermenize olanak tanınacak.
OEM'ye özgü kaynaklar ekleme
OEM kaynaklarının eklenmesini engelleyen RRO sınırlamalarını aşmak için:
- Gerekli tüm kaynakları ekleyerek derleme zamanı yer paylaşımını kullanarak çerçeveleri/temeli genişletin.
*android:
adlandırma alanını kullanarak OEM RRO'larından bu kaynaklara bakın.
Örneğin, OEM'ye özgü bir çizilebilir öğe ekleyip bunu bir RRO'da kullanmanın bir yolu aşağıda verilmiştir:
-
<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>
-
-
Birden fazla markayı yönetme
RRO manifest dosyalarının, sistem özelliklerine göre koşullu olarak uygulanmalarını sağlayan bir söz dizimi vardır. OEM'ler, tek bir sistem görüntüsünde birden fazla markayı yönetmek için aşağıdaki gibi bir yapı kullanabilir (Genel yapı bölümüne bakın).
<?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
ve android:requiredSystemPropertyValue
için söz dizimi, bu RRO'nun yalnızca
ilgili sistem özelliği sağlanan değerle eşleşirse etkinleştirilmesine neden olur. OEM'ler daha sonra bu RRO'lardan birden fazlasını tanımlayabilir. Bu RRO'ların tümü statik olarak etkinleştirilir ve aynı anda yalnızca biri etkin olur.
Bir hedefe araba kullanıcı arayüzü kitaplığı ekleme
Araba kullanıcı arayüzü kitaplığını bir Android hedefine dahil etmek için aşağıdaki kod snippet'ini eklemeniz gerekir:
# 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
'ün,CAR_UI_RRO_PACKAGE_NAMES
'te belirtilen her paket için bir RRO oluşturmasına neden olur. -
Oluşturulan RRO'ları
PRODUCT_PACKAGES
içerir. -
OEM'e özgü kaynaklar eklemek için
PRODUCT_PACKAGE_OVERLAYS
içinde derleme zamanı yer paylaşımı içerir.
car-ui-lib
'yi hangi paketlerin desteklediğini öğrenmek için car-ui-lib içeren paketlerin listesi bölümüne bakın.