मेनिफ़ेस्ट फ़ाइलें प्रबंधित करें

इस पेज पर बताया गया है कि मेनिफ़ेस्ट मर्ज करने की सुविधा कैसे काम करती है और मर्ज को कैसे लागू किया जा सकता है इसके लिए प्राथमिकताएं एक से ज़्यादा विवाद सुलझाने. ऐप्लिकेशन के बारे में जानने के लिए मेनिफ़ेस्ट फ़ाइल में, ऐप्लिकेशन मेनिफ़ेस्ट की खास जानकारी पर टैप करें.

एक से ज़्यादा मेनिफ़ेस्ट फ़ाइलें मर्ज करना

आपकी APK या Android ऐप्लिकेशन बंडल फ़ाइल में सिर्फ़ एक फ़ाइल हो सकती है AndroidManifest.xml फ़ाइल है, लेकिन आपके Android Studio प्रोजेक्ट में मुख्य सोर्स सेट, बिल्ड वैरिएंट, और इंपोर्ट की गई कई मेनिफ़ेस्ट फ़ाइलें लाइब्रेरी. ऐप्लिकेशन बनाते समय, Gradle बिल्ड मर्ज हो जाता है सभी मेनिफ़ेस्ट फ़ाइलें एक ही मेनिफ़ेस्ट फ़ाइल में मिलेंगी, जिन्हें पैक किया गया है अपने ऐप्लिकेशन में लॉग इन करें.

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

सलाह: मर्ज किया गया मेनिफ़ेस्ट का इस्तेमाल करें देखें. इसकी जानकारी नीचे दिए गए सेक्शन में दी गई है. इसकी मदद से, मर्ज किए गए मेनिफ़ेस्ट के नतीजों की झलक देखी जा सकती है. गड़बड़ियां हैं.

प्राथमिकताएं मर्ज करें

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

पहला डायग्राम. तीन मेनिफ़ेस्ट मर्ज करने की प्रोसेस फ़ाइलों के लिए, सबसे कम प्राथमिकता के साथ सबसे कम प्राथमिकता का इस्तेमाल किया जा सकता है.

तीन बुनियादी तरह की मेनिफ़ेस्ट फ़ाइलें होती हैं, जिन्हें हर एक फ़ाइल में मर्ज किया जा सकता है और उनकी मर्ज की प्राथमिकताएं इस तरह हैं (सबसे ज़्यादा प्राथमिकता पहले):

  1. मेनिफ़ेस्ट फ़ाइल बिल्ड वैरिएंट

    अगर आपके पास अपने वैरिएंट के लिए एक से ज़्यादा सोर्स सेट हैं, तो उनकी मेनिफ़ेस्ट की प्राथमिकताएं इस तरह हैं:

    • वैरिएंट मेनिफ़ेस्ट बनाएं (जैसे, src/demoDebug/)
    • बिल्ड टाइप मेनिफ़ेस्ट (जैसे कि src/debug/)
    • प्रॉडक्ट फ़्लेवर मेनिफ़ेस्ट (जैसे कि src/demo/)

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

  2. ऐप्लिकेशन मॉड्यूल के लिए मुख्य मेनिफ़ेस्ट फ़ाइल
  3. शामिल की गई लाइब्रेरी में मौजूद मेनिफ़ेस्ट फ़ाइल

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

उदाहरण के लिए, लाइब्रेरी मेनिफ़ेस्ट को मुख्य मेनिफ़ेस्ट में मर्ज किया जाता है, फिर मुख्य मेनिफ़ेस्ट में मर्ज किया जाता है मेनिफ़ेस्ट को बिल्ड वैरिएंट मेनिफ़ेस्ट में मर्ज कर दिया गया है. ध्यान दें कि ये समान हैं जैसा कि यहां बताया गया है, सभी सोर्स सेट के लिए प्राथमिकताएं मर्ज करना सोर्स सेट का इस्तेमाल करके बनाएं.

अहम जानकारी: यहां से कॉन्फ़िगरेशन बनाएं build.gradle फ़ाइल मर्ज की गई मेनिफ़ेस्ट फ़ाइल. उदाहरण के लिए, minSdk को build.gradle से या build.gradle.kts फ़ाइल, इसमें मेल खाने वाले एट्रिब्यूट को बदल देती है <uses-sdk> मेनिफ़ेस्ट एलिमेंट. भ्रम की स्थिति से बचने के लिए, <uses-sdk> एलिमेंट का इस्तेमाल करें और इन प्रॉपर्टी को सिर्फ़ build.gradle फ़ाइल. ज़्यादा जानकारी के लिए, यह देखें अपने बिल्ड को कॉन्फ़िगर करें.

विवाद के अनुभवों को मर्ज करें

