Uygulamaları özelleştirme

Araba kullanıcı arayüzü kitaplığı bileşenlerini ve kaynaklarını uygulamalara yerleştirdikten sonra, Bu uygulamalarda, OEM'ler iki yer paylaşımı sağlamalıdır:

  • Derleme zamanı yer paylaşımı, çalışma zamanı kaynak yerleşimi (RRO) Bu güvenlik özelliklerinden bazıları şunlardır:

    • Çekilebilir içerikler
    • Stiller (örneğin, metin görünümleri)
    • Paylaşılan kaynaklar (ör. renkler)
  • RRO yer paylaşımı klasörü, her birinde bir RRO oluşturmak üzere kullanılan kaynakları içerir. hedef uygulama. Bu kaynaklarda yalnızca şu kaynaklar yer alabilir:

    • Aynı RRO içinde tanımlanmış değerler (örneğin, bir renk için onaltılık değer olabilir) değeri) ekleyebilirsiniz.
    • Android çerçevesi kaynakları (örneğin, @android:color/accent).
    • Yukarıdaki derleme zamanı yer paylaşımı bölümünde tanımlanan kaynak.

Genel yapı

Önerilen özelleştirme yer paylaşımı yapısı aşağıdaki gibidir:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ Derleme zamanında yer paylaşımlı kaynaklar

    • rro/

      • Android.mk Her hedef paketin RRO'larını oluşturmak için kullanılan Makefile bu klasördeki kaynaklara göre.

      • AndroidManifest.xml Yukarıdaki tarafından kullanılan bir manifest dosyası şablonu Makefile ile ilişkilendirin.

      • res/ Tüm hedef uygulamalara uygulanacak çalışma zamanı yer paylaşımları.

OEM'ler, satın almak istedikleri marka sayısına bağlı olarak bu yapılardan birden fazlasına sahip olabilir. herkese açık kullanıcı adlarını tek bir derleme hedefinde Birden fazla markayı yönetin).

Çalışma zamanı kaynak yer paylaşımları

OEM yer paylaşımı klasöründeki RRO klasörü, tüm hedef uygulamalara uygulanacak kaynakları içermelidir. RRO'lar, bileşik kaynakları üst üste koyma kabiliyetlerini etkileyen sınırlamalara sahiptir. Özetle, RRO:

  • Hedef APK'da veya RRO'nun kendisi. Yani RRO'lar; yeni çekilebilir öğeler, renkler veya stillerini ayarlayın.

  • Şurada tanımlanan kaynak tanımlayıcılara atıfta bulunabilir: çerçevesini, bu kaynakların /frameworks/base/core/res içinde mi yoksa bir örneğidir. Bu tanımlayıcılara android: kullanılarak referans verilmelidir. ad-boşluk:

    • Herkese açık DeviceDefault RRO'lar için android değerini kullanın.
      . Örneğin, @android:style/TextAppearance.DeviceDefault.Large.

    • Diğer tümü için (herkese açık olmayan veya derleme zamanı yer paylaşımı) kullanın *android.
      . Ö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, oluşturma 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 yapma dosyasında oem öğesinin öneki tanımladığı Android.mk elde edebileceğimizi göstermeliydi hikayemiz.
      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

overlayable.xml adlı yeni yapılandırma dosyası desteklenir. Bu dosyayı erişim denetimleridir. Örneğin, kimlerin yer paylaşımlı olacağını ve hangi kaynakların bir şeydir. Sonuç olarak, kaynaklar artık farklı şekillerde gruplandırılarak farklı RRO'lar ile yerleştirilebilir.

RRO erişim denetimini ayarlamak için:

  1. res/values klasöründe overlayable.xml oluşturun.
  2. <overlayable> kaynak etiketlerini oluşturun.
  3. <overlayable> etiketi için name özelliğini tanımlayın. Bu özellik, paket içinde benzersiz olmalıdır. Her yer paylaşımı yalnızca bir yer paylaşımlı grubu hedefleyebilir.
  4. <overlayable> içinde <policy> etiketini tanımlayın.
  5. Yer paylaşımlı olabilecek kaynak gruplarını tanımlayın. Örnek:
      <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. Giriş overlay için aşağıdaki kod örneğini aşağıda bulabilirsiniz.
  2. Geçersiz kılınacak kaynakları tanımlayın.
  3. android:resourcesMap="@xml/overlays" adlı yeri <overlay> alanına ekleyin etiketi (AndroidManifest.xml içinde). Örneğin, aşağıdaki kod örneğinde, <overlay>
  4. Statik yer paylaşımı için android:isStatic=”true” değerini ayarlayın. Her yer paylaşımı yalnızca gruplardan birini seçin.

Aşağıdaki örneği inceleyin. İlk bölüm AndroidManifest.xml hesabına ait ikinci bölüm 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>
  

Önceden mevcut olan RRO'ların Android 10'da çalıştığını hatırlatmak isteriz. Uyarı paketin PackageManagerRRO ile kurulacağından, paketin önceden yüklü veya hedef uygulamayla aynı anahtar kullanılarak imzalanır. Android 10'da düzen dosyaları yer paylaşımlı olabilir. Ancak, bunu yapmak, yerine görünümü alırken requireViewById() findViewById(). Android 10'da bu değişiklik, destek düzeni yer paylaşımlarını kullanabilirsiniz.

Android'in bir sonraki ana sürümü, yer paylaşımlı olarak bir düzen dosyası ve RRO paketinde yeni kaynaklar tanımlamak ve bunlara dahili olarak başvurmak.

OEM'ye özel kaynaklar ekleyin

OEM kaynaklarının eklenmesini engelleyen RRO sınırlamalarının üstesinden gelmek için:

  • Derleme zamanı yer paylaşımı kullanarak çerçeveleri/tabanı genişletin ve gereken tüm kaynaklar.
  • *android: ad alanını kullanarak OEM RRO'lardaki bu kaynaklara bakın.

Örneğin, aşağıdaki OEM'e özel bir çekilebilir içeriği RRO'da kullanabilirsiniz:

  • <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ı, sisteme göre koşullu olarak uygulanmalarına olanak tanıyan bir söz dizimine sahiptir özellikler. OEM'ler, tek bir sistem görüntüsünde birden fazla markayı yönetmek için bunu şu şekilde 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, bu RRO'nun yalnızca etkinleştirilmesine neden olur karşılık gelen sistem özelliği sağlanan değerle eşleşirse kullanın. OEM'ler daha sonra tümü statik olarak etkinleştirilmiş ve aynı anda yalnızca bir tanesi etkin.

Bir hedefe Araba kullanıcı arayüzü kitaplığı ekleme

Araba kullanıcı arayüzü kitaplığını bir Android hedefine eklemek 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 \
      ...
ziyaret edin.
  • <path-to-OEM-overlays>/rro/Android.mk ürününün her biri için bir RRO oluşturmasına neden olur (CAR_UI_RRO_PACKAGE_NAMES içinde adlandırılmış paketler)

  • PRODUCT_PACKAGES cinsinden oluşturulan RRO'ları içerir.

  • OEM'e özgü eklemek için PRODUCT_PACKAGE_OVERLAYS üzerinde bir derleme zamanı yer paylaşımı içerir kaynaklar.

Hangi paketlerin car-ui-lib'i desteklediğini öğrenmek için car-ui-lib içeren paketlerin listesi bölümüne bakın.