إدارة ملفات البيان

توضّح هذه الصفحة آلية عمل دمج البيان وكيفية تطبيق الدمج. التفضيلات إلى لحل تعارضات الدمج. لمقدمة عن التطبيق ملف البيان، يمكنك الاطلاع على نظرة عامة على بيان التطبيق.

دمج ملفات بيان متعددة

يمكن أن يحتوي ملف APK أو مجموعة حزمات تطبيق Android على ملف واحد فقط. ملف AndroidManifest.xml، ولكن قد يحتوي مشروع "استوديو Android" على ملفات البيانات المتعددة التي توفِّرها مجموعة المصدر الرئيسية ونُسخ الإصدارات والنُسخ التي تم استيرادها المكتبات. عند إنشاء تطبيقك، يتم دمج إصدار Gradle جميع ملفات البيان في ملف بيان واحد مضغوط داخل التطبيق.

تجمع أداة دمج البيان كل عناصر XML من كل ملف عن طريق اتباع دمج الإرشادات والالتزام بتفضيلات الدمج التي حددتها مع سمات XML الخاصة.

ملاحظة: يُرجى استخدام البيان المدمج. كما هو موضح في القسم التالي، لمعاينة نتائج البيان المدمج والعثور على تعارض الأخطاء.

دمج الأولويات

تدمج أداة الدمج جميع ملفات البيان في ملف واحد بشكل تسلسلي، بناءً على أولوية كل ملف بيان. على سبيل المثال، إذا كان لديك ثلاثة ملفات بيانات، سيتم دمج البيان ذي الأولوية الأقل في البيان الذي يلي الأولوية القصوى، ثم يتم دمجه في البيانات ذات الأولوية القصوى كما هو موضح في الشكل 1.

الشكل 1. يشير هذا المصطلح إلى عملية دمج ثلاثة جوانب. من الملفات ذات الأولوية الأدنى إلى أعلى أولوية.

هناك ثلاثة أنواع أساسية من ملفات البيان التي يمكن دمجها في كل ملف. أخرى، وتكون أولويات الدمج الخاصة بها على النحو التالي (الأولوية الأعلى أولاً):

  1. ملف البيان إنشاء صيغة

    إذا كانت لديك مجموعات مصادر متعددة لخيارك، فإن أولويات البيان هي كما يلي:

    • إنشاء بيان الصيغة (مثل src/demoDebug/)
    • بيان نوع الإصدار (مثل src/debug/)
    • بيان نكهة المنتج (مثل src/demo/)

      إذا كنت تستخدم سمات الصيغة، يجب تحديد أولويات مع الترتيب الذي يتم إدراج كل بُعد فيه في السمة flavorDimensions (السمة الأولى هي الأولوية القصوى).

  2. ملف البيان الرئيسي لوحدة التطبيق
  3. ملف البيان من مكتبة مضمّنة

    إذا كانت لديك مكتبات متعددة، تتطابق أولوياتها في البيان. الترتيب الذي تظهر به في Gradle حظر "dependencies"

على سبيل المثال، يتم دمج بيان المكتبة في البيان الرئيسي، ثم يتم دمج تم دمج ملف البيان في بيان صيغة الإصدار. لاحظ أن هذه هي نفس دمج الأولويات لكل مجموعات المصادر، كما هو موضّح في إنشاء باستخدام مجموعات المصادر:

ملاحظة مهمة: يمكنك إنشاء عمليات ضبط من يلغي الملف build.gradle أي سمات مقابلة في ملف بيان مدمج. على سبيل المثال، تُظهر الصفحة minSdk من build.gradle أو يلغي ملف build.gradle.kts السمة المطابقة في <uses-sdk> عنصر البيان. لتجنب الالتباس، اترك <uses-sdk> وتحديد هذه الخصائص فقط في العنصر ملف build.gradle. لمزيد من التفاصيل، يُرجى مراجعة اضبط الإصدار.

دمج إرشادات الصراع

يمكن لأداة الدمج أن تطابق بشكل منطقي كل عنصر XML من ملف بيان إلى العنصر المتجاوب في بيان آخر. للحصول على تفاصيل حول كيفية مطابقة يمكنك الاطلاع على دمج الأولويات في القسم السابق.

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

يصور الجدول 1 النتائج المحتملة عندما تحاول أداة الدمج دمج جميع التصنيفات في نفس العنصر.

الجدول 1. سلوك الدمج التلقائي للسمة القيم

السمة ذات الأولوية العالية السمة ذات الأولوية المنخفضة النتيجة المدمجة للسمة
بلا قيمة بلا قيمة بلا قيمة (استخدام القيمة التلقائية)
القيمة (ب) القيمة (ب)
القيمة "أ" بلا قيمة القيمة "أ"
القيمة "أ" القيمة "أ"
القيمة (ب) خطأ تعارض - يجب إضافة علامة قاعدة دمج