यह मर्ज टूल हर एक्सएमएल एलिमेंट को एक मेनिफ़ेस्ट से संबंधित एलिमेंट को किसी अन्य मेनिफ़ेस्ट में शामिल करें. मिलान कैसे किया जाता है, इस बारे में विवरण के लिए पहले से मौजूद है, तो पिछले सेक्शन में मर्ज करने की प्राथमिकताएं देखें.

अगर कम-प्राथमिकता वाली मेनिफ़ेस्ट फ़ाइल का कोई एलिमेंट, इसमें दिए गए किसी भी एलिमेंट से मेल नहीं खाता ज़्यादा प्राथमिकता वाले मेनिफ़ेस्ट को एक्सपोर्ट करता है, तो उसे मर्ज किए गए मेनिफ़ेस्ट में जोड़ दिया जाता है. हालांकि, अगर मिलता-जुलता कोई एलिमेंट मौजूद है, तो मर्जर टूल एक-दूसरे से सभी एट्रिब्यूट को उसी एलिमेंट में शामिल करना चाहिए. अगर टूल को पता चलता है कि मेनिफ़ेस्ट में अलग-अलग मानों के साथ समान विशेषता होती है, फिर एक मर्ज करें विवाद होता है.

टेबल 1 में संभावित नतीजों को दिखाया गया है, जब मर्जर टूल कॉम्बिनेशन की कोशिश करता है सभी एट्रिब्यूट को एक ही एलिमेंट में शामिल करना चाहिए.

टेबल 1. एट्रिब्यूट को मर्ज करने का डिफ़ॉल्ट तरीका मान

ज़्यादा प्राथमिकता वाला एट्रिब्यूट कम प्राथमिकता वाला एट्रिब्यूट एट्रिब्यूट को मर्ज किए जाने का नतीजा
काम की नहीं है काम की नहीं है कोई वैल्यू नहीं है (डिफ़ॉल्ट वैल्यू का इस्तेमाल करें)
मान B मान B
मान A काम की नहीं है मान A
मान A मान A
मान B विवाद की गड़बड़ी—आपको नीचे दी गई मर्ज करने के नियम वाला मार्कर.

हालांकि, कुछ ऐसी स्थितियां होती हैं जिनमें मर्जर टूल अलग तरह से काम करता है एक ही समस्या से बचने के लिए:

  • <manifest> एलिमेंट में मौजूद एट्रिब्यूट कभी मर्ज नहीं किए जाते साथ में; सिर्फ़ सबसे ज़्यादा प्राथमिकता वाले मेनिफ़ेस्ट के एट्रिब्यूट इस्तेमाल किए जाते हैं.
  • android:required एट्रिब्यूट <uses-feature> और <uses-library> एलिमेंट इस्तेमाल करते हैं OR मर्ज करना. अगर कोई विवाद होता है, तो "true" लागू की गई हो और एक मेनिफ़ेस्ट के लिए ज़रूरी सुविधा या लाइब्रेरी को हमेशा शामिल किया जाता है.
  • एट्रिब्यूट में मौजूद एट्रिब्यूट <uses-sdk> एलिमेंट हमेशा ज़्यादा प्राथमिकता वाली मेनिफ़ेस्ट फ़ाइल. हालांकि, इन स्थितियों में ऐसा नहीं होगा:
    • जब कम प्राथमिकता वाले मेनिफ़ेस्ट में minSdk वैल्यू होती है इसका साइज़ ज़्यादा होता है, तो कोई गड़बड़ी तब तक होती है, जब तक कि overrideLibrary मर्ज करने का नियम.
    • जब कम प्राथमिकता वाले मेनिफ़ेस्ट में targetSdkVersion होता है वह मान जो कम है, मर्जर टूल उस मान का उपयोग करता है शामिल हैं. साथ ही, यह सिस्टम से जुड़ी अनुमतियां भी जोड़ता है हैं, जो यह सुनिश्चित करने के लिए आवश्यक हैं कि आयात की गई लाइब्रेरी ठीक से काम करता है (उन मामलों में जहां Android के बाद वाले वर्शन में अनुमतियों की पाबंदियों को बढ़ा दिया है). इस बारे में ज़्यादा जानकारी पाने के लिए, सेक्शन देखें, इंप्लिसिट सिस्टम के बारे में अनुमतियां हैं.
  • <intent-filter> एलिमेंट के बीच कभी मैच नहीं होता मेनिफ़ेस्ट. हर कैटगरी को अलग माना जाता है और मर्ज किए गए मेनिफ़ेस्ट में कॉमन पैरंट एलिमेंट में जोड़ा गया हो.

विशेषताओं के बीच दूसरे सभी विवादों के लिए, आपको गड़बड़ी का मैसेज मिलता है और आपको इसमें विशेष विशेषता जोड़कर, मर्जर टूल को इसे हल करने का निर्देश दें ज़्यादा प्राथमिकता वाली मेनिफ़ेस्ट फ़ाइल होगी. इसके बारे में नीचे मौजूद सेक्शन देखें नियम मार्कर मर्ज करना.

