Android-Build führt keine Manifeste aus Bibliotheken zusammen

8

Wir haben mehrere Projekte, abhängig von vielen Android-lib-Modulen. Um doppelte XML-Tags in den App-Manifesten zu vermeiden, stellen wir die entsprechenden Empfänger, Dienste und Aktivitäten in ihre jeweiligen Module.

Bis heute haben wir verwendet:

  • Android Studio: 2.2.1
  • grandle: 2.1.3
  • buildToolsVersion: 23.0.3

Heute haben wir aktualisiert:

  • Android Studio: 2.3
  • Gradle: 2.3.0
  • buildToolsVersion: 25.0.0

Bis zu diesem Update funktionierte alles einwandfrei und die Manifeste wurden zusammengeführt, wir hatten Konflikte und wir haben sie behoben. Nach dem Update, das wir gemacht haben, werden die Manifeste überhaupt nicht zusammengeführt !!

--- Update 1 ---

Wir haben die Ansicht "Zusammengeführtes Manifest" verwendet und festgestellt, dass die Manifeste in der Zusammenführung nicht enthalten sind. Das einzige, was aus dem Manifest des Moduls zusammengeführt wird, sind die Berechtigungen, also z. B. wenn ich ein neues hinzufüge Erlaubnis zu einem Modul manifestieren es würde es nur zusammenführen und nicht den Rest der Elemente!

Ich garantiere, dass es viele Dinge zu verschmelzen gibt!

--- Update 2 ---

Es scheint, dass alles außerhalb des Anwendungs-Tags in das Hauptmanifest einfließt und alles innerhalb des Anwendungs-Tags nicht.

--- Update 3 ---

Modul, das nicht zusammengeführt wird:

Gradle:

%Vor%

Manifest:

%Vor%

Modul, das zusammengeführt wird:

Gradle:

%Vor%

Manifest:

%Vor%

Irgendwelche Vorschläge?

    
TacB0sS 26.03.2017, 13:37
quelle

6 Antworten

5

Es könnte viele Dinge sein. Da Sie keinen Code zur Verfügung gestellt haben, werde ich annehmen, dass Sie das standardmäßige Merge-Verhalten verwenden. Weitere Informationen finden Sie unter Konfliktheuristiken zusammenführen

Sie können die Ansicht Zusammengeführtes Manifest verwenden, um eine Vorschau anzuzeigen die Ergebnisse des zusammengeführten Manifests und finden Sie Konfliktfehler.

Im Allgemeinen sollte die Zusammenführung standardmäßig funktionieren. Verwenden Sie dann die Ansicht Zusammengeführtes Manifest , um zu sehen, wie & amp; wo du beim Verschmelzen Werte verloren hast. Die Verwendung von Merge-Regel-Markern würde Ihnen bei der Verwaltung der Zusammenführung helfen, indem Sie Regelmarkierungen zuweisen.

>

Wenn es überhaupt keine Zusammenführung gibt. Es ist also wahrscheinlich ein Abhängigkeitsproblem zwischen Modulen.

Beachten Sie, dass die Abhängigkeitsreihenfolge bei Modulen mit der gleichen Prioritätsstufe wie Bibliotheken eine entscheidende Rolle spielt.

--- Update 5. April 2017 ---

Hier sind einige nützliche Tipps:

  1. Versuchen Sie, andere Bibliotheken so weit wie möglich zu aktualisieren und neu zu erstellen.
  2. Entfernen Sie alle Abhängigkeiten, bereinigen Sie das Projekt und fügen Sie sie erneut hinzu. und Überprüfen Sie, ob Sie sie richtig importieren. Das könnte getan werden, indem Sie das Projekt ohne Probleme erstellen.
  3. Beachten Sie, dass seit Version 2.2.0 keine Assets von Modulen mehr verfügbar sind in App.
  4. Überprüfen Sie Ihr Manifest, wenn der Merge-Prozess nicht explizit durch das Attribut deaktiviert wird: tools:node=”remove" oder tools:node="removeAll" oder in Großbuchstaben (siehe Diese Deaktivierung der Manifest-Zusammenführung in Android Gradle Build )
  5. Versuchen Sie, eine Demo mit einem Modul zu erstellen und die Zusammenführung zu verfolgen. und dann übereinstimmen Ausgaben zu Ihren Projekten. Dies wird deutlich machen, dass dies nicht der Fall ist Konfigurationsproblem aber Android Studio 2.3 (also dann neu installieren Version)

