Artık Araç Kullanıcı Arayüzü kitaplığı bileşenleri ve kaynakları uygulamalara eklendiğinden, bu uygulamaları özelleştirmek için OEM'lerin iki katman sağlaması gerekiyor:
Derleme zamanı yer paylaşımı, çalışma zamanı kaynak yer paylaşımı (RRO'lar) için gereken tüm kaynakları ekler. Bu içerir:
- Çekmeceler
- Stiller (örneğin, metin görünümleri)
- Paylaşılan kaynaklar (örneğin 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ğıdakilere başvurabilir:
- Aynı RRO içinde tanımlanan değerler (örneğin, bir renk için bu onaltılık bir değer olacaktır).
- Android çerçeve kaynakları (örneğin,
@android:color/accent
). - Yukarıdaki derleme zamanı katmanında tanımlanan bir kaynak.
Genel yapı
Önerilen özelleştirme katman yapısı aşağıdaki gibidir:
<path-to-OEM-overlays>/
overlay/framework/base/core/res/
. Derleme zamanı yer paylaşımı kaynaklarırro/
Android.mk
. Makefile, bu klasörde bulunan kaynaklara dayalı olarak her hedef paket için RRO'ları oluşturmak için kullanılır.AndroidManifest.xml
. Yukarıdaki makefile tarafından kullanılan bir bildirim dosyası şablonu.res/
. Tüm hedef uygulamalara uygulanacak çalışma zamanı katmanları.
OEM'ler, tek bir yapı hedefinde işlemek istedikleri marka sayısına bağlı olarak bu yapılardan birden fazlasına sahip olabilir (bkz . Birden fazla markayı yönetme ).
Çalışma zamanı kaynak katmanları
OEM yer paylaşımı klasöründeki RRO klasörü, tüm hedef uygulamalara uygulanacak kaynakları içermelidir. RRO'ların bileşik kaynakları üst üste bindirme yeteneklerini etkileyen sınırlamaları vardır. Özetle, bir RRO:
Hedef APK'da veya RRO'nun kendisinde tanımlanan kaynak tanımlayıcılarına başvurulamaz . Bu, RRO'ların yeni çizilebilir öğeler, renkler veya stiller gibi yeni tanımlayıcılar ekleyemeyeceği anlamına gelir.
Olabilmek Bu kaynakların
/frameworks/base/core/res
dosyasında mı yoksa bir yapım zamanı katmanı aracılığıyla mı tanımlandığına bakılmaksızın, çerçevede tanımlanan kaynak tanımlayıcılarına bakın. Bu tanımlayıcılaraandroid:
name-space kullanılarak başvurulmalıdır:Genel DeviceDefault RRO'lar için
android
kullanın.
Örneğin,@android:style/TextAppearance.DeviceDefault.Large
.Diğerleri için ( herkese açık olmayan veya derleme zamanı katmanı aracılığıyla eklenen kaynaklar)
*android
kullanın .
Örneğin,@*android/style:TextAppearance.OEM.Brand1.Title
.
Kaynaklara ek olarak RRO klasörü şunları içermelidir:
AndroidManifest.xml
. Aşağıdaki örnekteRRO_PACKAGE_NAME
veTARGET_PACKAGE_NAME
, makefile dosyaları 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>
- Aşağıdaki makefile'daki
oem
oluşturulduğu tüm RRO'ların sahip olacağı öneki tanımladığı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'ları yapılandırma
Erişim kontrollerini tanımlamak için kullanabileceğiniz overlayable.xml
adlı yeni bir yapılandırma dosyası desteklenir. Örneğin, kimlerin kaynakları kaplayabileceğini ve hangi kaynakların kaplanabileceğini belirtebilirsiniz. Sonuç olarak, kaynaklar artık farklı RRO'lar tarafından üst üste yerleştirilmek üzere farklı şekillerde gruplandırılabilir.
RRO erişim kontrolünü ayarlamak için:
-
res/values
klasöründeoverlayable.xml
dosyasını oluşturun. -
<overlayable>
kaynak etiketlerini oluşturun. - Pakette benzersiz olması gereken
<overlayable>
etiketi içinname
niteliğini tanımlayın. Her yer paylaşımı yalnızca bir yer paylaşımı yapılabilir grubu hedefleyebilir. -
<overlayable>
içinde<policy>
etiketini tanımlayın. - Üst üste yerleştirilebilecek kaynak gruplarını tanımlayın. Örneğin:
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
Aşağıdaki değişiklikleri RRO projenize uygulamak için:
-
res/xml
klasöründeoverlays.xml
oluşturun.overlay
için aşağıdaki kod örneğindeki girişe bakın. - Geçersiz kılınacak kaynakları tanımlayın.
-
AndroidManifest.xml
dosyasındaki<overlay>
etiketineandroid:resourcesMap="@xml/overlays"
ekleyin. Örneğin, aşağıdaki kod örneğinde<overlay>
girişine bakın. - Statik bir kaplama için
android:isStatic=”true”
değerini ayarlayın. Her yer paylaşımı, yer paylaşımı yapılabilecek gruplardan yalnızca birini hedefleyebilir.
Aşağıdaki örneği düşünün. İlk bölüm AndroidManifest.xml
dosyasına, ikinci bölüm ise overlays.xml
dosyasına aittir.
<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>
Tek bir uyarıyla, önceden var olan RRO'lar Android 10'da çalışır. PaketManagerRRO ile kurulacak paketlerin ya önceden yüklenmesi ya da hedef uygulamayla aynı anahtarla imzalanması gerektiği uyarısıdır. Android 10'da düzen dosyaları üst üste bindirilebilir. Ancak bunu yapmak, görünümü alırken findViewById()
yerine requireViewById()
kullanımını gerektirir. Android 10'da bu değişiklik, düzen katmanlarını desteklemek için car-ui-lib'e uygulandı.
Android'in bir sonraki büyük sürümü, bir düzen dosyasını yerleştirmenize, RRO paketinde yeni kaynaklar tanımlamanıza ve bunlara dahili olarak başvurmanıza olanak tanıyacak.
OEM'e özel kaynaklar ekleyin
OEM kaynaklarının eklenmesini engelleyen RRO sınırlamalarının üstesinden gelmek için:
- Gerekli kaynakları ekleyerek, derleme zamanı katmanını kullanarak çerçeveleri/tabanı genişletin.
-
*android:
namespace'i kullanarak OEM RRO'lardaki bu kaynaklara bakın.
Örneğin, OEM'e özel bir çekilebilir eklemenin ve bunu bir RRO'da kullanmanın bir yolu aşağıdadır:
<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önetin
RRO bildirim dosyaları, sistem özelliklerine göre koşullu olarak uygulanmalarına olanak tanıyan bir sözdizimine sahiptir. Tek bir sistem görüntüsünde birden fazla markayı yönetmek için OEM'ler bunu aşağıdaki şekilde kullanabilir (bkz. Genel yapı ).
<?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
söz dizimi, bu RRO'nun yalnızca karşılık gelen sistem özelliğinin sağlanan değerle eşleşmesi durumunda etkinleştirilmesine neden olur. OEM'ler daha sonra tümü statik olarak etkin olan ve aynı anda yalnızca bir tanesi etkin olan bu RRO'lardan birden fazlasını tanımlayabilir.
Bir hedefe Araç Kullanıcı Arayüzü kitaplığı ekleme
Araç Kullanıcı Arayüzü kitaplığını bir Android hedefine dahil etmek için aşağıdaki kod pasajını 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
CAR_UI_RRO_PACKAGE_NAMES
içinde adlandırılan paketlerin her biri için bir RRO oluşturmasına neden olur.PRODUCT_PACKAGES
içinde oluşturulan RRO'ları içerir.OEM'e özgü kaynaklar eklemek için
PRODUCT_PACKAGE_OVERLAYS
bir oluşturma zamanı katmanı içerir.
Hangi paketlerin car-ui-lib
desteklediğini öğrenmek için bkz. car-ui-lib içeren paketlerin listesi .