एट्रिब्यूट की डिफ़ॉल्ट वैल्यू पर निर्भर न रहें. क्योंकि सभी अलग-अलग एट्रिब्यूट एक ही एलिमेंट में जोड़े जाते हैं, तो इससे अगर ज़्यादा प्राथमिकता वाली मेनिफ़ेस्ट फ़ाइल, असल में किसी एट्रिब्यूट की जानकारी दिए बिना उसकी डिफ़ॉल्ट वैल्यू. उदाहरण के लिए, अगर उच्च- प्रायॉरिटी मेनिफ़ेस्ट फ़ाइल में android:launchMode का एलान नहीं करता है एट्रिब्यूट की वैल्यू शामिल करता है, तो यह "standard" के डिफ़ॉल्ट मान का इस्तेमाल करता है—लेकिन अगर कम प्राथमिकता वाला मेनिफ़ेस्ट इस एट्रिब्यूट की अलग-अलग वैल्यू बताता है, वैल्यू को मर्ज किए गए मेनिफ़ेस्ट पर लागू किया जाता है. यह डिफ़ॉल्ट वैल्यू को बदल देता है. आपने लोगों तक पहुंचाया मुफ़्त में को हर एट्रिब्यूट को आपकी पसंद के मुताबिक तय करना चाहिए. डिफ़ॉल्ट वैल्यू दस्तावेज़ में हर एट्रिब्यूट के लिए, मेनिफ़ेस्ट रेफ़रंस के बारे में ज़्यादा जानें.

नियम मार्कर मर्ज करें

मर्ज नियम का मार्कर एक एक्सएमएल एट्रिब्यूट होता है. इसका इस्तेमाल अपनी प्राथमिकता दिखाने के लिए किया जा सकता है मर्ज करने से जुड़े विवादों को हल करने या अनचाहे एलिमेंट और एट्रिब्यूट को हटाने के बारे में जानकारी. मार्कर को पूरे एलिमेंट या किसी खास चीज़ पर लागू किया जा सकता है किसी एलिमेंट में एट्रिब्यूट की वैल्यू सबमिट करते हैं.

दो मेनिफ़ेस्ट फ़ाइलों को मर्ज करते समय, मर्जर टूल ज़्यादा प्राथमिकता वाली मेनिफ़ेस्ट फ़ाइल.

सभी मार्कर, Android tools नेमस्पेस से जुड़े हैं, इसलिए आपको पहले एलान करना होगा <manifest> एलिमेंट में यह नेमस्पेस, जैसा कि यहां दिखाया गया है:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    xmlns:tools="http://schemas.android.com/tools">
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

नोड मार्कर

पूरी एक्सएमएल एलिमेंट (किसी दिए गए एट्रिब्यूट में मौजूद सभी एट्रिब्यूट पर) पर मर्ज करने का नियम लागू करने के लिए मेनिफ़ेस्ट एलिमेंट और उसके सभी चाइल्ड टैग के लिए, इनका इस्तेमाल करें: विशेषताएं:

tools:node="merge"
इस टैग की सभी विशेषताएं और नेस्ट किए गए सभी एलिमेंट मौजूद होने पर उन्हें मर्ज करें मर्ज करने के लिए कोई कॉन्फ़्लिक्ट नहीं कॉन्फ़्लिक्ट ओरिस्टिक्स. यह एलिमेंट का डिफ़ॉल्ट व्यवहार है.

कम प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

ज़्यादा प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:node="merge">
</activity>

मर्ज किए गए मेनिफ़ेस्ट का नतीजा:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
tools:node="merge-only-attributes"
सिर्फ़ इस टैग में विशेषताएं मर्ज करें; नेस्ट किए गए एलीमेंट मर्ज न करें.

कम प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <data android:type="image/*" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

ज़्यादा प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:node="merge-only-attributes">
</activity>

मर्ज किए गए मेनिफ़ेस्ट का नतीजा:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateUnchanged">
</activity>
tools:node="remove"
इस एलिमेंट को मर्ज किए गए मेनिफ़ेस्ट से हटाएं. इसका इस्तेमाल तब किया जाता है, जब तो आपको अपने मर्ज किए गए मेनिफ़ेस्ट में कोई ऐसा एलिमेंट मिलता है जिसकी आपको ज़रूरत नहीं है को कम प्राथमिकता वाली मेनिफ़ेस्ट फ़ाइल से उपलब्ध कराया गया था. यह आपके कंट्रोल में नहीं है (जैसे कि कोई इंपोर्ट की गई लाइब्रेरी).

कम प्राथमिकता वाला मेनिफ़ेस्ट:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="cow"
      android:value="@string/moo"/>
  <meta-data android:name="duck"
      android:value="@string/quack"/>
