تخصيص التطبيقات

الآن بعد أن تم دمج مكونات وموارد مكتبة Car UI في التطبيقات، من أجل تخصيص هذه التطبيقات، يجب على مصنعي المعدات الأصلية توفير تراكبين:

  • يضيف تراكب وقت البناء أي موارد مطلوبة لتراكب موارد وقت التشغيل (RROs). هذا يتضمن:

    • الرسوميات
    • الأنماط (على سبيل المثال، مظاهر النص)
    • الموارد المشتركة (على سبيل المثال، الألوان)
  • يحتوي مجلد تراكب RRO على الموارد المستخدمة لإنشاء RRO واحد لكل تطبيق مستهدف. يمكن أن تشير هذه الموارد فقط إلى:

    • القيم المحددة ضمن نفس RRO (على سبيل المثال، بالنسبة للون ستكون هذه قيمة سداسية عشرية).
    • موارد إطار عمل Android (على سبيل المثال، @android:color/accent ).
    • مورد محدد في تراكب وقت البناء أعلاه.

الهيكل العام

هيكل تراكب التخصيص المقترح هو كما يلي:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ . موارد تراكب وقت البناء

    • rro/

      • Android.mk . يتم استخدام Makefile لإنشاء RROs لكل حزمة مستهدفة بناءً على الموارد الموجودة في هذا المجلد.

      • AndroidManifest.xml . قالب ملف البيان الذي يستخدمه ملف makefile أعلاه.

      • res/ . تراكبات وقت التشغيل لتطبيقها على جميع التطبيقات المستهدفة.

قد يكون لدى مصنعي المعدات الأصلية أكثر من واحدة من هذه الهياكل، اعتمادًا على عدد العلامات التجارية التي يريدون التعامل معها في هدف بناء واحد (راجع التعامل مع علامات تجارية متعددة ).

تراكبات موارد وقت التشغيل

يجب أن يحتوي مجلد RRO الموجود في مجلد تراكب OEM على الموارد التي سيتم تطبيقها على جميع التطبيقات المستهدفة. لدى RROs قيود تؤثر على قدرتها على تراكب الموارد المركبة. باختصار، RRO:

  • لا يمكن الإشارة إلى معرفات الموارد المحددة في APK الهدف، أو في RRO نفسه. وهذا يعني أن RROs لا يمكنها إضافة معرفات جديدة مثل الرسوميات أو الألوان أو الأنماط الجديدة.

  • يستطيع تشير إلى معرفات الموارد المحددة في إطار العمل، سواء تم تعريف هذه الموارد في /frameworks/base/core/res أو عن طريق تراكب وقت البناء. يجب الإشارة إلى هذه المعرفات باستخدام android: name-space:

    • بالنسبة إلى عمليات RROs العامة للأجهزة الافتراضية، استخدم 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 التالي البادئة التي ستحتوي عليها جميع RROs التي تم إنشاؤها.
      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
      

تكوين عمليات RROs

هناك ملف تكوين جديد مدعوم، overlayable.xml ، والذي يمكنك استخدامه لتحديد عناصر التحكم في الوصول. على سبيل المثال، يمكنك تحديد من يمكنه تراكب الموارد بالإضافة إلى الموارد التي يمكن تراكبها. ونتيجة لذلك، يمكن الآن تجميع الموارد بطرق مختلفة لجعلها متاحة ليتم تغطيتها بمكاتب RROs مختلفة.

لإعداد التحكم في الوصول RRO:

  1. في مجلد res/values ، أنشئ overlayable.xml .
  2. قم بإنشاء علامات الموارد <overlayable> .
  3. حدد سمة name للعلامة <overlayable> ، والتي يجب أن تكون فريدة في الحزمة. يمكن لكل تراكب أن يستهدف مجموعة واحدة فقط قابلة للتراكب.
  4. حدد علامة <policy> داخل <overlayable> .
  5. تحديد مجموعات الموارد التي يمكن تراكبها. على سبيل المثال:
      <resources>
          <overlayable name="OverlayableResources">
              <policy type="public">
                  <item type="string" name="app_title" />
              </policy>
          </overlayable>
      </resources>
      

لتطبيق التغييرات التالية على مشروع RRO الخاص بك:

  1. في المجلد res/xml ، قم بإنشاء overlays.xml . راجع الإدخال الموجود في نموذج التعليمات البرمجية أدناه للحصول على overlay .
  2. تحديد الموارد التي سيتم تجاوزها.
  3. أضف android:resourcesMap="@xml/overlays" إلى العلامة <overlay> في AndroidManifest.xml . على سبيل المثال، في نموذج التعليمات البرمجية أدناه، راجع إدخال <overlay> .
  4. قم بتعيين 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>
  

مع تحذير واحد، تعمل RROs الموجودة مسبقًا في Android 10. التحذير هو أنه سيتم تثبيت الحزم باستخدام PackageManagerRRO، ويجب أن تكون الحزم إما مثبتة مسبقًا أو موقعة بنفس مفتاح التطبيق المستهدف. في Android 10، يمكن تراكب ملفات التخطيط. ومع ذلك، يتطلب القيام بذلك استخدام requireViewById() أثناء الحصول على العرض بدلاً من findViewById() . في Android 10، تم تنفيذ هذا التغيير على car-ui-lib لدعم تراكبات التخطيط.

سيمكنك الإصدار الرئيسي التالي من Android من تراكب ملف تخطيط وتحديد موارد جديدة في حزمة RRO والرجوع إليها داخليًا.

إضافة موارد خاصة بـ OEM

للتغلب على قيود RRO التي تمنع إضافة موارد OEM:

  • قم بتوسيع الأطر/القاعدة باستخدام تراكب وقت البناء ، وإضافة أي موارد ضرورية.
  • ارجع إلى هذه الموارد من RROs الخاصة بـ OEM باستخدام *android: namespace.

على سبيل المثال، ما يلي هو طريقة لإضافة رسم خاص بـ 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 على بنية تسمح بتطبيقها بشكل مشروط بناءً على خصائص النظام. للتعامل مع علامات تجارية متعددة في صورة نظام واحدة، يمكن لمصنعي المعدات الأصلية استخدام ذلك على النحو التالي (راجع الهيكل العام ).

<?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 هذا فقط إذا كانت خاصية النظام المقابلة تطابق القيمة المقدمة. يمكن لمصنعي المعدات الأصلية بعد ذلك تحديد العديد من عمليات RROs هذه، وجميعها ممكّنة بشكل ثابت، ولها نشاط واحد فقط في كل مرة.

إضافة مكتبة واجهة مستخدم السيارة إلى الهدف

لدمج مكتبة Car UI في هدف Android، يجب عليك تضمين مقتطف التعليمات البرمجية التالي:

# 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 .

  • يتضمن RROs التي تم إنشاؤها في PRODUCT_PACKAGES .

  • يتضمن تراكب وقت البناء في PRODUCT_PACKAGE_OVERLAYS لإضافة موارد خاصة بشركة OEM.

لمعرفة الحزم التي تدعم car-ui-lib ، راجع قائمة الحزم التي تحتوي على car-ui-lib .