--- Update (2) 5.April.2017 ---

Nachdem Sie Code hinzugefügt hatten, konnte ich sehen, dass Sie Attribut

verwenden %Vor%

Unter Anwendungselement in Ihren Modulen (und wahrscheinlich auch in der App-Manifest). Ich denke, das ist der Grund, warum Sie keine Manifeste aus importierten Modulen erhalten haben, die mit dem Manifest Ihrer App zusammengeführt wurden. Siehe tools:node="replace" unter Knotenmarkierungen .

  

Ersetzen Sie das Element mit der niedrigeren Priorität vollständig. Das heißt, wenn es ein   übereinstimmendes Element im Manifest mit niedrigerer Priorität, ignoriere es und verwende es   dieses Element genau so, wie es in diesem Manifest erscheint.

Das bedeutet, dass beide obigen Module nie etwas mit manifest aus:

erhalten
  • android-infra
  • com.sensiya: sense-services-client: 1.24.2
  • Engine-Core-Server
  • engine-core-aneeda

Entfernen Sie dieses Attribut und bereinigen Sie die Module und erstellen Sie sie neu. dann das ganze Projekt neu aufbauen.

    
Maher Abuthraa 01.04.2017 11:08
quelle
2

Wenn Sie offensichtliche Zusammenführungskonflikte bekommen, haben Sie zwei Möglichkeiten.

1) Finden Sie alle in Ihrem Projekt enthaltenen Manifestdateien einschließlich der Dateien in Bibliotheken, die Sie als Abhängigkeiten haben, und stellen Sie sicher, dass keine Konfigurationen mit Konflikten vorliegen.

oder 2) fügen Sie Ihren Manifesten einige Zusammenführungsauflösungsregeln hinzu, um festzulegen, wie jeder Konflikt gelöst werden soll.

Hier gibt es eine tolle Seite mit vielen Details.
Ссылка

    
Stephen 31.03.2017 01:06
quelle
1

Von Android Studio

Erstellen --- & gt; Projekt löschen
dann
Erstellen - & gt; Projekt erstellen
Dies sollte helfen,

zu beheben     
Oniyide Ibukun Olaoluwa 03.04.2017 14:50
quelle
0

Ich hatte ein ähnliches Problem für Unity. Ich konnte es lösen, indem ich auf den SDK Manager ging und die neueste Android API entfernte. Dann habe ich eine etwas ältere API installiert und es funktionierte (API 21 oder 22 glaube ich)

Wie der SDK-Manager aussieht

    
Xertz 04.04.2017 23:46
quelle
0

Ich habe kürzlich dasselbe Problem in meinem Produktionscode. Wenn ein Bibliotheks-in-App-Modul auch in anderen Gradle-Abhängigkeiten vorhanden ist, werden die doppelten Einträge verursacht. Wir müssen solche Module oder Bibliotheken von Konflikten ausschließen.

Dafür müssen wir die Anzahl der Bibliotheken kennen, die von einer bestimmten Gadle-Abhängigkeit verwendet werden.

Betrachten Sie einen Fall, in dem ich "bolts-android-1.2.0.jar" in meiner App verwende. In derselben Größe verwende ich facebookSDK wie folgt.

%Vor%

Also muss ich "bolts-android" wie folgt ausschließen

%Vor%

Wie kann man also wissen, dass facebookSDK "bolts-android" verwendet?

Hier können Sie das Android Method Count

verwenden     
Tarun Dholakiya 05.04.2017 04:31
quelle
0

Scheint so, als ob das Problem darin besteht, tools:node="replace" im Element application zu verwenden. Aus der Dokumentation :

  

... Wenn im Manifest mit der niedrigeren Priorität ein übereinstimmendes Element vorhanden ist, ignorieren Sie es und verwenden Sie dieses Element genau so, wie es in diesem Manifest angezeigt wird.

Was Sie eigentlich verwenden möchten, ist tools:node="merge" , was das Standardverhalten ist.

  

Fügen Sie alle Attribute in diesem Tag und alle verschachtelten Elemente zusammen, wenn keine Konflikte mit der Heuristik für den Merge-Konflikt auftreten. Dies ist das Standardverhalten für Elemente.

    
guy.gc 21.11.2017 09:46
quelle