</activity-alias>

ज़्यादा प्राथमिकता वाला मेनिफ़ेस्ट:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="cow"
      tools:node="remove"/>
</activity-alias>

मर्ज किए गए मेनिफ़ेस्ट का नतीजा:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="duck"
      android:value="@string/quack"/>
</activity-alias>
tools:node="removeAll"
tools:node="remove" से मिलता-जुलता है, लेकिन यह सभी को हटा देता है इस एलिमेंट टाइप से मैच करने वाले एलिमेंट (उसी पैरंट एलिमेंट में).

कम प्राथमिकता वाला मेनिफ़ेस्ट:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="cow"
      android:value="@string/moo"/>
  <meta-data android:name="duck"
      android:value="@string/quack"/>
</activity-alias>

ज़्यादा प्राथमिकता वाला मेनिफ़ेस्ट:

<activity-alias android:name="com.example.alias">
  <meta-data tools:node="removeAll"/>
</activity-alias>

मर्ज किए गए मेनिफ़ेस्ट का नतीजा:

<activity-alias android:name="com.example.alias">
</activity-alias>
tools:node="replace"
कम प्राथमिकता वाले एलिमेंट को पूरी तरह बदलें. इसका मतलब है कि अगर कम-प्राथमिकता वाली मेनिफ़ेस्ट में मिलती-जुलती फ़ाइल है, तो इसे अनदेखा करें और इसका इस्तेमाल करें इस मेनिफ़ेस्ट में बताए गए इस एलिमेंट को ठीक वैसे ही इस्तेमाल कर सकते हैं.

कम प्राथमिकता वाला मेनिफ़ेस्ट:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="cow"
      android:value="@string/moo"/>
  <meta-data android:name="duck"
      android:value="@string/quack"/>
</activity-alias>

ज़्यादा प्राथमिकता वाला मेनिफ़ेस्ट:

<activity-alias android:name="com.example.alias"
    tools:node="replace">
  <meta-data android:name="fox"
      android:value="@string/dingeringeding"/>
</activity-alias>

मर्ज किए गए मेनिफ़ेस्ट का नतीजा:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="fox"
      android:value="@string/dingeringeding"/>
</activity-alias>
tools:node="strict"
जब भी इस एलिमेंट की प्राथमिकता कम होगी, तो बिल्ड फ़ेल हो जाएगा मेनिफ़ेस्ट, ज़्यादा प्राथमिकता वाले मेनिफ़ेस्ट के एलिमेंट से पूरी तरह मेल नहीं खाता (जब तक कि मर्ज करने के अन्य नियम के मार्कर की मदद से समाधान किया गया हो). यह मर्ज विरोधाभास के अनुभव को ओवरराइड करता है. इसके लिए उदाहरण के लिए, अगर कम प्राथमिकता वाले मेनिफ़ेस्ट में एक और एट्रिब्यूट शामिल है, बिल्ड विफल रहता है (जबकि डिफ़ॉल्ट व्यवहार अतिरिक्त विशेषता जोड़ता है मर्ज किए गए मेनिफ़ेस्ट).

कम प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

ज़्यादा प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:node="strict">
</activity>

इससे मेनिफ़ेस्ट मर्ज करने से जुड़ी गड़बड़ी होती है. दो मेनिफ़ेस्ट एलिमेंट सख़्त मोड में बिलकुल अलग नहीं हो सकता. आपको मर्ज करने के नियम के अन्य मार्कर लागू करने होंगे ताकि इन अंतरों को ठीक किया जा सके. (tools:node="strict" के बिना, ये दो फ़ाइलें बिना किसी गड़बड़ी के एक साथ मर्ज हो सकती हैं, जैसा कि tools:node="merge".)

एट्रिब्यूट मार्कर

इसके बजाय, मर्ज करने के नियम को सिर्फ़ खास एट्रिब्यूट पर लागू करने के लिए मेनिफ़ेस्ट टैग को सेट करते हैं, तो इनका इस्तेमाल करें: एट्रिब्यूट. हर एट्रिब्यूट में एक या एक से ज़्यादा एट्रिब्यूट के नाम डाले जा सकते हैं. इन नामों में एट्रिब्यूट नेमस्पेस), कॉमा से अलग की गई होती है.

tools:remove="attr, ..."
मर्ज किए गए मेनिफ़ेस्ट से चुनिंदा एट्रिब्यूट को हटाएं. इसका इस्तेमाल तब किया जाता है, जब कम प्राथमिकता वाली मेनिफ़ेस्ट फ़ाइल में ये शामिल हों एट्रिब्यूट और आप यह पक्का करना चाहते हैं कि वे मर्ज की गई प्रॉपर्टी में न जाएं मेनिफ़ेस्ट.

कम प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">

ज़्यादा प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:remove="android:windowSoftInputMode">