مع ذلك، هناك بعض الحالات التي تتصرف فيها أداة الدمج بشكل مختلف. لتجنب تعارض عمليات الدمج:

  • لا يتم دمج السمات في العنصر <manifest> مطلقًا فسيتم فقط استخدام السمات من بيان الأولوية القصوى.
  • السمة android:required في <uses-feature> و تستخدم عناصر <uses-library> دمج أو إذا كان هناك تعارض، تكون السمة "true" كما يتم دائمًا تضمين الميزة أو المكتبة المطلوبة في بيان واحد.
  • السمات الموجودة في يستخدِم العنصر <uses-sdk> دائمًا القيمة من بيان أولوية أعلى، باستثناء الحالات التالية:
    • عندما يحتوي البيان ذو الأولوية الأقل على قيمة minSdk زادت، فسيحدث خطأ ما لم تطبيق قاعدة دمج overrideLibrary
    • عندما يحتوي البيان ذو الأولوية الأقل على targetSdkVersion أقل، تستخدم أداة الدمج القيمة من البيان ذي الأولوية الأعلى، كما أنها تضيف أي أذونات للنظام اللازمة لضمان استمرار عمل المكتبة المستوردة يعمل بشكل سليم (في الحالات التي يحتوي فيها إصدار Android الأعلى زيادة قيود الأذونات). لمزيد من المعلومات حول هذا الموضوع راجع قسم حول النظام الضمني الأذونات.
  • لا تتم مطابقة العنصر <intent-filter> أبدًا بين البيانات. يتم التعامل مع كل منها على أنه فريد تمت إضافتها إلى العنصر الأصلي المشترك في البيان المدمج.

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

لا تعتمد على قيم السمات التلقائية. لأن جميع السمات الفريدة في العنصر نفسه، مما قد يؤدي إلى نتائج غير متوقعة إذا كان بيان الأولوية الأعلى يعتمد بالفعل على القيمة الافتراضية للسمة دون التصريح عنها. على سبيل المثال، إذا كانت قيمة - لا يعرِّف بيان الأولوية android:launchMode. فإنها تستخدم القيمة التلقائية "standard"، ولكن إذا كانت يشير بيان الأولوية الأقل إلى هذه السمة بقيمة مختلفة، يتم تطبيق القيمة على البيان المدمج، ما يلغي القيمة التلقائية. إِنْتَ أن تحدد بوضوح كل سمة كما تريدها. القيم التلقائية عن كل سمة يتم توثيقها في مرجع البيان.

دمج علامات القواعد

علامة قاعدة الدمج هي سمة XML يمكنك استخدامها للتعبير عن تفضيلك. حول كيفية حلّ تعارضات الدمج أو إزالة العناصر والسمات غير المرغوب فيها يمكنك تطبيق علامة على عنصر بأكمله أو على عناصر محددة فقط السمات في العنصر.

عند دمج ملفي بيان، تبحث أداة الدمج عن هذه العلامات في ذي أولوية أعلى.

تنتمي كل العلامات إلى مساحة الاسم tools في Android، لذا يجب الإفصاح أولاً مساحة الاسم هذه في العنصر <manifest>، كما هو موضح هنا:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    xmlns:tools="http://schemas.android.com/tools">

علامات العُقد

لتطبيق قاعدة دمج على عنصر XML كامل (على جميع السمات في عنصر البيان وجميع علاماته الفرعية)، فاستخدم ما يلي :

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 أقل في تطبيقك أضِف السمة overrideLibrary إلى العلامة <uses-sdk>. يمكن أن تكون قيمة السمة عبارة عن اسم واحد أو أكثر من أسماء حزم المكتبة. (مفصولة بفواصل)، مما يشير إلى المكتبات التي يمكن أن تلغي 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 التي كان بإمكان التطبيقات الوصول إليها مجانًا في السابق مقيَّد بواسطة أذونات النظام في الإصدارات الأحدث من Android.

لتجنُّب إيقاف التطبيقات التي يمكنها الوصول إلى هذه التطبيقات تتيح الإصدارات الحديثة من Android للتطبيقات الاستمرار في الوصول إلى واجهات برمجة التطبيقات هذه بدون الحصول على الإذن إذا تم ضبط targetSdkVersion على قيمة أقل من الإصدار الذي أُضيفت إليه القيود هذا السلوك يمنح التطبيق إذنًا ضمنيًا للسماح بالوصول إلى واجهات برمجة التطبيقات. تم الدمج بيانات لها قيم مختلفة يمكن أن تتأثر targetSdkVersion.

إذا كان ملف البيان ذي الأولوية الأقل يحتوي على قيمة أقل targetSdkVersion الذي يمنحه إذنًا ضمنيًا كما أن البيان ذي الأولوية الأعلى لا يتضمن النتيجة الضمنية نفسها إذن (لأنّ targetSdkVersion تساوي أو أعلى من الإصدار الذي أُضيفت إليه القيد)، فعندئذٍ تستخدم أداة الدمج إضافة إذن النظام بشكل صريح إلى البيان المدمج.

