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

بعد أن تم تضمين مكوّنات مكتبة واجهة المستخدم في السيارة ومواردها في التطبيقات، على المصنّعين الأصليّين للسيارات توفير طبقتَين لتمكين المستخدمين من تخصيص هذه التطبيقات:

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

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

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

البنية العامة

في ما يلي بنية تراكب التخصيص المقترَحة:

  • <path-to-OEM-overlays>/

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

    • rro/

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

      • AndroidManifest.xml. نموذج ملف بيان يستخدمه ملف الإنشاء أعلاه

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

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

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

يجب أن يحتوي مجلد RRO في مجلد تراكب المصنّع الأصلي للجهاز على موارد ليتم تطبيقها على جميع التطبيقات المستهدَفة. تفرض طلبات الحصول على إذن بالوصول إلى الموارد قيودًا تؤثر في إمكانية تطبيقها على الموارد المركبة. باختصار، يشمل طلب الحصول على إذن بالوصول إلى البيانات ما يلي:

  • لا يمكن الإشارة إلى معرّفات الموارد المحدّدة في حزمة APK المستهدفة أو في RRO نفسها. وهذا يعني أنّ التطبيقات التي تستخدم ميزة "إعادة الشراء بدون إنترنت" لا يمكنها إضافة معرّفات جديدة، مثل عناصر قابلة للرسم أو ألوان أو أنماط جديدة.

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

    • بالنسبة إلى الملفّات العامة التي تتضمّن رمز RRO لـ DeviceDefault، استخدِم 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 التالي البادئة التي ستحصل عليها جميع ملفات RRO التي تم إنشاؤها.
      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
      

ضبط عمليات إعادة التوجيه على مستوى التطبيق

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

لإعداد ميزة التحكّم في الوصول إلى التطبيقات التي تستخدم رمز التشغيل القابل للقراءة فقط (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>
      

لتطبيق التغييرات التالية على مشروعك المعنيّ بإعادة التوجيه الناجح، يُرجى اتّباع الخطوات التالية:

  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>
  

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

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

إضافة موارد خاصة بجهات التصنيع الأصلية

للتغلب على قيود RRO التي تمنع إضافة موارد المصنّعين الأصليّين للأجهزة، اتّبِع الخطوات التالية:

  • يمكنك توسيع النُسخ الأساسية أو إطارات العمل باستخدام تراكب وقت الإنشاء، مع إضافة أي موارد ضرورية.
  • يمكنك الرجوع إلى هذه المراجع من ملفات RRO الخاصة بصانعي الأجهزة الأصليين باستخدام مساحة الاسم *android:.

على سبيل المثال، في ما يلي طريقة لإضافة ملف قابل للرسم خاص بجهة تصنيع المعدّات الأصلية واستخدامه في تطبيق قابل للتثبيت من مصدر غير معروف:

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

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

لدمج مكتبة واجهة المستخدم في السيارة مع ملف 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 ملفًا واحدًا لإعادة البيع لكل من الحِزم المُسماة في CAR_UI_RRO_PACKAGE_NAMES.

  • تتضمّن طلبات الحصول على أرقام تعريف العملاء التي تم إنشاؤها في PRODUCT_PACKAGES.

  • يتضمّن تراكبًا في وقت الإنشاء في PRODUCT_PACKAGE_OVERLAYS لإضافة موارد خاصة بجهة التصنيع الأصلية.

لمعرفة الحِزم التي تتيح استخدام car-ui-lib، اطّلِع على قائمة الحِزم التي تحتوي على car-ui-lib.