मर्ज किए गए मेनिफ़ेस्ट का नतीजा:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait">
tools:replace="attr, ..."
कम प्राथमिकता वाले मेनिफ़ेस्ट में बताए गए एट्रिब्यूट को इससे बदलें इस मेनिफ़ेस्ट से मिली फ़ाइलें शामिल हैं. दूसरे शब्दों में, हमेशा ज़्यादा प्राथमिकता वाली मेनिफ़ेस्ट वैल्यू का इस्तेमाल करें.

कम प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:theme="@oldtheme"
    android:exported="false"
    android:windowSoftInputMode="stateUnchanged">

ज़्यादा प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:theme="@newtheme"
    android:exported="true"
    android:screenOrientation="portrait"
    tools:replace="android:theme,android:exported">

मर्ज किए गए मेनिफ़ेस्ट का नतीजा:

<activity android:name="com.example.ActivityOne"
    android:theme="@newtheme"
    android:exported="true"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateUnchanged">
tools:strict="attr, ..."
किसी भी समय इन एट्रिब्यूट की वैल्यू के तौर पर बिल्ड फ़ेल जनरेट करें कम प्राथमिकता वाला मेनिफ़ेस्ट, ज़्यादा प्राथमिकता वाले एट्रिब्यूट से पूरी तरह मेल नहीं खाता मेनिफ़ेस्ट. इसे छोड़कर, बाकी सभी विशेषताओं के लिए यह डिफ़ॉल्ट व्यवहार है जिनका खास व्यवहार होता है, जैसा कि मर्ज संघर्ष के अनुभव से जुड़े डेटा में बताया गया है.

कम प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="landscape">
</activity>

ज़्यादा प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:strict="android:screenOrientation">
</activity>

इससे मेनिफ़ेस्ट मर्ज करने से जुड़ी गड़बड़ी होती है. आपको मर्ज करने से जुड़ा अन्य नियम लागू करना होगा मार्कर का इस्तेमाल करें. यह डिफ़ॉल्ट व्यवहार है, इसलिए साफ़ तौर पर जोड़ने पर समान परिणाम मिलता है tools:strict="screenOrientation".

एक एलिमेंट पर एक से ज़्यादा मार्कर भी लागू किए जा सकते हैं, जैसा कि इस उदाहरण में दिखाया गया है:

कम प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:theme="@oldtheme"
    android:exported="false"
    android:allowTaskReparenting="true"
    android:windowSoftInputMode="stateUnchanged">

ज़्यादा प्राथमिकता वाला मेनिफ़ेस्ट:

<activity android:name="com.example.ActivityOne"
    android:theme="@newtheme"
    android:exported="true"
    android:screenOrientation="portrait"
    tools:replace="android:theme,android:exported"
    tools:remove="android:windowSoftInputMode">

मर्ज किए गए मेनिफ़ेस्ट का नतीजा:

<activity android:name="com.example.ActivityOne"
    android:theme="@newtheme"
    android:exported="true"
    android:allowTaskReparenting="true"
    android:screenOrientation="portrait">

मार्कर सिलेक्टर

अगर आपको किसी खास इवेंट में मर्ज करने के नियम के मार्कर लागू करने हैं, तो इंपोर्ट की गई लाइब्रेरी में, tools:selector एट्रिब्यूट को इसके साथ जोड़ें लाइब्रेरी पैकेज का नाम.

उदाहरण के लिए, इस मेनिफ़ेस्ट के साथ, remove मर्ज नियम सिर्फ़ तब लागू होता है, जब कम प्राथमिकता वाली मेनिफ़ेस्ट फ़ाइल com.example.lib1 लाइब्रेरी:

<permission android:name="permissionOne"
    tools:node="remove"
    tools:selector="com.example.lib1">

अगर कम प्राथमिकता वाला मेनिफ़ेस्ट किसी दूसरे सोर्स से है, तो remove मर्ज नियम को अनदेखा किया जाता है.

ध्यान दें: अगर इसे किसी एट्रिब्यूट मार्कर के साथ इस्तेमाल किया जाता है, तो तो यह मार्कर में तय सभी एट्रिब्यूट पर लागू होता है.

<uses-sdk> को ओवरराइड करें इंपोर्ट की गई लाइब्रेरी के लिए

डिफ़ॉल्ट रूप से, minSdk वैल्यू वाली लाइब्रेरी इंपोर्ट करते समय जो मुख्य मेनिफ़ेस्ट फ़ाइल से बड़ी होती है, उसमें एक गड़बड़ी होती है और लाइब्रेरी को इंपोर्ट नहीं किया जा सकता.

