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

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

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

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

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

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

प्रस्तावित कस्टमाइज़ेशन ओवरले संरचना इस प्रकार है:

  • <path-to-OEM-overlays>/

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

    • rro/

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

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

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

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

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

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

  • टारगेट APK या आरआरओ ने ही ऐसा किया है. इसका मतलब है कि आरआरओ, ड्रॉ करने लायक नए आइटम, कलर या शैलियां.

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

    • सार्वजनिक DeviceDefault RRO के लिए, 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, जिसमें नीचे दी गई Makefile में 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. 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, Android 10 में काम करते हैं. चेतावनी पैकेजManagerRRO की मदद से इंस्टॉल किया जाना चाहिए, इसलिए पैकेज या तो पहले से इंस्टॉल होने चाहिए या उसी कुंजी से साइन किया गया है जिससे टारगेट ऐप्लिकेशन पर हस्ताक्षर किया गया है. Android 10 में, लेआउट फ़ाइलों के ऊपर बदलाव किया जा सकता है. हालांकि, ऐसा करने के लिए, व्यू पाने के बजाय requireViewById() का इस्तेमाल करना होगा findViewById(). Android 10 में इस बदलाव को कार-ui-lib में लागू किया गया है, ताकि लेआउट ओवरले को सपोर्ट किया जा सकता है.

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

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

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

  • बिल्ड-टाइम ओवरले का इस्तेमाल करके, फ़्रेमवर्क/बेस को बढ़ाना संसाधन.
  • *android: नेमस्पेस का इस्तेमाल करके, ओईएम आरआरओ की मदद से इन संसाधनों को देखें.

उदाहरण के लिए, 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>
        

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

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

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

किसी टारगेट में कार की यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी जोड़ें

किसी 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 वाले पैकेज की सूची देखें.