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

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

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

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

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

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

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

الشكل 1: عملية دمج ثلاثة ملفات بيان، من الأولوية الأدنى إلى الأولوية القصوى

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

  1. ملف البيان الخاص بتنويعة التصميم

    إذا كانت لديك مجموعات رموز مصدر متعددة لنسخة التطبيق، تكون أولويات البيان على النحو التالي:

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

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

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

  3. ملف بيان من مكتبة مضمّنة

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

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

إشارات إرشادية لتعارضات الدمج

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

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

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

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

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

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

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

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

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

علامة قاعدة الدمج هي سمة 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="mergeOnlyAttributes"
دمج السمات في هذه العلامة فقط، وعدم دمج العناصر المُدمجة

بيان ذو أولوية منخفضة:

<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="mergeOnlyAttributes">
</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. انقر على علامة التبويب ملفات بيان مدمجة (Merged Manifest) في أسفل المحرِّر.

تعرض طريقة العرض "ملفات بيان مدمجة" (Merged Manifest) نتائج ملف البيان المدمج على اليمين ومعلومات عن كل ملف بيان مدمج على اليسار، كما هو موضّح في الشكل 2.

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

طريقة عرض &quot;ملفات البيان المدمجة&quot;
الشكل 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. تأخذ هذه السمة خريطة لأزواج المفاتيح والقيم، كما هو موضح هنا:

أنيق

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 يبدو على النحو التالي:

أنيق

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>

وتكون نتيجة البيان عند إنشاء صيغة المنتج "المجانية" على النحو التالي:

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

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