मर्जर टूल को इस विवाद को अनदेखा करने के लिए और अपने ऐप्लिकेशन के minSdk वर्शन को कम रखते हुए, लाइब्रेरी को इंपोर्ट करें वैल्यू के तौर पर, <uses-sdk> टैग में overrideLibrary एट्रिब्यूट जोड़ें. एट्रिब्यूट की वैल्यू, एक या एक से ज़्यादा लाइब्रेरी पैकेज के नाम हो सकती है (कॉमा से अलग किए गए) से अलग करते हैं, जो उन लाइब्रेरी को दिखाता है जो मुख्य फ़ाइल को ओवरराइड कर सकती हैं मेनिफ़ेस्ट का minSdk.

उदाहरण के लिए, अगर आपके ऐप्लिकेशन का मुख्य मेनिफ़ेस्ट overrideLibrary लागू होता है इस तरह:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.app"
          xmlns:tools="http://schemas.android.com/tools">
  <uses-sdk tools:overrideLibrary="com.example.lib1, com.example.lib2"/>
...

इसके बाद, नीचे दिए गए मेनिफ़ेस्ट को बिना किसी गड़बड़ी के मर्ज किया जा सकता है <uses-sdk> टैग और मर्ज किया गया मेनिफ़ेस्ट सेव रहता है ऐप्लिकेशन मेनिफ़ेस्ट से minSdk="2".

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.lib1">
   <uses-sdk android:minSdk="4" />
...

सिस्टम से जुड़ी इंप्लिसिट अनुमतियां

कुछ Android API, जो पहले ऐप्लिकेशन से आसानी से ऐक्सेस किए जा सकते थे में सिस्टम अनुमतियों के तहत पाबंदी लगाई गई है Android के सबसे नए वर्शन पर काम करता है.

इन ऐप्लिकेशन के ऐक्सेस की उम्मीद करने वाले ऐप्लिकेशन की परफ़ॉर्मेंस को बनाए रखने के लिए एपीआई की मदद से, Android के हाल ही के वर्शन का इस्तेमाल करने पर, ऐप्लिकेशन इन एपीआई का इस्तेमाल जारी रख सकते हैं अगर targetSdkVersion को कम वैल्यू पर सेट किया जाता है, तो अनुमति के बिना उस वर्शन से अलग होना चाहिए जिसमें पाबंदी जोड़ी गई है. यह व्यवहार ऐप्लिकेशन को पूरी तरह से एपीआई ऐक्सेस करने की अनुमति देता है. मर्ज की गई ऐसे मेनिफ़ेस्ट जिनके लिए अलग-अलग वैल्यू होती हैं targetSdkVersion पर असर हो सकता है.

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

उदाहरण के लिए, अगर आपका ऐप्लिकेशन targetSdkVersion को 4 या उसके बाद के लेवल पर सेट करता है और किसी लाइब्रेरी में targetSdkVersion की वैल्यू 3 या उससे कम पर सेट की जाती है, तो मर्जर टूल WRITE_EXTERNAL_STORAGE अनुमति मिली हुई है.

दूसरी टेबल में सभी संभावित अनुमतियों की सूची दी गई है जिसे आपके मर्ज किए गए मेनिफ़ेस्ट में जोड़ा जा सकता है:

दूसरी टेबल. मर्जर टूल की अनुमतियों की सूची मर्ज किए गए मेनिफ़ेस्ट में जोड़ सकता है

कम प्राथमिकता वाले मेनिफ़ेस्ट के बारे में एलान मर्ज किए गए मेनिफ़ेस्ट में अनुमतियां जोड़ी गईं
targetSdkVersion, 3 या इससे कम है WRITE_EXTERNAL_STORAGE, READ_PHONE_STATE
targetSdkVersion की उम्र 15 साल या उससे कम है और यह READ_CONTACTS का इस्तेमाल कर रही है READ_CALL_LOG
targetSdkVersion की उम्र 15 साल या उससे कम है और यह WRITE_CONTACTS का इस्तेमाल कर रही है WRITE_CALL_LOG

मर्ज किए गए मेनिफ़ेस्ट की जांच करें और विवादों को ढूंढें

अपना ऐप्लिकेशन बनाने से पहले ही, मर्ज की गई सभी चीज़ों की झलक देखी जा सकती है मेनिफ़ेस्ट कैसा दिखता है. झलक देखने के लिए, यह तरीका अपनाएं:

  1. Android Studio में, अपनी AndroidManifest.xml फ़ाइल खोलें.
  2. एडिटर के सबसे नीचे मौजूद, मर्ज किया गया मेनिफ़ेस्ट टैब पर क्लिक करें.

'मर्ज किया गया मेनिफ़ेस्ट' व्यू, बाईं ओर मर्ज किए गए मेनिफ़ेस्ट के नतीजे दिखाता है साथ ही, मर्ज की गई हर मेनिफ़ेस्ट फ़ाइल के बारे में जानकारी, जैसा कि दूसरी इमेज.

