Auf dieser Seite wird beschrieben, wie das Zusammenführen von Manifesten funktioniert und wie Sie Zusammenführungseinstellungen anwenden können, um Zusammenführungskonflikte zu beheben. Eine Einführung in die App-Manifestdatei finden Sie in der Übersicht über das App-Manifest.
Mehrere Manifestdateien zusammenführen
Ihre APK- oder Android App Bundle-Datei kann nur eine AndroidManifest.xml-Datei enthalten. Ihr Android Studio-Projekt kann jedoch mehrere Manifestdateien enthalten, die vom Haupt-Source-Set, von Build-Varianten und von importierten Bibliotheken bereitgestellt werden. Beim Erstellen Ihrer App werden alle Manifestdateien im Gradle-Build zu einer einzigen Manifestdatei zusammengeführt, die in Ihrer App verpackt wird.
Das Manifest-Merger-Tool kombiniert alle XML-Elemente aus jeder Datei. Dabei werden Heuristiken für die Zusammenführung und die von Ihnen mit speziellen XML-Attributen definierten Zusammenführungseinstellungen berücksichtigt.
Prioritäten zusammenführen
Das Merger-Tool kombiniert alle Manifestdateien nacheinander in einer Datei, basierend auf der Priorität der einzelnen Manifestdateien. Wenn Sie beispielsweise drei Manifestdateien haben, wird das Manifest mit der niedrigsten Priorität mit dem Manifest mit der nächsthöheren Priorität zusammengeführt. Dieses wird dann mit dem Manifest mit der höchsten Priorität zusammengeführt, wie in Abbildung 1 dargestellt.
Es gibt drei grundlegende Typen von Manifestdateien, die miteinander zusammengeführt werden können. Ihre Zusammenführungsprioritäten sind wie folgt (höchste Priorität zuerst):
Manifestdatei für Ihre Build-Variante
Wenn Sie mehrere Source-Sets für Ihre Variante haben, sind die Manifestprioritäten wie folgt:
- Build-Varianten-Manifest (z. B.
src/demoDebug/) - Build-Typ-Manifest (z. B.
src/debug/) Manifest der Produktvariante (z. B.
src/demo/)Wenn Sie Flavor-Dimensionen verwenden, entsprechen die Manifestprioritäten der Reihenfolge, in der die einzelnen Dimensionen im Attribut
flavorDimensionsaufgeführt sind (die erste hat die höchste Priorität).
- Build-Varianten-Manifest (z. B.
Hauptmanifestdatei für das App-Modul
Manifestdatei aus einer eingebundenen Bibliothek
Wenn Sie mehrere Bibliotheken haben, entspricht die Priorität ihrer Manifeste der Reihenfolge, in der sie im Gradle-Block
dependenciesangezeigt werden.
Beispielsweise wird ein Bibliotheksmanifest mit dem Hauptmanifest zusammengeführt und das Hauptmanifest dann mit dem Build-Variantenmanifest. Beachten Sie, dass dies dieselben Zusammenführungsprioritäten für alle Source-Sets sind, wie unter Mit Source-Sets erstellen beschrieben.
Heuristik für Zusammenführungskonflikte
Das Merger-Tool kann jedes XML-Element aus einem Manifest logisch mit einem entsprechenden Element in einem anderen Manifest abgleichen. Weitere Informationen zur Funktionsweise des Abgleichs finden Sie im vorherigen Abschnitt unter Zusammenführungsprioritäten.
Wenn ein Element aus dem Manifest mit niedrigerer Priorität mit keinem Element im Manifest mit höherer Priorität übereinstimmt, wird es dem zusammengeführten Manifest hinzugefügt. Wenn jedoch ein übereinstimmendes Element vorhanden ist, versucht das Merger-Tool, alle Attribute der einzelnen Elemente im selben Element zu kombinieren. Wenn das Tool feststellt, dass beide Manifeste dasselbe Attribut mit unterschiedlichen Werten enthalten, tritt ein Zusammenführungskonflikt auf.
In Tabelle 1 sind die möglichen Ergebnisse aufgeführt, wenn das Merger-Tool versucht, alle Attribute in demselben Element zu kombinieren.
Tabelle 1. Standardmäßiges Zusammenführungsverhalten für Attributwerte
| Attribut mit hoher Priorität | Attribut mit niedriger Priorität | Zusammengeführtes Ergebnis des Attributs |
|---|---|---|
| Kein Wert | Kein Wert | Kein Wert (Standardwert verwenden) |
| Wert B | Wert B | |
| Wert A | Kein Wert | Wert A |
| Wert A | Wert A | |
| Wert B | Konfliktfehler: Sie müssen eine Zusammenführungsregel-Markierung hinzufügen. |
In einigen Situationen verhält sich das Merger-Tool jedoch anders, um Zusammenführungskonflikte zu vermeiden:
- Attribute im
<manifest>-Element werden nie zusammengeführt. Es werden nur die Attribute aus dem Manifest mit der höchsten Priorität verwendet. - Das Attribut
android:requiredin den Elementen<uses-feature>und<uses-library>verwendet eine OR-Zusammenführung. Bei einem Konflikt wird"true"angewendet und das Feature oder die Bibliothek, die von einem Manifest benötigt wird, wird immer einbezogen. - Attribute im
<uses-sdk>-Element verwenden immer den Wert aus dem Manifest mit der höheren Priorität, außer in den folgenden Situationen:- Wenn das Manifest mit niedrigerer Priorität einen höheren
minSdk-Wert hat, tritt ein Fehler auf, es sei denn, Sie wenden die ZusammenführungsregeloverrideLibraryan. - Wenn das Manifest mit niedrigerer Priorität einen niedrigeren
targetSdkVersion-Wert hat, verwendet das Merger-Tool den Wert aus dem Manifest mit höherer Priorität. Außerdem werden alle Systemberechtigungen hinzugefügt, die erforderlich sind, damit die importierte Bibliothek weiterhin ordnungsgemäß funktioniert (für Fälle, in denen die höhere Android-Version strengere Berechtigungseinschränkungen hat). Weitere Informationen zu diesem Verhalten finden Sie im Abschnitt zu impliziten Systemberechtigungen.
- Wenn das Manifest mit niedrigerer Priorität einen höheren
- Das Element
<intent-filter>wird nie zwischen Manifesten abgeglichen. Jedes wird als eindeutig behandelt und dem gemeinsamen übergeordneten Element im zusammengeführten Manifest hinzugefügt.
Bei allen anderen Konflikten zwischen Attributen erhalten Sie eine Fehlermeldung und müssen dem Merger-Tool mitteilen, wie der Konflikt behoben werden soll. Dazu fügen Sie der Manifestdatei mit höherer Priorität ein spezielles Attribut hinzu. Weitere Informationen finden Sie im folgenden Abschnitt zu Markierungen für Zusammenführungsregeln.
Regelmarkierungen zusammenführen
Eine Zusammenführungsregel-Markierung ist ein XML-Attribut, mit dem Sie Ihre Präferenz für die Lösung von Zusammenführungskonflikten oder das Entfernen unerwünschter Elemente und Attribute angeben können. Sie können eine Markierung entweder auf ein ganzes Element oder nur auf bestimmte Attribute in einem Element anwenden.
Beim Zusammenführen von zwei Manifestdateien sucht das Merger-Tool in der Manifestdatei mit höherer Priorität nach diesen Markierungen.
Alle Markierungen gehören zum Android-Namespace tools. Sie müssen diesen Namespace daher zuerst im <manifest>-Element deklarieren, wie hier gezeigt:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp" xmlns:tools="http://schemas.android.com/tools">
Knotenmarkierungen
Wenn Sie eine Zusammenführungsregel auf ein ganzes XML-Element (auf alle Attribute in einem bestimmten Manifestelement und auf alle untergeordneten Tags) anwenden möchten, verwenden Sie die folgenden Attribute:
tools:node="merge"- Alle Attribute in diesem Tag und alle verschachtelten Elemente zusammenführen, wenn es keine Konflikte gibt, die die Heuristik für Zusammenführungskonflikte verwenden. Das ist das Standardverhalten für Elemente.
Manifest mit niedriger Priorität:
<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>
Manifest mit hoher Priorität:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" tools:node="merge"> </activity>
Ergebnis des zusammengeführten Manifests:
<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"- Führen Sie nur Attribute in diesem Tag zusammen, keine verschachtelten Elemente.
Manifest mit niedriger Priorität:
<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>
Manifest mit hoher Priorität:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" tools:node="mergeOnlyAttributes"> </activity>
Ergebnis des zusammengeführten Manifests:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" android:windowSoftInputMode="stateUnchanged"> </activity>
tools:node="remove"- Entfernen Sie dieses Element aus dem zusammengeführten Manifest. Wird verwendet, wenn Sie in Ihrem zusammengeführten Manifest ein Element finden, das Sie nicht benötigen und das von einer Manifestdatei mit niedrigerer Priorität bereitgestellt wurde, die Sie nicht kontrollieren können (z. B. eine importierte Bibliothek).
Manifest mit niedriger Priorität:
<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>
Manifest mit hoher Priorität:
<activity-alias android:name="com.example.alias"> <meta-data android:name="cow" tools:node="remove"/> </activity-alias>
Ergebnis des zusammengeführten Manifests:
<activity-alias android:name="com.example.alias"> <meta-data android:name="duck" android:value="@string/quack"/> </activity-alias>
tools:node="removeAll"- Ähnlich wie
tools:node="remove", aber es werden alle Elemente entfernt, die diesem Elementtyp entsprechen (innerhalb desselben übergeordneten Elements).Manifest mit niedriger Priorität:
<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>
Manifest mit hoher Priorität:
<activity-alias android:name="com.example.alias"> <meta-data tools:node="removeAll"/> </activity-alias>
Ergebnis des zusammengeführten Manifests:
<activity-alias android:name="com.example.alias"> </activity-alias> tools:node="replace"- Ersetzen Sie das Element mit niedrigerer Priorität vollständig. Das heißt, wenn es ein übereinstimmendes Element im Manifest mit niedrigerer Priorität gibt, wird es ignoriert und dieses Element wird genau so verwendet, wie es in diesem Manifest erscheint.
Manifest mit niedriger Priorität:
<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>
Manifest mit hoher Priorität:
<activity-alias android:name="com.example.alias" tools:node="replace"> <meta-data android:name="fox" android:value="@string/dingeringeding"/> </activity-alias>
Ergebnis des zusammengeführten Manifests:
<activity-alias android:name="com.example.alias"> <meta-data android:name="fox" android:value="@string/dingeringeding"/> </activity-alias>
tools:node="strict"- Es wird immer dann ein Build-Fehler generiert, wenn dieses Element im Manifest mit niedrigerer Priorität nicht genau mit dem Element im Manifest mit höherer Priorität übereinstimmt (es sei denn, das Problem wird durch andere Markierungen für Zusammenführungsregeln behoben). Dadurch werden die Heuristiken für Zusammenführungskonflikte überschrieben. Wenn das Manifest mit niedrigerer Priorität beispielsweise ein zusätzliches Attribut enthält, schlägt der Build fehl. Beim Standardverhalten wird das zusätzliche Attribut dagegen dem zusammengeführten Manifest hinzugefügt.
Manifest mit niedriger Priorität:
<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>
Manifest mit hoher Priorität:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" tools:node="strict"> </activity>
Dies führt zu einem Fehler beim Zusammenführen des Manifests. Die beiden Manifestelemente dürfen sich im strikten Modus überhaupt nicht unterscheiden. Sie müssen andere Markierungen für Zusammenführungsregeln anwenden, um diese Unterschiede zu beheben. (Ohne
tools:node="strict"können diese beiden Dateien ohne Fehler zusammengeführt werden, wie im Beispiel fürtools:node="merge"gezeigt.)
Attributmarkierungen
Wenn Sie eine Zusammenführungsregel stattdessen nur auf bestimmte Attribute in einem Manifest-Tag anwenden möchten, verwenden Sie die folgenden Attribute. Jedes Attribut akzeptiert einen oder mehrere Attributnamen (einschließlich des Attribut-Namespace), die durch Kommas getrennt sind.
tools:remove="attr, ..."- Entfernt die angegebenen Attribute aus dem zusammengeführten Manifest.
Wird verwendet, wenn die Manifestdatei mit niedrigerer Priorität diese Attribute enthält und Sie sicherstellen möchten, dass sie nicht in das zusammengeführte Manifest aufgenommen werden.
Manifest mit niedriger Priorität:
<activity android:name="com.example.ActivityOne" android:windowSoftInputMode="stateUnchanged">
Manifest mit hoher Priorität:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" tools:remove="android:windowSoftInputMode">
Ergebnis des zusammengeführten Manifests:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait">
tools:replace="attr, ..."- Ersetzt die angegebenen Attribute im Manifest mit niedrigerer Priorität durch die Attribute aus diesem Manifest. Mit anderen Worten: Behalte immer die Werte des Manifests mit der höheren Priorität bei.
Manifest mit niedriger Priorität:
<activity android:name="com.example.ActivityOne" android:theme="@oldtheme" android:exported="false" android:windowSoftInputMode="stateUnchanged">
Manifest mit hoher Priorität:
<activity android:name="com.example.ActivityOne" android:theme="@newtheme" android:exported="true" android:screenOrientation="portrait" tools:replace="android:theme,android:exported">
Ergebnis des zusammengeführten Manifests:
<activity android:name="com.example.ActivityOne" android:theme="@newtheme" android:exported="true" android:screenOrientation="portrait" android:windowSoftInputMode="stateUnchanged">
tools:strict="attr, ..."- Generiert einen Build-Fehler, wenn diese Attribute im Manifest mit niedrigerer Priorität nicht genau mit den Attributen im Manifest mit höherer Priorität übereinstimmen. Dies ist das Standardverhalten für alle Attribute, mit Ausnahme derer mit speziellem Verhalten, wie in den Heuristiken für Zusammenführungskonflikte beschrieben.
Manifest mit niedriger Priorität:
<activity android:name="com.example.ActivityOne" android:screenOrientation="landscape"> </activity>
Manifest mit hoher Priorität:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" tools:strict="android:screenOrientation"> </activity>
Dies führt zu einem Fehler beim Zusammenführen des Manifests. Sie müssen andere Zusammenführungsregel-Markierungen anwenden, um den Konflikt zu lösen. Dies ist das Standardverhalten. Das gleiche Ergebnis wird also erzielt, wenn Sie
tools:strict="screenOrientation"explizit hinzufügen.
Sie können auch mehrere Markierungen auf ein Element anwenden, wie im folgenden Beispiel gezeigt:
Manifest mit niedriger Priorität:
<activity android:name="com.example.ActivityOne" android:theme="@oldtheme" android:exported="false" android:allowTaskReparenting="true" android:windowSoftInputMode="stateUnchanged">
Manifest mit hoher Priorität:
<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">
Ergebnis des zusammengeführten Manifests:
<activity android:name="com.example.ActivityOne" android:theme="@newtheme" android:exported="true" android:allowTaskReparenting="true" android:screenOrientation="portrait">
Markierungsauswahl
Wenn Sie die Zusammenführungsregel-Markierungen nur auf eine bestimmte importierte Bibliothek anwenden möchten, fügen Sie das Attribut tools:selector mit dem Namen des Bibliothekspakets hinzu.
Im folgenden Manifest wird die Zusammenführungsregel remove beispielsweise nur angewendet, wenn die Manifestdatei mit niedrigerer Priorität aus der Bibliothek com.example.lib1 stammt:
<permission android:name="permissionOne" tools:node="remove" tools:selector="com.example.lib1">
Wenn das Manifest mit niedrigerer Priorität aus einer anderen Quelle stammt, wird die Zusammenführungsregel remove ignoriert.
<uses-sdk> für importierte Bibliotheken überschreiben
Wenn Sie eine Bibliothek mit einem minSdk-Wert importieren, der höher als der der Hauptmanifestdatei ist, tritt standardmäßig ein Fehler auf und die Bibliothek kann nicht importiert werden.
Wenn Sie möchten, dass das Merger-Tool diesen Konflikt ignoriert und die Bibliothek importiert, während der niedrigere minSdk-Wert Ihrer App beibehalten wird, fügen Sie dem <uses-sdk>-Tag das Attribut overrideLibrary hinzu.
Der Attributwert kann ein oder mehrere durch Kommas getrennte Bibliothekspaketnamen sein, die die Bibliotheken angeben, die das minSdk des Hauptmanifests überschreiben können.
Wenn im Hauptmanifest Ihrer App beispielsweise overrideLibrary so angewendet wird:
<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"/> ...
Dann kann das folgende Manifest ohne Fehler bezüglich des <uses-sdk>-Tags zusammengeführt werden und das zusammengeführte Manifest behält minSdk="2" aus dem App-Manifest bei.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.lib1"> <uses-sdk android:minSdk="4" /> ...
Implizite Systemberechtigungen
Einige Android APIs, auf die Apps früher frei zugreifen konnten, wurden in neueren Android-Versionen durch Systemberechtigungen eingeschränkt.
Damit Apps, die Zugriff auf diese APIs erwarten, nicht fehlerhaft funktionieren, können Apps in den aktuellen Android-Versionen weiterhin ohne die Berechtigung auf diese APIs zugreifen, wenn die targetSdkVersion auf einen Wert festgelegt ist, der niedriger ist als die Version, in der die Einschränkung hinzugefügt wurde. Dadurch erhält die App eine implizite Berechtigung, die den Zugriff auf die APIs ermöglicht. Die zusammengeführten Manifeste, die unterschiedliche Werte für targetSdkVersion haben, können betroffen sein.
Wenn die Manifestdatei mit niedrigerer Priorität einen niedrigeren Wert für targetSdkVersion hat, der ihr eine implizite Berechtigung gewährt, und das Manifest mit höherer Priorität nicht dieselbe implizite Berechtigung hat (weil sein targetSdkVersion gleich oder höher als die Version ist, in der die Einschränkung hinzugefügt wurde), fügt das Merger-Tool dem zusammengeführten Manifest explizit die Systemberechtigung hinzu.
Wenn deine App beispielsweise targetSdkVersion auf 4 oder höher setzt und eine Bibliothek importiert, bei der targetSdkVersion auf 3 oder niedriger gesetzt ist, fügt das Merger-Tool dem zusammengeführten Manifest die Berechtigung WRITE_EXTERNAL_STORAGE hinzu.
In Tabelle 2 sind alle möglichen Berechtigungen aufgeführt, die Ihrem zusammengeführten Manifest hinzugefügt werden können:
Tabelle 2. Liste der Berechtigungen, die das Merger-Tool dem zusammengeführten Manifest hinzufügen kann
| Manifestdeklarationen mit niedrigerer Priorität | Dem zusammengeführten Manifest hinzugefügte Berechtigungen |
|---|---|
targetSdkVersion ist 3 oder niedriger |
WRITE_EXTERNAL_STORAGE, READ_PHONE_STATE |
targetSdkVersion ist 15 oder niedriger und verwendet READ_CONTACTS |
READ_CALL_LOG |
targetSdkVersion ist 15 oder niedriger und verwendet WRITE_CONTACTS |
WRITE_CALL_LOG |
Zusammengeführtes Manifest prüfen und Konflikte finden
Noch bevor Sie Ihre App erstellen, können Sie sich eine Vorschau des zusammengeführten Manifests ansehen. So rufen Sie eine Vorschau auf:
- Öffnen Sie in Android Studio die Datei
AndroidManifest.xml. - Klicken Sie unten im Editor auf den Tab Merged Manifest (Zusammengeführtes Manifest).
In der Ansicht „Zusammengeführtes Manifest“ werden links die Ergebnisse des zusammengeführten Manifests und rechts Informationen zu jeder zusammengeführten Manifestdatei angezeigt (siehe Abbildung 2).
Die Elemente, die aus Manifestdateien mit niedrigerer Priorität zusammengeführt wurden, sind links in verschiedenen Farben hervorgehoben. Der Schlüssel für jede Farbe wird unter Manifestquellen angegeben.
Manifestdateien, die Teil des Builds waren, aber keine Elemente oder Attribute beigetragen haben, werden unter Andere Manifestdateien aufgeführt.
Wenn Sie Informationen zur Herkunft eines Elements sehen möchten, klicken Sie im linken Bereich darauf. Die Details werden dann unter Zusammenführungsprotokoll angezeigt.
Wenn Konflikte auftreten, werden sie unter Zusammenführungsfehler mit einer Empfehlung zur Lösung des Konflikts mithilfe von Zusammenführungsregel-Markierungen angezeigt.
Die Fehler werden auch im Fenster Ereignisprotokoll angezeigt. Wählen Sie View > Toolfenster > Ereignisprotokoll aus, um sie aufzurufen.
Ein vollständiges Protokoll des Zusammenführungs-Entscheidungsbaums finden Sie im Verzeichnis build/outputs/logs/ Ihres Moduls in der Protokolldatei manifest-merger-buildVariant-report.txt.
Richtlinien zusammenführen
Das Merger-Tool für Manifeste kann jedes XML-Element aus einer Manifestdatei logisch einem entsprechenden Element in einer anderen Datei zuordnen. Die Zusammenführung gleicht jedes Element mithilfe eines Abgleichschlüssels ab, entweder mit einem eindeutigen Attributwert (z. B. android:name) oder mit der natürlichen Eindeutigkeit des Tags selbst (z. B. kann es nur ein <supports-screen>-Element geben).
Wenn zwei Manifeste dasselbe XML-Element enthalten, werden die beiden Elemente mit einer der folgenden drei Zusammenführungsrichtlinien zusammengeführt:
- Zusammenführen
- Kombinieren Sie alle nicht in Konflikt stehenden Attribute im selben Tag und führen Sie untergeordnete Elemente gemäß der jeweiligen Zusammenführungsrichtlinie zusammen. Wenn Attribute miteinander in Konflikt stehen, führen Sie sie mit den Markierungen für Zusammenführungsregeln zusammen.
- Nur untergeordnete Elemente zusammenführen
- Die Attribute werden nicht kombiniert oder zusammengeführt. Es werden nur die Attribute aus der Manifestdatei mit der höchsten Priorität beibehalten. Untergeordnete Elemente werden gemäß ihrer Zusammenführungsrichtlinie zusammengeführt.
- Notizen
- Lassen Sie das Element unverändert und fügen Sie es dem gemeinsamen übergeordneten Element in der zusammengeführten Datei hinzu. Dies wird nur verwendet, wenn es akzeptabel ist, dass mehrere Deklarationen desselben Elements vorhanden sind.
In Tabelle 3 sind die einzelnen Elementtypen, die Art der verwendeten Zusammenführungsrichtlinie und der Schlüssel aufgeführt, mit dem eine Elementübereinstimmung zwischen zwei Manifesten ermittelt wird:
Tabelle 3 Richtlinien für das Zusammenführen von Manifestelementen und Abgleichschlüssel
| Element | Zusammenführungsrichtlinie | Abgleichsschlüssel |
|---|---|---|
<action>
|
Zusammenführen | android:name Attribut
|
<activity>
|
Zusammenführen | android:name Attribut
|
<application>
|
Zusammenführen | Es gibt nur einen pro <manifest>.
|
<category>
|
Zusammenführen | android:name Attribut
|
<data>
|
Zusammenführen | Es gibt nur einen pro <intent-filter>.
|
<grant-uri-permission>
|
Zusammenführen | Es gibt nur einen pro <provider>.
|
<instrumentation>
|
Zusammenführen | android:name Attribut
|
<intent-filter>
|
Notizen | Keine Übereinstimmung; mehrere Deklarationen innerhalb des übergeordneten Elements sind zulässig. |
<manifest>
|
Nur untergeordnete Elemente zusammenführen | Es gibt nur eine pro Datei. |
<meta-data>
|
Zusammenführen | android:name Attribut
|
<path-permission>
|
Zusammenführen | Es gibt nur einen pro <provider>.
|
<permission-group>
|
Zusammenführen | android:name Attribut
|
<permission>
|
Zusammenführen | android:name Attribut
|
<permission-tree>
|
Zusammenführen | android:name Attribut
|
<provider>
|
Zusammenführen | android:name Attribut
|
<receiver>
|
Zusammenführen | android:name Attribut
|
<screen>
|
Zusammenführen | android:screenSize Attribut
|
<service>
|
Zusammenführen | android:name Attribut
|
<supports-gl-texture>
|
Zusammenführen | android:name Attribut
|
<supports-screen>
|
Zusammenführen | Es gibt nur einen pro <manifest>.
|
<uses-configuration>
|
Zusammenführen | Es gibt nur einen pro <manifest>.
|
<uses-feature>
|
Zusammenführen | Attribut android:name (wenn nicht vorhanden, dann Attribut android:glEsVersion)
|
<uses-library>
|
Zusammenführen | android:name Attribut
|
<uses-permission>
|
Zusammenführen | android:name Attribut
|
<uses-sdk>
|
Zusammenführen | Es gibt nur einen pro <manifest>.
|
| Benutzerdefinierte Elemente | Zusammenführen | Keine Übereinstimmung; diese sind dem Merger-Tool unbekannt und werden immer in das zusammengeführte Manifest aufgenommen. |
Build-Variablen in Manifest einfügen
Wenn Sie Variablen, die in Ihrer build.gradle-Datei definiert sind, in Ihre AndroidManifest.xml-Datei einfügen müssen, können Sie dazu das Attribut manifestPlaceholders verwenden. Diese Property verwendet eine Zuordnung von Schlüssel/Wert-Paaren, wie hier gezeigt:
Groovy
android { defaultConfig { manifestPlaceholders = [hostName:"www.example.com"] } ... }
Kotlin
android { defaultConfig { manifestPlaceholders["hostName"] = "www.example.com" } ... }
Anschließend können Sie einen der Platzhalter als Attributwert in die Manifestdatei einfügen:
<intent-filter ... >
<data android:scheme="https" android:host="${hostName}" ... />
...
</intent-filter>
Standardmäßig stellen die Build-Tools auch die Anwendungs-ID Ihrer App im Platzhalter ${applicationId} bereit. Der Wert entspricht immer der endgültigen Anwendungs-ID für den aktuellen Build, einschließlich Änderungen durch Build-Varianten.
Das ist nützlich, wenn Sie einen eindeutigen Namespace für Kennungen wie eine Intent-Aktion verwenden möchten, auch zwischen Ihren Build-Varianten.
Wenn Ihre build.gradle-Datei beispielsweise so aussieht:
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" } } }
Anschließend können Sie die Anwendungs-ID so in Ihr Manifest einfügen:
<intent-filter ... >
<action android:name="${applicationId}.TRANSMOGRIFY" />
...
</intent-filter>
Das Manifest-Ergebnis beim Erstellen der Produktvariante „free“ sieht so aus:
<intent-filter ... >
<action android:name="com.example.myapp.free.TRANSMOGRIFY" />
...
</intent-filter>
Weitere Informationen finden Sie unter Anwendungs-ID festlegen.