Auf dieser Seite wird beschrieben, wie Manifestzusammenführung funktioniert und wie Sie die Zusammenführung anwenden können. Einstellungen für Zusammenführungskonflikte zu lösen. Für eine Einführung in die App Manifestdatei, siehe Übersicht über das App-Manifest.
Mehrere Manifestdateien zusammenführen
Dein APK oder Android App Bundle darf nur eine Datei enthalten
AndroidManifest.xml
-Datei, aber Ihr Android Studio-Projekt enthält möglicherweise
Manifestdateien, die vom Hauptquellensatz, Build-Varianten und importierten
Bibliotheken. Beim Erstellen Ihrer App wird der Gradle-Build zusammengeführt.
alle Manifestdateien in einer
einzelnen Manifestdatei packen,
in Ihre App einbinden.
Das Manifest-Merger-Tool kombiniert alle XML-Elemente aus jeder Datei wie folgt: Heuristiken zusammenführen und die von Ihnen definierten Zusammenführungseinstellungen befolgen mit speziellen XML-Attributen.
Tipp:Verwenden Sie das zusammengeführte Manifest. ansehen, wie im folgenden Abschnitt beschrieben, können Sie sich eine Vorschau der Ergebnisse des zusammengeführten Manifests ansehen und Konflikte erkennen. Fehler.
Prioritäten zusammenführen
Das Merger-Tool führt alle Manifestdateien in einer Datei zusammen. aufeinanderfolgen, basierend auf der Priorität jeder Manifestdatei. Wenn Sie beispielsweise drei Manifestdateien ist, wird das Manifest mit der niedrigsten Priorität in das das Manifest mit der nächsthöheren Priorität, das dann in das Manifest mit der höchsten Priorität wie in Abbildung 1 dargestellt.
Es gibt drei grundlegende Arten von Manifestdateien, die in jeder Manifestdatei zusammengeführt werden können. andere, und ihre Zusammenführungsprioritäten lauten wie folgt (höchste Priorität zuerst):
- Manifestdatei für dein
Build-Variante
Wenn Sie mehrere Quellsätze für Ihre Variante haben, Manifest-Prioritäten lauten wie folgt:
- Build-Variantenmanifest (z. B.
src/demoDebug/
) - Build-Typmanifest (z. B.
src/debug/
) - Produkt-Flavor-Manifest (z. B.
src/demo/
)Wenn Sie Flavor-Dimensionen verwenden, der Reihenfolge entsprechen, in der die einzelnen Dimensionen im
flavorDimensions
-Attribut (erstes Attribut ist höchste Priorität).
- Build-Variantenmanifest (z. B.
- Hauptmanifestdatei für das App-Modul
- Manifestdatei aus einer enthaltenen Bibliothek
Wenn Sie mehrere Bibliotheken haben, stimmen deren Manifestprioritäten überein Die Reihenfolge, in der sie in deinem Gradle-Tool angezeigt werden
dependencies
Block.
Beispiel: Ein Bibliotheksmanifest wird mit dem Hauptmanifest zusammengeführt, dann wird das Hauptmanifest das Manifest mit dem Build-Variantenmanifest zusammengeführt. Hierbei handelt es sich um dieselben die Prioritäten für alle Quellsätze wie im Abschnitt Builds mit Quellsätzen durchführen
Wichtig: Erstellen Sie Konfigurationen aus der
build.gradle
-Datei alle entsprechenden Attribute im
Manifestdatei zusammengeführt. Beispiel: Der Parameter
minSdk
von build.gradle
oder
build.gradle.kts
-Datei überschreibt das übereinstimmende Attribut in der
<uses-sdk>
Manifest-Element enthält. Um Verwechslungen zu vermeiden,
<uses-sdk>
-Element und definieren diese Eigenschaften nur im
build.gradle
-Datei. Weitere Informationen finden Sie unter
Konfigurieren Sie Ihren Build.
Konfliktheuristiken zusammenführen
Das Fusionstool kann jedes XML-Element logisch von einem Manifest mit einem in einem anderen Manifest. Weitere Informationen zum Abgleich finden Sie unter Prioritäten für die Zusammenführung im vorherigen Abschnitt.
Wenn ein Element aus dem Manifest mit niedrigerer Priorität mit keinem Element in das Manifest mit höherer Priorität und wird es dem zusammengeführten Manifest hinzugefügt. Sie können jedoch gibt es ein passendes Element, versucht das Zusammenführungstool, aus allen Attributen in dasselbe Element. Wenn das Tool feststellt, dass sowohl enthalten Manifeste dasselbe Attribut mit unterschiedlichen Werten. kann es zu Konflikten kommen.
In Tabelle 1 sind die möglichen Ergebnisse dargestellt, wenn das Fusionstool versucht, in dasselbe Element zugewiesen haben.
Attribut mit hoher Priorität | Attribut mit niedriger Priorität | Zusammengeführtes Ergebnis des Attributs |
---|---|---|
Gar keinen Mehrwert | Gar keinen Mehrwert | Kein Wert (Standardwert verwenden) |
Wert B | Wert B | |
Wert A | Gar keinen Mehrwert | Wert A |
Wert A | Wert A | |
Wert B | Konfliktfehler: Sie müssen einen Markierung für die Zusammenführungsregel. |
Es gibt jedoch einige Situationen, in denen sich das Tool zur Zusammenführung anders verhält. um Zusammenführungskonflikte zu vermeiden:
- Attribute im
<manifest>
-Element werden niemals zusammengeführt zusammen; werden nur die Attribute aus dem Manifest mit der höchsten Priorität verwendet. - Das Attribut
android:required
in der <ph type="x-smartling-placeholder"></ph><uses-feature>
und <ph type="x-smartling-placeholder"></ph><uses-library>
-Elemente verwenden eine OR-Zusammenführung. Bei einem Konflikt wird"true"
angewendet und die für ein Manifest erforderliche Funktion oder Bibliothek ist immer enthalten. - Attribute in der
Das
<uses-sdk>
-Element verwendet immer den Wert aus dem eine höhere Priorität haben, mit Ausnahme der folgenden Situationen: <ph type="x-smartling-placeholder">- </ph>
- Wenn das Manifest mit niedrigerer Priorität einen
minSdk
-Wert hat höher ist, tritt ein Fehler auf, es sei denn, Sie anwendenoverrideLibrary
Zusammenführungsregel. - Wenn das Manifest mit niedrigerer Priorität ein
targetSdkVersion
hat niedriger ist, verwendet das Merge-Tool den Wert aus dem Manifest mit höherer Priorität entfernt. Außerdem werden Systemberechtigungen hinzugefügt, die erforderlich sind, damit die importierte Bibliothek ordnungsgemäß funktioniert, wenn die höhere Android-Version erhöhte Berechtigungsbeschränkungen). Weitere Informationen finden Sie im Abschnitt zum impliziten System Berechtigungen
- Wenn das Manifest mit niedrigerer Priorität einen
- Das
<intent-filter>
-Element stimmt nicht überein zwischen Manifests. Jede wird als einzigartig behandelt dem gemeinsamen übergeordneten Element im zusammengeführten Manifest hinzugefügt.
Bei allen anderen Konflikten zwischen Attributen erhalten Sie eine Fehlermeldung und müssen weisen Sie das Fusionstool an, wie es lösen soll, indem Sie ein spezielles Attribut in die Manifestdatei mit höherer Priorität. Im folgenden Abschnitt finden Sie Regelmarkierungen zusammenführen.
Sie sollten nicht von Standardattributwerten abhängig sein. Weil alle
eindeutige Attribute im selben Element kombiniert werden, kann dies dazu führen,
zu unerwarteten Ergebnissen, wenn das Manifest mit höherer Priorität
Standardwert eines Attributs, ohne es zu deklarieren. Wenn beispielsweise die höhere
Das Prioritätsmanifest deklariert android:launchMode
nicht.
wird der Standardwert "standard"
verwendet.
In Manifest mit niedrigerer Priorität wird dieses Attribut mit einem anderen Wert deklariert, der
wird auf das zusammengeführte Manifest angewendet, wodurch der Standardwert überschrieben wird. Ich
sollten Sie jedes Attribut explizit so definieren, wie Sie es möchten. Standardwerte
sind in den
Manifestreferenz.
Regelmarkierungen zusammenführen
Eine Zusammenführungsregelmarkierung ist ein XML-Attribut, mit dem Sie Ihre Präferenzen angeben können. zum Lösen von Zusammenführungskonflikten oder zum Entfernen unerwünschter Elemente und Attribute. Sie können eine Markierung entweder auf ein ganzes Element oder nur auf bestimmte in einem Element.
Beim Zusammenführen von zwei Manifestdateien sucht das Fusionstool nach diesen Markierungen im eine höhere Priorität haben.
Alle Markierungen gehören zum Android-Namespace tools
, daher müssen Sie zuerst Folgendes deklarieren
Diesen Namespace im <manifest>
-Element, 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
Um eine Zusammenführungsregel auf ein gesamtes XML-Element anzuwenden (auf alle Attribute in einem Manifest-Elements und allen seinen untergeordneten Tags hinzugefügt haben), verwenden Sie Attribute:
tools:node="merge"
- Führen Sie alle Attribute in diesem Tag und alle verschachtelten Elemente zusammen,
keine Konflikte bei der Zusammenführung
Konfliktheuristiken. Dies 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>
Zusammengeführtes Manifest-Ergebnis:
<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"
- Attribute nur in diesem Tag zusammenführen; und führen Sie keine verschachtelten Elemente zusammen.
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="merge-only-attributes"> </activity>
Zusammengeführtes Manifest-Ergebnis:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" android:windowSoftInputMode="stateUnchanged"> </activity>
tools:node="remove"
- Entferne dieses Element aus dem zusammengeführten Manifest. Wird verwendet, wenn
finden Sie in Ihrem zusammengeführten Manifest ein Element, das Sie nicht benötigen.
wurde von einer Manifestdatei mit niedrigerer Priorität bereitgestellt, über die Sie keine Kontrolle haben
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>
Zusammengeführtes Manifest-Ergebnis:
<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"
", es werden aber alle entfernt -Elementen, die mit diesem Elementtyp übereinstimmen (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>
Zusammengeführtes Manifest-Ergebnis:
<activity-alias android:name="com.example.alias"> </activity-alias>
tools:node="replace"
- Das Element mit der niedrigeren Priorität wird vollständig ersetzt. Das heißt, wenn
ein übereinstimmendes Element im Manifest niedrigerer Priorität ist, ignorieren Sie es und verwenden Sie
genau so, 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>
Zusammengeführtes Manifest-Ergebnis:
<activity-alias android:name="com.example.alias"> <meta-data android:name="fox" android:value="@string/dingeringeding"/> </activity-alias>
tools:node="strict"
- Jedes Mal einen Build-Fehler generieren, wenn dieses Element mit niedrigerer Priorität
nicht genau mit dem Element im Manifest mit höherer Priorität übereinstimmt (es sei denn,
durch andere Markierungen für Zusammenführungsregeln aufgelöst. Dadurch wird die Heuristik für Zusammenführungskonflikte überschrieben. Für
Wenn das Manifest mit niedrigerer Priorität
ein zusätzliches Attribut enthält,
Der Build schlägt fehl (während das Standardverhalten
das zusammengeführte Manifest.
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>
Dadurch wird ein Fehler beim Zusammenführen von Manifesten erzeugt. Die beiden Manifestelemente im strikten Modus überhaupt nicht unterschiedlich sein darf. Sie müssen andere Markierungen für Zusammenführungsregeln anwenden. um diese Unterschiede zu beheben. (Ohne
tools:node="strict"
werden diese zwei Dateien können ohne Fehler zusammengeführt werden, wie im Beispiel fürtools:node="merge"
)
Attributmarkierungen
Soll eine Zusammenführungsregel nur auf bestimmte Attribute in einem Manifest-Tag verwenden, verwenden Sie Attribute. Für jedes Attribut können ein oder mehrere Attributnamen (einschließlich der Attribut-Namespace), durch Kommas getrennt.
tools:remove="attr, ..."
- Entfernt die angegebenen Attribute aus dem zusammengeführten Manifest.
Wird verwendet, wenn die Manifestdatei mit niedrigerer Priorität diese enthält
und Sie möchten sicherstellen, dass diese nicht in den zusammengeführten
Manifests.
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">
Zusammengeführtes Manifest-Ergebnis:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait">
tools:replace="attr, ..."
- Die angegebenen Attribute im Manifest mit niedrigerer Priorität ersetzen durch
die aus diesem Manifest stammen. Mit anderen Worten: Behalten Sie immer die
die Werte des Manifests
mit höherer Priorität.
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">
Zusammengeführtes Manifest-Ergebnis:
<activity android:name="com.example.ActivityOne" android:theme="@newtheme" android:exported="true" android:screenOrientation="portrait" android:windowSoftInputMode="stateUnchanged">
tools:strict="attr, ..."
- Jedes Mal einen Build-Fehler generieren, wenn diese Attribute im
Manifest mit niedrigerer Priorität stimmt nicht genau mit den Attributen im
Manifests. Dies ist das Standardverhalten für alle Attribute, mit Ausnahme von
Nutzer mit einem besonderen Verhalten, wie unter Konfliktheuristiken bei Zusammenführungen 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>
Dadurch wird ein Fehler beim Zusammenführen von Manifesten erzeugt. Sie müssen eine andere Zusammenführungsregel anwenden um den Konflikt zu lösen. Das ist die Standardeinstellung. tritt das gleiche Ergebnis auf, wenn Sie
tools:strict="screenOrientation"
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">
Zusammengeführtes Manifest-Ergebnis:
<activity android:name="com.example.ActivityOne" android:theme="@newtheme" android:exported="true" android:allowTaskReparenting="true" android:screenOrientation="portrait">
Markierungsauswahl
Wenn Sie die Markierungen der Zusammenführungsregel nur auf eine bestimmte
importierte Bibliothek das Attribut tools:selector
mit
und den Namen des Bibliothekspakets.
Beispielsweise wird mit dem folgenden Manifest der remove
Die Zusammenführungsregel wird nur angewendet, wenn die Manifestdatei mit der niedrigeren Priorität aus dem
com.example.lib1
-Bibliothek:
<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 der
remove
Zusammenführungsregel wird ignoriert.
Hinweis: Wenn Sie dieses Tag mit einer der Attributmarkierungen verwenden, gilt er für alle in der Markierung angegebenen Attribute.
<uses-sdk> überschreiben für importierte Bibliotheken
Standardmäßig beim Importieren einer Bibliothek mit einem minSdk
-Wert
der höher als die Manifest-Hauptdatei ist, tritt ein Fehler auf
Bibliothek kann nicht importiert werden.
Damit das Fusionstool diesen Konflikt ignoriert und
Bibliothek importieren und gleichzeitig den unteren minSdk
-Wert Ihrer App beibehalten
Wert hinzufügen, fügen Sie dem <uses-sdk>
-Tag das Attribut overrideLibrary
hinzu.
Der Attributwert kann ein oder mehrere Bibliothekspaketnamen sein
(durch Kommas getrennt), um die Bibliotheken anzugeben, die die
minSdk
des Manifests.
Wenn beispielsweise das Hauptmanifest deiner App overrideLibrary
wie hier:
<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 einen Fehler bezüglich
<uses-sdk>
und das zusammengeführte Manifest behält
minSdk="2"
aus dem App-Manifest.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.lib1"> <uses-sdk android:minSdk="4" /> ...
Implizite Systemberechtigungen
Einige Android APIs, die früher für Apps kostenlos zugänglich waren, sind jetzt eingeschränkt durch Systemberechtigungen in der neuesten Android-Versionen.
Um Probleme mit Apps zu vermeiden, die Zugriff darauf erwarten
APIs, die aktuellen Versionen von Android ermöglichen Apps weiterhin den Zugriff auf diese APIs.
ohne die Berechtigung, wenn targetSdkVersion
auf einen niedrigeren Wert festgelegt ist
als die Version, in der die Einschränkung hinzugefügt wurde. Dieses Verhalten
gewährt der App implizit die Berechtigung, auf die APIs zuzugreifen. Die zusammengeführte
Manifeste mit unterschiedlichen Werten
targetSdkVersion
kann betroffen sein.
Wenn die Manifestdatei mit niedrigerer Priorität einen niedrigeren Wert für
targetSdkVersion
, die eine implizite Berechtigung erteilt,
und das Manifest mit höherer Priorität nicht
die gleichen impliziten
Berechtigung (weil der Wert für targetSdkVersion
gleich oder höher ist
als die Version, in der die Einschränkung hinzugefügt wurde),
fügt dem zusammengeführten Manifest die Systemberechtigung explizit hinzu.
Wenn Ihre App beispielsweise targetSdkVersion
auf 4 oder höher festlegt und ein
wenn targetSdkVersion
auf 3 oder niedriger eingestellt ist, fügt das Merge-Tool
WRITE_EXTERNAL_STORAGE
für das zusammengeführte Manifest.
In Tabelle 2 sind alle möglichen Berechtigungen aufgeführt. das dem zusammengeführten Manifest hinzugefügt werden könnte:
Deklarationen des Manifests mit niedrigerer Priorität | Berechtigungen, die dem zusammengeführten Manifest hinzugefügt wurden |
---|---|
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
Schon vor dem Erstellen Ihrer App können Sie sich in einer Vorschau ansehen, was Ihre zusammengeführten Manifests aussieht. So rufen Sie eine Vorschau auf:
- Öffnen Sie die Datei
AndroidManifest.xml
in Android Studio. - Klicken Sie unten im Editor auf den Tab Zusammengeführtes Manifest.
Die Ansicht „Zusammengeführtes Manifest“ zeigt links die Ergebnisse des zusammengeführten Manifests. und Informationen über jede zusammengeführte Manifestdatei auf der rechten Seite, wie in Abbildung 2.
Elemente, die aus Manifestdateien mit niedrigerer Priorität zusammengeführt wurden in verschiedenen Farben hervorgehoben. Der Schlüssel für jede Farbe ist, die unter Manifestquellen angegeben sind.
Manifestdateien, die Teil des Builds waren, aber keine Elemente oder sind unter Andere Manifestdateien aufgeführt.
Wenn Sie links darauf klicken, sehen Sie, woher ein Element stammt und die Details werden unter Zusammenführen von Protokollen angezeigt.
Falls Konflikte auftreten, werden diese unter Fehler zusammenführen aufgeführt. mit einer Empfehlung zur Lösung des Konflikts durch Markierungen für Zusammenführungsregeln.
Die Fehler werden auch im Fenster Ereignisprotokoll ausgegeben. Um sie anzusehen, wählen Sie Ansicht > Tool-Fenster > Ereignisprotokoll
Ein vollständiges Log des zusammengeführten Entscheidungsbaums finden Sie
die Logdatei im Verzeichnis build/outputs/logs/
Ihres Moduls mit dem Namen
manifest-merger-buildVariant-report.txt
.
Richtlinien zusammenführen
Das Tool zur Manifestzusammenführung kann jedes XML-Element aus einem Manifest logisch zuordnen
in ein entsprechendes Element in einer anderen Datei. Bei der Zusammenführung werden die einzelnen Elemente
mit einem Übereinstimmungsschlüssel, einem eindeutigen Attributwert (z. B. android:name
) oder
der natürlichen Eindeutigkeit des Tags selbst (z. B. kann es nur eine
<supports-screen>
-Element).
Wenn zwei Manifeste dasselbe XML-Element haben, Das Tool führt die beiden Elemente mithilfe einer von drei Zusammenführungsrichtlinien zusammen:
- Zusammenführen
- Alle nicht konfliktfreien Attribute im selben Tag kombinieren und zusammenführen untergeordnete Elemente entsprechend ihrer jeweiligen Zusammenführungsrichtlinie. Falls Attribute miteinander in Konflikt stehen, führen Sie sie mit den Markierungen für Zusammenführungsregeln zusammen.
- Nur untergeordnete Elemente zusammenführen
- Attribute nicht kombinieren oder zusammenführen (nur angegebene Attribute beibehalten) nach der Manifest-Datei mit der höchsten Priorität) untergeordnete Elemente entsprechend ihrer Zusammenführungsrichtlinie.
- Notizen
- Das Element unverändert lassen und zum gemeinsamen übergeordneten Element im zusammengeführte Datei. Dieser wird nur verwendet, wenn mehrere -Deklarationen desselben Elements erstellen.
In Tabelle 3 sind die einzelnen Elementtypen, die verwendete Art der Zusammenführungsrichtlinie und Schlüssel, der verwendet wird, um eine Elementübereinstimmung zwischen zwei Manifesten zu bestimmen:
Element | Richtlinie zur Zusammenführung | Übereinstimmungsschlüssel |
---|---|---|
<action>
|
Zusammenführen | Attribut „android:name “
|
<activity>
|
Zusammenführen | Attribut „android:name “
|
<application>
|
Zusammenführen | Es gibt nur einen pro <manifest> .
|
<category>
|
Zusammenführen | Attribut „android:name “
|
<data>
|
Zusammenführen | Es gibt nur einen pro <intent-filter> .
|
<grant-uri-permission>
|
Zusammenführen | Es gibt nur einen pro <provider> .
|
<instrumentation>
|
Zusammenführen | Attribut „android:name “
|
<intent-filter>
|
Notizen | Keine Übereinstimmung; innerhalb des Parent-Elements sind mehrere Deklarationen zulässig. |
<manifest>
|
Nur untergeordnete Elemente zusammenführen | Es gibt nur eine pro Datei. |
<meta-data>
|
Zusammenführen | Attribut „android:name “
|
<path-permission>
|
Zusammenführen | Es gibt nur einen pro <provider> .
|
<permission-group>
|
Zusammenführen | Attribut „android:name “
|
<permission>
|
Zusammenführen | Attribut „android:name “
|
<permission-tree>
|
Zusammenführen | Attribut „android:name “
|
<provider>
|
Zusammenführen | Attribut „android:name “
|
<receiver>
|
Zusammenführen | Attribut „android:name “
|
<screen>
|
Zusammenführen | Attribut „android:screenSize “
|
<service>
|
Zusammenführen | Attribut „android:name “
|
<supports-gl-texture>
|
Zusammenführen | Attribut „android:name “
|
<supports-screen>
|
Zusammenführen | Es gibt nur einen pro <manifest> .
|
<uses-configuration>
|
Zusammenführen | Es gibt nur einen pro <manifest> .
|
<uses-feature>
|
Zusammenführen | android:name -Attribut (falls nicht vorhanden, wird der
android:glEsVersion Attribut)
|
<uses-library>
|
Zusammenführen | Attribut „android:name “
|
<uses-permission>
|
Zusammenführen | Attribut „android:name “
|
<uses-sdk>
|
Zusammenführen | Es gibt nur einen pro <manifest> .
|
Benutzerdefinierte Elemente | Zusammenführen | Keine Übereinstimmung; sind dem Fusionstool unbekannt und im zusammengeführten Manifest enthalten. |
Build-Variablen in Manifest einfügen
Wenn Sie Variablen in Ihre AndroidManifest.xml
-Datei einfügen müssen, die
build.gradle
definiert haben, können Sie dies mithilfe der
manifestPlaceholders
-Property. Diese Eigenschaft nimmt eine Zuordnung
von Schlüssel/Wert-Paaren,
wie hier gezeigt:
Cool
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:
<intent-filter ... >
<data android:scheme="https" android:host="${hostName}" ... />
...
</intent-filter>
Standardmäßig stellen die Build-Tools auch die
Anwendungs-ID
in den Platzhalter ${applicationId}
ein. Der Wert entspricht immer dem letzten
Anwendungs-ID für den aktuellen Build, einschließlich
nach Build-Varianten zu ändern.
Dies ist nützlich, wenn Sie einen eindeutigen Namespace für Kennungen verwenden möchten
z. B. eine Intent-Aktion, auch zwischen Ihren Build-Varianten.
Angenommen, Ihre build.gradle
-Datei sieht so aus:
Cool
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 wie folgt in Ihr Manifest einfügen:
<intent-filter ... >
<action android:name="${applicationId}.TRANSMOGRIFY" />
...
</intent-filter>
Das Manifest-Ergebnis, wenn Sie die "free" Produktgeschmack ist:
<intent-filter ... >
<action android:name="com.example.myapp.free.TRANSMOGRIFY" />
...
</intent-filter>
Weitere Informationen finden Sie unter Legen Sie die Anwendungs-ID fest.