ऐसे एलिमेंट जिन्हें कम प्राथमिकता वाली मेनिफ़ेस्ट फ़ाइलों से मर्ज किया गया था जो बाईं ओर अलग-अलग रंगों में हाइलाइट किए गए हों. हर रंग के लिए यह अहम है मेनिफ़ेस्ट सोर्स में दिया गया है.

दूसरा डायग्राम. मर्ज किया गया मेनिफ़ेस्ट व्यू.

ऐसी मेनिफ़ेस्ट फ़ाइलें जो बिल्ड का हिस्सा थीं, लेकिन उनमें एलिमेंट का योगदान नहीं दिया गया या एट्रिब्यूट की जानकारी, अन्य मेनिफ़ेस्ट फ़ाइलों में दी गई है.

यह जानने के लिए कि कोई एलिमेंट कहां से आया है, उसे बाईं ओर क्लिक करें पैनल का इस्तेमाल करें, और इसकी जानकारी मर्जिंग लॉग में दिखेगी.

अगर कोई कॉन्फ़्लिक्ट होता है, तो वह मर्जिंग एरर में दिखता है साथ ही, आपको सुझाव दिया जा सकता है कि मर्ज करने के नियम के मार्कर.

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

मर्ज करने के डिसिज़न ट्री का पूरा लॉग देखने के लिए, आपके मॉड्यूल की build/outputs/logs/ डायरेक्ट्री में मौजूद लॉग फ़ाइल, जिसका नाम दिया गया है manifest-merger-buildVariant-report.txt.

नीतियां मर्ज करें

मेनिफ़ेस्ट मर्जर टूल, एक मेनिफ़ेस्ट के हर एक्सएमएल एलिमेंट का तर्क के साथ मिलान कर सकता है फ़ाइल को किसी दूसरी फ़ाइल में संबंधित एलिमेंट से जोड़ना होगा. मर्जर हर एलिमेंट से मेल खाता है मैच की का इस्तेमाल करके, एट्रिब्यूट की किसी यूनीक वैल्यू (जैसे, android:name) का इस्तेमाल करें या अपने आप में टैग की स्वाभाविक विशेषता (उदाहरण के लिए, केवल एक कीवर्ड <supports-screen> एलिमेंट).

अगर दो मेनिफ़ेस्ट में एक ही एक्सएमएल एलिमेंट है, तो यह टूल, मर्ज करने के लिए बनी तीन नीतियों में से किसी एक का इस्तेमाल करके, दोनों एलिमेंट को एक साथ मर्ज करता है:

मर्ज करें
आपस में मेल न खाने वाले सभी एट्रिब्यूट को एक ही टैग में जोड़ें और मर्ज करें मर्ज करने की नीति के मुताबिक चाइल्ड एलिमेंट. अगर कोई एट्रिब्यूट एक-दूसरे से विरोधाभास करें, उन्हें मर्ज नियम चिह्नक की सहायता से मर्ज करें.
सिर्फ़ बच्चों को मर्ज करें
एट्रिब्यूट को एक साथ न जोड़ें या मर्ज न करें. सिर्फ़ दिए गए एट्रिब्यूट ही सबमिट करें सबसे ज़्यादा प्राथमिकता वाली मेनिफ़ेस्ट फ़ाइल में सेव करें) और मर्ज करने की नीति के मुताबिक चाइल्ड एलिमेंट.
Keep
एलिमेंट को वैसा ही रहने दें और उसे सामान्य पैरंट एलिमेंट में जोड़ें मर्ज की गई फ़ाइल. इसका इस्तेमाल सिर्फ़ तब किया जाता है, जब कई एक ही एलिमेंट की घोषणा के साथ.

टेबल 3 में हर तरह के एलिमेंट, इस्तेमाल की गई मर्ज नीति, और इस पासकोड का इस्तेमाल, दो मेनिफ़ेस्ट के बीच एलिमेंट का मैच तय करने के लिए किया जाता है:

तीसरी टेबल. मेनिफ़ेस्ट एलिमेंट मर्ज करने से जुड़ी नीतियां और मैच बटन

