web-dev-qa-db-de.com

Fehler bei der Manifestierung der Fusion

Ich bin dabei, meine aktuelle Projekte in Android Studio und Gradle zu verschieben. Ich bin derzeit bei dem folgenden Thema festgefahren:

Error:(87, 9) Execution failed for task ':App:processDebugManifest'.
> Manifest merger failed : Attribute [email protected] value=(@string/app_label) from AndroidManifest.xml:87:9
    is also present at Android_APPLICATION:Library:unspecified:9:18 value=(@string/app_name)
    Suggestion: add 'tools:replace="Android:label"' to <application> element at AndroidManifest.xml:82:5 to override

Ich habe versucht, die folgenden Attribute zur Hauptdatei AndroidManifest.xml hinzuzufügen:

tools:replace="Android:label, *App Name*"
tools:replace="Android:label, @string/app_label"
tools:replace="Android:label"

Keine dieser Attributdefinitionen funktioniert. Was mache ich falsch?

48
James King

Probieren Sie es aus:

Fügen Sie dies zu <manifest/> hinzu

xmlns:tools="http://schemas.Android.com/tools"

Fügen Sie dies zu <application/> hinzu

tools:node="replace"

Basierend auf this sollte es alle Elemente überschreiben. "Ersetzen Sie die Deklaration mit niedrigerer Priorität durch die kommentierte."

125
Kayvan N

Hintergrund

Beim Zusammenführen der Manifestdateien besteht ein Konflikt mit dem Attribut label

Im Allgemeinen gibt es es gibt drei Typen von Manifestdateien, die in einem einzigen resultierenden App-Manifest zusammengefügt werden müssen, hier in der Reihenfolge der Priorität:

  1. Produktvarianten und Build-Typ-spezifische Manifestdateien. 
  2. Hauptmanifestdatei für die Anwendung. 
  3. Bibliotheksmanifestdateien.

Auflösungen

Der Konflikt kann auf zwei Arten gelöst werden:

Entfernen Sie das widersprüchliche Etikett

Entfernen Sie das in Konflikt stehende Attribut aus der Bibliotheksmanifestdatei (oder einer untergeordneten Ebene). 

In diesem Fall hat Android_APPLICATION:Library:unspecified:9:18 value=(@string/app_name) einen definierten @string/app_name-Wert, der sich von dem in der Hauptanwendung unterscheidet. Wenn dies nicht erforderlich ist, entfernen Sie es. Entfernen Sie einfach den Android:label="@string/app_name" aus der AndroidManifest.xml-Datei der Bibliotheksdatei.

Fügen Sie ein Attribut hinzu, um eine automatische Lösung des Konflikts zu ermöglichen

Es gibt mehrere spezielle Attributmarkierungen (im Namensraum der Tools), die verwendet werden können, um eine bestimmte Entscheidung für die Konfliktlösung auszudrücken.

In diesem Fall fügen Sie die Android:label-Definition zum xmlns:tools="http://schemas.Android.com/tools"-Knoten und <manifest> zum tools:replace="label"-Knoten hinzu, um den <application> der Hauptanwendung explizit zu veranlassen, alle anderen Anwendungsetiketten (z. B. Bibliotheksdatei) zu überschreiben. 

Hier ein Beispiel - verwenden Sie dies in der AndroidManifest.xml-Datei der Hauptanwendung:

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

    <application
        Android:label="@string/app_name"
        tools:replace="label"/>
</manifest>

Dieser Ansatz würde auch mit anderen widersprüchlichen Attributen funktionieren. Wenn sich beispielsweise auch das icon-Attribut in Konflikt befindet, kann es in tools:replace="label, icon" geändert werden.

32
CJBS

Wenn Sie Glück hatten, wie ich es war, können Sie das Problem manuell mit einer hacky work-around beheben. 

AAR-Dateien sind nur ZIP-Dateien mit der Erweiterung .aar. In meinem Fall habe ich die .aar-Datei entpackt, den anstößigen Android:label aus dem AndroidManifest.xml der Bibliothek entfernt und dann die restlichen Dateien mit der Erweiterung .aar umsortiert, und alles scheint perfekt mit der neuen .aar-Datei zu funktionieren.

Zu Ihrer Information, dies scheint ein bekannter Fehler im Android Gradle Plugin zu sein .

4
dm78

Ich habe das gleiche Problem behoben. Lösung für mich:

  1. fügen Sie die xmlns:tools="http://schemas.Android.com/tools"-Zeile im Manifest-Tag hinzu
  2. fügen Sie tools:replace=.. im Manifest-Tag hinzu
  3. Android:label=... im Manifest-Tag verschieben

Beispiel hier

3
stefan K

Ich stand auch vor denselben Problemen und fand nach langen Recherchen die Lösung

  1. ihre min sdk-Version sollte mit der der von Ihnen verwendeten Module übereinstimmen Beispiel: Ihr Modul min sdk Version ist 14 und Ihre app min sdk Version ist 9 Es sollte gleich sein.
  2. Wenn Build-Version Ihrer App und Module nicht identisch sind. Wieder sollte es dasselbe sein

Kurz gesagt, Ihre Build-Grad.-Datei und das Manifest Ihrer App sollten die gleichen Konfigurationen haben.

  1. Es gibt kein Duplikat wie die gleichen Berechtigungen, die zweimal in der Manifestdatei hinzugefügt wurden. Dieselbe Aktivität wird zweimal erwähnt
  2. Wenn Sie eine Aktivität aus Ihrem Projekt löschen, löschen Sie diese ebenfalls aus Ihrer Manifestdatei
  3. Manchmal ist es aufgrund von Label, Symbol usw. der Manifestdatei a) Fügen Sie die Zeile xmlns: tools im Manifest-Tag .__ hinzu. b) Werkzeuge hinzufügen: Ersetzen = oder Werkzeuge: Ignorieren = im Anwendungs-Tag Beispiel
   <manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.slinfy.ikharelimiteduk"
xmlns:tools="http://schemas.Android.com/tools"
Android:versionCode="1"
Android:versionName="1.0" >
<application
    tools:replace="icon, label"
    Android:label="myApp"
    Android:name="com.example.MyApplication"
    Android:allowBackup="true"
    Android:hardwareAccelerated="false"
    Android:icon="@drawable/ic_launcher"
    Android:theme="@style/Theme.AppCompat" >
</application>
</manifest>

Wenn Sie diese Punkte im Hinterkopf behalten, werden Sie dieses Problem mit der Manifestierung der Zusammenlegung fehlschlagen. __ Überprüfen Sie meinen Beitrag: Dieses Problem wurde aufgrund eines Problems in der Manifest- oder Build.gradle-Datei erstellt. Sie können meinen Beitrag überprüfen https://wordpress.com/post/dhingrakimmi.wordpress.com/23

0
Kimmi Dhingra

Ich habe gerade entfernt 

Android:label="@string/app_name

aus dem manifest file und es hat funktioniert!

0
itzo