ऐप्लिकेशन को पसंद के मुताबिक बनाना

अब ऐप्लिकेशन में कार की यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी के कॉम्पोनेंट और संसाधन मौजूद हैं. इसलिए, इन ऐप्लिकेशन को पसंद के मुताबिक बनाने के लिए, ओईएम को दो ओवरले उपलब्ध कराने होंगे:

  • बिल्ड टाइम ओवरले, रनटाइम रिसॉर्स ओवरले (आरआरओ) के लिए ज़रूरी सभी संसाधन जोड़ता है. इसमें ये शामिल हैं:

    • ड्रॉ किए जा सकने वाले आइटम
    • स्टाइल (उदाहरण के लिए, टेक्स्ट का दिखना)
    • शेयर किए गए संसाधन (उदाहरण के लिए, रंग)
  • आरआरओ ओवरले फ़ोल्डर में ऐसे रिसॉर्स होते हैं जिनका इस्तेमाल, टारगेट किए गए हर ऐप्लिकेशन के लिए एक आरआरओ जनरेट करने के लिए किया जाता है. इन रिसॉर्स का इस्तेमाल सिर्फ़ इनके लिए किया जा सकता है:

    • एक ही आरआरओ में तय की गई वैल्यू. उदाहरण के लिए, रंग के लिए यह एक हेक्साडेसिमल वैल्यू होगी.
    • Android फ़्रेमवर्क के संसाधन (उदाहरण के लिए, @android:color/accent).
    • ऊपर दिए गए बिल्ड टाइम ओवरले में तय किया गया संसाधन.

सामान्य स्ट्रक्चर

पसंद के मुताबिक बनाए गए ओवरले का प्रस्तावित स्ट्रक्चर इस तरह है:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/. बिल्ड टाइम ओवरले रिसॉर्स

    • rro/

      • Android.mk. Makefile का इस्तेमाल, इस फ़ोल्डर में मौजूद संसाधनों के आधार पर, हर टारगेट पैकेज के लिए आरआरओ जनरेट करने के लिए किया जाता है.

      • AndroidManifest.xml. मेनिफ़ेस्ट फ़ाइल का टेंप्लेट, जिसका इस्तेमाल ऊपर दी गई Makefile करती है.

      • res/. टारगेट किए गए सभी ऐप्लिकेशन पर लागू होने वाले रनटाइम ओवरले.

OEM के पास इनमें से एक से ज़्यादा स्ट्रक्चर हो सकते हैं. यह इस बात पर निर्भर करता है कि उन्हें एक ही बिल्ड टारगेट में कितने ब्रैंड मैनेज करने हैं. ज़्यादा जानकारी के लिए, एक से ज़्यादा ब्रैंड मैनेज करना लेख पढ़ें.

रनटाइम रिसॉर्स ओवरले

OEM ओवरले फ़ोल्डर में मौजूद RRO फ़ोल्डर में, सभी टारगेट ऐप्लिकेशन पर लागू होने वाले संसाधन होने चाहिए. आरआरओ में कुछ सीमाएं होती हैं, जिनकी वजह से कंपाउंड रिसॉर्स को ओवरले करने की उनकी क्षमता पर असर पड़ता है. खास जानकारी के लिए, आरआरओ के बारे में यहां बताया गया है:

  • टारगेट APK या RRO में तय किए गए संसाधन आइडेंटिफ़ायर का उल्लेख नहीं किया जा सकता. इसका मतलब है कि आरआरओ, नए आइडेंटिफ़ायर नहीं जोड़ सकते. जैसे, नए ड्रॉबल, रंग या स्टाइल.

  • यह फ़्रेमवर्क में बताए गए रिसॉर्स आइडेंटिफ़ायर का संदर्भ दे सकता है. भले ही, उन रिसॉर्स को /frameworks/base/core/res में या बिल्ड टाइम ओवरले की मदद से तय किया गया हो. इन आइडेंटिफ़ायर को android: नेम-स्पेस का इस्तेमाल करके रेफ़र किया जाना चाहिए:

    • सार्वजनिक DeviceDefault RROs के लिए, android का इस्तेमाल करें.
      उदाहरण के लिए, @android:style/TextAppearance.DeviceDefault.Large.

    • अन्य सभी (सार्वजनिक नहीं या बिल्ड के समय ओवरले की मदद से जोड़े गए संसाधन) के लिए, *android का इस्तेमाल करें.
      उदाहरण के लिए, @*android/style:TextAppearance.OEM.Brand1.Title.