कौन-कौन सी चीज़ें शामिल हैं मर्ज नीति मैच की
<action> मर्ज करें android:name एट्रिब्यूट
<activity> मर्ज करें android:name एट्रिब्यूट
<application> मर्ज करें हर <manifest> में सिर्फ़ एक मैसेज मिलता है.
<category> मर्ज करें android:name एट्रिब्यूट
<data> मर्ज करें हर <intent-filter> में सिर्फ़ एक मैसेज मिलता है.
<grant-uri-permission> मर्ज करें हर <provider> में सिर्फ़ एक मैसेज मिलता है.
<instrumentation> मर्ज करें android:name एट्रिब्यूट
<intent-filter> Keep कोई मिलान नहीं; पैरंट एलिमेंट में कई एलानों की अनुमति दी जाती है.
<manifest> सिर्फ़ बच्चों को मर्ज करें हर फ़ाइल में सिर्फ़ एक फ़ाइल होती है.
<meta-data> मर्ज करें android:name एट्रिब्यूट
<path-permission> मर्ज करें हर <provider> में सिर्फ़ एक मैसेज मिलता है.
<permission-group> मर्ज करें android:name एट्रिब्यूट
<permission> मर्ज करें android:name एट्रिब्यूट
<permission-tree> मर्ज करें android:name एट्रिब्यूट
<provider> मर्ज करें android:name एट्रिब्यूट
<receiver> मर्ज करें android:name एट्रिब्यूट
<screen> मर्ज करें android:screenSize एट्रिब्यूट
<service> मर्ज करें android:name एट्रिब्यूट
<supports-gl-texture> मर्ज करें android:name एट्रिब्यूट
<supports-screen> मर्ज करें हर <manifest> में सिर्फ़ एक मैसेज मिलता है.
<uses-configuration> मर्ज करें हर <manifest> में सिर्फ़ एक मैसेज मिलता है.
<uses-feature> मर्ज करें android:name एट्रिब्यूट की वैल्यू (अगर मौजूद न हो, तो android:glEsVersion एट्रिब्यूट)
<uses-library> मर्ज करें android:name एट्रिब्यूट
<uses-permission> मर्ज करें android:name एट्रिब्यूट
<uses-sdk> मर्ज करें हर <manifest> में सिर्फ़ एक मैसेज मिलता है.
कस्टम एलिमेंट मर्ज करें कोई मिलान नहीं; इनके बारे में मर्जर टूल के बारे में जानकारी नहीं है और ये हमेशा मर्ज किए गए मेनिफ़ेस्ट में शामिल हो.

मेनिफ़ेस्ट में बिल्ड वैरिएबल इंजेक्ट करें

अगर आपको अपनी AndroidManifest.xml फ़ाइल में ऐसे वैरिएबल डालने हैं जो परिभाषित आपकी build.gradle फ़ाइल में है, तो आप manifestPlaceholders प्रॉपर्टी. यह प्रॉपर्टी, की-वैल्यू पेयर का मैप लेती है, जैसा कि यहां दिखाया गया है:

ग्रूवी

android {
    defaultConfig {
        manifestPlaceholders = [hostName:"www.example.com"]
    }
    ...
}

Kotlin

android {
    defaultConfig {
        manifestPlaceholders["hostName"] = "www.example.com"
    }
    ...
}

इसके बाद, मेनिफ़ेस्ट फ़ाइल में किसी एक प्लेसहोल्डर को विशेषता मान:

<intent-filter ... >
    <data android:scheme="https" android:host="${hostName}" ... />
    ...
</intent-filter>

डिफ़ॉल्ट रूप से, बिल्ड टूल आपके ऐप्लिकेशन का ऐप्लिकेशन आईडी ${applicationId} प्लेसहोल्डर में. वैल्यू हमेशा फ़ाइनल वैल्यू से मैच होती है मौजूदा बिल्ड का ऐप्लिकेशन आईडी, जिसमें यह शामिल है बिल्ड के वैरिएंट के हिसाब से बदलाव करते हैं. यह तब काम आता है, जब आपको आइडेंटिफ़ायर के लिए यूनीक नेमस्पेस का इस्तेमाल करना हो जैसे कि इंटेंट कार्रवाई. भले ही, वे आपके बिल्ड वैरिएंट के बीच में ही क्यों न हों.

उदाहरण के लिए, अगर आपकी build.gradle फ़ाइल ऐसी दिखती है:

ग्रूवी

android {
    defaultConfig {
        applicationId "com.example.myapp"
    }
    flavorDimensions "type"
    productFlavors {
        free {
            applicationIdSuffix ".free"
            dimension "type"
        }
        pro {
            applicationIdSuffix ".pro"
            dimension "type"
        }
    }
}

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"
    }
    flavorDimensions += "type"
    productFlavors {
        create("free") {
            applicationIdSuffix = ".free"
            dimension = "type"
        }
        create("pro") {
            applicationIdSuffix = ".pro"
            dimension = "type"
        }
    }
}

फिर आप अपने मेनिफ़ेस्ट में इस तरह ऐप्लिकेशन आईडी डाल सकते हैं:

<intent-filter ... >
    <action android:name="${applicationId}.TRANSMOGRIFY" />
    ...
</intent-filter>

साथ ही, "free" बनाने पर, मेनिफ़ेस्ट को पूरा नहीं किया जा सकता प्रॉडक्ट का फ़्लेवर यह है:

<intent-filter ... >
   <action android:name="com.example.myapp.free.TRANSMOGRIFY" />
    ...
</intent-filter>

ज़्यादा जानकारी के लिए, पढ़ें ऐप्लिकेशन आईडी सेट करें.