Manifestdateien verwalten

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.

Abbildung 1: Der Vorgang zum Zusammenführen von drei Manifesten Dateien von der niedrigsten Priorität zur höchsten Priorität.

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):

  1. 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).

  2. Hauptmanifestdatei für das App-Modul
  3. 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.

Tabelle 1 Standardverhalten bei der Zusammenführung von Attributen Werte

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 anwenden overrideLibrary 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
  • 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ür tools: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:

Tabelle 2: Liste der Berechtigungen des Fusionstools kann dem zusammengeführten Manifest

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:

  1. Öffnen Sie die Datei AndroidManifest.xml in Android Studio.
  2. 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.

Abbildung 2: Ansicht „Zusammengeführte Manifeste“

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:

Tabelle 3 Manifest-Element-Zusammenführungsrichtlinien und Abgleichsschlüssel

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.