على سبيل المثال، إذا ضبط تطبيقك السمة targetSdkVersion على 4 أو أعلى واستيراد مع ضبط targetSdkVersion على 3 أو أقل، تضيف أداة الدمج WRITE_EXTERNAL_STORAGE الإذن بالوصول إلى البيان المدمج.

يسرد الجدول 2 جميع الأذونات الممكنة التي يمكن إضافتها إلى البيان المدمج:

الجدول 2. قائمة الأذونات التي تتيحها أداة الدمج إضافة إلى البيان المدمج

الإقرارات ذات الأولوية المنخفضة الأذونات التي تمت إضافتها إلى البيان المدمج
targetSdkVersion هو 3 أو أقل WRITE_EXTERNAL_STORAGE، READ_PHONE_STATE
targetSdkVersion هو 15 عامًا أو أقل ويستخدم READ_CONTACTS. READ_CALL_LOG
targetSdkVersion هو 15 عامًا أو أقل ويستخدم WRITE_CONTACTS. WRITE_CALL_LOG

فحص البيان المدمج والعثور على التعارضات

حتى قبل إنشاء تطبيقك، يمكنك الاطلاع على معاينة لما تم دمجه ملف البيان. للاطّلاع على معاينة، اتّبِع الخطوات التالية:

  1. في "استوديو Android"، افتح ملف AndroidManifest.xml.
  2. انقر على علامة التبويب البيان المدمج في أسفل المحرّر.

يُظهر عرض البيان المدمج نتائج البيان المدمج على اليمين ومعلومات حول كل ملف بيان مدمج على اليمين، كما هو موضح في الشكل 2.

العناصر التي تم دمجها من ملفات البيانات ذات الأولوية المنخفضة مميزة بألوان مختلفة على اليسار. المفتاح لكل لون هو محددة ضمن مصادر البيان.

الشكل 2. عرض البيان المدمج.

ملفات البيان التي كانت جزءًا من الإصدار ولكنها لم تساهم في العناصر أو أن يتم إدراجها ضمن ملفات البيان الأخرى.

للاطّلاع على معلومات حول مصدر أحد العناصر، انقر عليه في الجهة اليمنى. وستظهر التفاصيل ضمن سجل الدمج.

في حال حدوث أي تعارضات، ستظهر ضمن أخطاء الدمج مع تقديم توصيات حول كيفية حل التعارض باستخدام دمج علامات القواعد.

تتم طباعة الأخطاء أيضًا في نافذة سجلّ الأحداث. لعرضها، اختَر عرض > نوافذ الأدوات > سجلّ الأحداث:

وللاطّلاع على سجل كامل لشجرة قرارات الدمج، يمكنك العثور على ملف السجل في دليل build/outputs/logs/ للوحدة، باسم manifest-merger-buildVariant-report.txt

دمج السياسات

يمكن أن تطابق أداة دمج البيان كل عنصر XML من ملف بيان واحد منطقيًا. ملف إلى عنصر مطابق في ملف آخر. يتطابق الدمج مع كل عنصر باستخدام مفتاح مطابقة، إما قيمة سمة فريدة (مثل android:name) أو التفرّد الطبيعي للعلامة نفسها (على سبيل المثال، يمكن أن يكون هناك علامة واحدة <supports-screen>).

إذا كان البيانان يحتويان على عنصر XML نفسه، تدمج الأداة العنصرَين معًا باستخدام إحدى سياسات الدمج الثلاث:

دمج
دمج جميع السمات غير المتعارضة في العلامة نفسها ودمجها العناصر الفرعية وفقًا لسياسة الدمج الخاصة بها. إذا كانت هناك أي سمات تتعارض مع بعضها البعض، يجب دمجها معًا باستخدام علامات قاعدة الدمج.
دمج الأطفال فقط
لا تدمج السمات أو تدمجها (احرص على تضمين السمات المقدّمة فقط. باستخدام ملف البيان ذي الأولوية الأعلى) ثم ادمج العناصر الفرعية وفقًا لسياسة الدمج الخاصة بها.
Keep
يمكنك ترك العنصر كما هو وإضافته إلى العنصر الرئيسي الشائع في ملف مدمج. ولا يتم استخدام ذلك إلا عندما يكون من المقبول وجود عدة تعريفات العنصر نفسه.

يسرد الجدول 3 كل نوع عنصر ونوع سياسة الدمج المستخدمة يُستخدَم لتحديد تطابق عنصر بين بيانين:

الجدول 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". تأخذ هذه الخاصية خريطة لأزواج المفتاح/القيمة، كما هو موضح هنا:

Groovy

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}. تتطابق القيمة دائمًا مع القيمة النهائية معرّف التطبيق الخاص بالإصدار الحالي، بما في ذلك التغييرات حسب متغيرات الإصدار. يكون ذلك مفيدًا عندما تريد استخدام مساحة اسم فريدة للمعرّفات مثل إجراء intent، حتى بين صيغ الإصدار.

على سبيل المثال، إذا كان ملف build.gradle يبدو على النحو التالي:

Groovy

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>

لمزيد من المعلومات، يُرجى قراءة اضبط رقم تعريف التطبيق.