Uygulamaları özelleştirin

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ılara android: 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 örnekte RRO_PACKAGE_NAME ve TARGET_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:

  1. res/values ​​klasöründe overlayable.xml dosyasını oluşturun.
  2. <overlayable> kaynak etiketlerini oluşturun.
  3. Pakette benzersiz olması gereken <overlayable> etiketi için name niteliğini tanımlayın. Her yer paylaşımı yalnızca bir yer paylaşımı yapılabilir grubu hedefleyebilir.
  4. <overlayable> içinde <policy> etiketini tanımlayın.
  5. Ü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:

  1. res/xml klasöründe overlays.xml oluşturun. overlay için aşağıdaki kod örneğindeki girişe bakın.
  2. Geçersiz kılınacak kaynakları tanımlayın.
  3. AndroidManifest.xml dosyasındaki <overlay> etiketine android:resourcesMap="@xml/overlays" ekleyin. Örneğin, aşağıdaki kod örneğinde <overlay> girişine bakın.
  4. 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 .