रिसॉर्स के अलावा, आरआरओ फ़ोल्डर में ये चीज़ें भी होनी चाहिए:

  • 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, प्रीफ़िक्स तय करता है कि जनरेट किए गए सभी आरआरओ में क्या होगा.
      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 नाम की एक नई कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल किया जा सकता है. इसकी मदद से, ऐक्सेस कंट्रोल तय किए जा सकते हैं. उदाहरण के लिए, यह तय किया जा सकता है कि कौनसे उपयोगकर्ता संसाधनों को ओवरले कर सकते हैं. साथ ही, यह भी तय किया जा सकता है कि किन संसाधनों को ओवरले किया जा सकता है. इस वजह से, संसाधनों को अब अलग-अलग तरीकों से ग्रुप किया जा सकता है, ताकि उन्हें अलग-अलग आरआरओ के साथ ओवरले किया जा सके.

आरआरओ ऐक्सेस कंट्रोल सेट अप करने के लिए:

  1. res/values फ़ोल्डर में, overlayable.xml बनाएं.
  2. <overlayable> संसाधन टैग बनाएं.
  3. <overlayable> टैग के लिए name एट्रिब्यूट तय करें. यह एट्रिब्यूट, पैकेज में यूनीक होना चाहिए. हर ओवरले, सिर्फ़ एक ओवरले ग्रुप को टारगेट कर सकता है.
  4. <overlayable> में <policy> टैग तय करें.
  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. AndroidManifest.xml में <overlay> टैग में android:resourcesMap="@xml/overlays" जोड़ें. उदाहरण के लिए, नीचे दिए गए कोड सैंपल में, <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>
  

हालांकि, पहले से मौजूद आरआरओ, Android 10 में काम करते हैं. ध्यान दें कि PackageManagerRRO की मदद से पैकेज इंस्टॉल करने के लिए, यह ज़रूरी है कि पैकेज पहले से इंस्टॉल हों या उन पर टारगेट ऐप्लिकेशन के साथ एक ही कुंजी से हस्ताक्षर किया गया हो. Android 10 में, लेआउट फ़ाइलों को ओवरले किया जा सकता है. हालांकि, ऐसा करने के लिए, व्यू पाने के दौरान findViewById() के बजाय requireViewById() का इस्तेमाल करना ज़रूरी है. Android 10 में, लेआउट ओवरले के साथ काम करने के लिए, car-ui-lib में यह बदलाव किया गया है.

Android की अगली बड़ी रिलीज़ में, आपके पास लेआउट फ़ाइल को ओवरले करने का विकल्प होगा. साथ ही, RRO पैकेज में नए रिसॉर्स तय किए जा सकेंगे और उन्हें इंटरनल तौर पर रेफ़र किया जा सकेगा.

OEM के हिसाब से संसाधन जोड़ना

आरआरओ की उन सीमाओं को दूर करने के लिए जो OEM संसाधनों को जोड़ने से रोकती हैं:

  • बिल्ड के समय ओवरले का इस्तेमाल करके, फ़्रेमवर्क/बेस को बड़ा करें. इसके लिए, ज़रूरी रिसॉर्स जोड़ें.
  • *android: नेमस्पेस का इस्तेमाल करके, OEM RROs से इन संसाधनों को देखें.

उदाहरण के लिए, OEM के हिसाब से ड्रॉआउट जोड़ने और उसे आरआरओ में इस्तेमाल करने का तरीका यहां बताया गया है:

  • <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>

एक से ज़्यादा ब्रैंड मैनेज करना

आरआरओ मेनिफ़ेस्ट फ़ाइलों में एक सिंटैक्स होता है, ताकि उन्हें सिस्टम प्रॉपर्टी के आधार पर, शर्तों के हिसाब से लागू किया जा सके. एक ही सिस्टम इमेज में कई ब्रैंड को मैनेज करने के लिए, OEMs इस तरीके का इस्तेमाल कर सकते हैं (सामान्य स्ट्रक्चर देखें).

<?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 के सिंटैक्स की वजह से, यह आरआरओ सिर्फ़ तब चालू होगा, जब उससे जुड़ी सिस्टम प्रॉपर्टी, दी गई वैल्यू से मेल खाती हो. इसके बाद, OEM कई 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 में जनरेट किए गए आरआरओ शामिल हैं.

  • OEM के हिसाब से रिसॉर्स जोड़ने के लिए, PRODUCT_PACKAGE_OVERLAYS में बिल्ड टाइम ओवरले शामिल किया गया है.

यह जानने के लिए कि कौनसे पैकेज car-ui-lib के साथ काम करते हैं, car-ui-lib वाले पैकेज की सूची देखें.