ऐप्स कस्टमाइज़ करें

अब जब कार यूआई लाइब्रेरी घटक और संसाधन ऐप्स में हैं, तो इन ऐप्स को अनुकूलित करने के लिए, ओईएम को दो ओवरले प्रदान करने होंगे:

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

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

    • समान आरआरओ के भीतर परिभाषित मान (उदाहरण के लिए, एक रंग के लिए यह एक हेक्साडेसिमल मान होगा)।
    • एंड्रॉइड फ्रेमवर्क संसाधन (उदाहरण के लिए, @android:color/accent )।
    • उपरोक्त बिल्ड-टाइम ओवरले में परिभाषित एक संसाधन।

सामान्य संरचना

प्रस्तावित अनुकूलन ओवरले संरचना इस प्रकार है:

  • <path-to-OEM-overlays>/

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

    • rro/

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

      • AndroidManifest.xml . उपरोक्त मेकफ़ाइल द्वारा उपयोग किया गया एक मैनिफ़ेस्ट फ़ाइल टेम्पलेट।

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

ओईएम के पास इनमें से एक से अधिक संरचनाएं हो सकती हैं, यह इस बात पर निर्भर करता है कि वे एक ही निर्माण लक्ष्य में कितने ब्रांडों को संभालना चाहते हैं ( कई ब्रांडों को संभालें देखें)।

रनटाइम संसाधन ओवरले

ओईएम ओवरले फ़ोल्डर में आरआरओ फ़ोल्डर में सभी लक्षित ऐप्स पर लागू होने वाले संसाधन होने चाहिए। आरआरओ की सीमाएँ हैं जो यौगिक संसाधनों को ओवरले करने की उनकी क्षमता को प्रभावित करती हैं। संक्षेप में, एक आरआरओ:

  • लक्ष्य एपीके या आरआरओ में परिभाषित संसाधन पहचानकर्ताओं का उल्लेख नहीं किया जा सकता है। इसका मतलब यह है कि आरआरओ नए पहचानकर्ता जैसे नए ड्रॉएबल्स, रंग या स्टाइल नहीं जोड़ सकते हैं।

  • कर सकना फ़्रेमवर्क में परिभाषित संसाधन पहचानकर्ताओं को देखें, चाहे उन संसाधनों को /frameworks/base/core/res में परिभाषित किया गया हो या बिल्ड-टाइम ओवरले के माध्यम से। इन पहचानकर्ताओं को android: name-space: का उपयोग करके संदर्भित किया जाना चाहिए।

    • सार्वजनिक डिवाइस डिफॉल्ट आरआरओ के लिए, 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>
  

एक चेतावनी के साथ, पहले से मौजूद आरआरओ एंड्रॉइड 10 में काम करते हैं। चेतावनी यह है कि पैकेजमैनेजरआरआरओ के साथ इंस्टॉल होने के लिए, पैकेज को या तो पहले से इंस्टॉल किया जाना चाहिए या लक्ष्य ऐप के समान कुंजी के साथ हस्ताक्षरित होना चाहिए। एंड्रॉइड 10 में, लेआउट फ़ाइलों को ओवरलेड किया जा सकता है। हालाँकि, ऐसा करने के लिए दृश्य प्राप्त करते समय findViewById() के बजाय requireViewById() के उपयोग की आवश्यकता होती है। एंड्रॉइड 10 में, लेआउट ओवरले का समर्थन करने के लिए यह परिवर्तन कार-यूआई-लिब में लागू किया गया है।

एंड्रॉइड की अगली प्रमुख रिलीज़ आपको एक लेआउट फ़ाइल को ओवरले करने और आरआरओ पैकेज में नए संसाधनों को परिभाषित करने और उन्हें आंतरिक रूप से संदर्भित करने में सक्षम करेगी।

OEM-विशिष्ट संसाधन जोड़ें

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

  • किसी भी आवश्यक संसाधन को जोड़कर, बिल्ड-टाइम ओवरले का उपयोग करके फ्रेमवर्क/आधार का विस्तार करें।
  • *android: नेमस्पेसिंग का उपयोग करके OEM आरआरओ से इन संसाधनों का संदर्भ लें।

उदाहरण के लिए, 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 तभी सक्षम होगा जब संबंधित सिस्टम प्रॉपर्टी दिए गए मान से मेल खाती है। ओईएम फिर इनमें से कई आरआरओ को परिभाषित कर सकते हैं, वे सभी स्थिर रूप से सक्षम हैं, और एक समय में केवल एक ही सक्रिय है।

लक्ष्य में कार यूआई लाइब्रेरी जोड़ें

एंड्रॉइड लक्ष्य में कार यूआई लाइब्रेरी को शामिल करने के लिए, आपको निम्नलिखित कोड स्निपेट शामिल करना होगा:

# 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 \
      ...
  • CAR_UI_RRO_PACKAGE_NAMES में नामित प्रत्येक पैकेज के लिए <path-to-OEM-overlays>/rro/Android.mk एक RRO उत्पन्न करता है।

  • PRODUCT_PACKAGES में जेनरेट किए गए RRO शामिल हैं।

  • OEM-विशिष्ट संसाधनों को जोड़ने के लिए PRODUCT_PACKAGE_OVERLAYS में बिल्ड-टाइम ओवरले शामिल है।

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