Android Bibliotheksprojekt com.android.dex.DexException: Mehrere dex-Dateien definieren Lcom / google / gson / JsonSerializer

8

Ich schreibe ein Bibliotheksprojekt in Android Studio. Meine Gradle-Datei enthält ua folgende: gson volley play-services Beim Einbetten meiner Bibliothek in ein Projekt bekomme ich:

  

com.android.dex.DexException: Mehrere Dex-Dateien definieren Lcom / google / gson / JsonSerializer;

Könnte jemand erklären, wie Gradle beim Erstellen von Bibliotheksprojekten funktioniert?
Was soll ich dem Entwickler erklären, der mein SDK integriert, wie funktioniert das Modul nicht und warum funktioniert es nicht in der App, die mein aar enthält?

    
Noam Segev 10.08.2016, 13:37
quelle

4 Antworten

4

Es gibt zwei Fälle, die auf

berücksichtigt werden müssen
  • Ziehen Sie zunächst in Betracht, Gson zu entfernen, wenn Sie es in app / build.gradle

    deklariert haben

    Abhängigkeiten {    kompiliere 'com.google.code.gson: gson: 2.4' }

  • Zweitens, wenn Sie es nicht in Ihrem app/build.gradle deklariert haben Möglicherweise müssen Sie untersuchen, welche Bibliotheken, die Gson doppelt deklariert haben Abhängigkeit. Dann können Sie den Gson aus dieser Bibliothek ausschließen. Sie können dies überprüfen Transitive Abhängigkeiten ausschließen

Hier werde ich ein Beispiel für exclude appcompat-v7 von einer Bibliothek

geben

Führen Sie diesen Befehl aus, um die Abhängigkeiten-Diagrammstruktur anzuzeigen

%Vor%

Es wird der Abhängigkeitsbaum wie im folgenden Beispiel angezeigt

%Vor%

Nachdem Sie die deklarierte doppelte Abhängigkeit der Bibliothek gefunden haben. Sie können anfangen, es auszuschließen.

%Vor%     
THANN Phearum 22.08.2016, 06:36
quelle
0

Gradle kann dieses Problem nicht magisch lösen - es kann verschiedene Versionen der gleichen Bibliothek in Ihrem SDK und in der Anwendung des Benutzers geben - diese können nicht zusammengeführt oder irgendwie differenziert werden.

Ich habe auch ein SDK entwickelt, das mehrere beliebte Bibliotheken von Drittanbietern verwendet. Ich habe gerade erklärt, dass ich sie benutzt habe und dieser Benutzer muss keine Gläser für diese Abhängigkeiten in seiner eigenen Anwendung bereitstellen, wenn er sie auch braucht. Ich denke, es ist in Ordnung, solange Sie die letzten Versionen dieser Bibliotheken in Ihrem SDK bereitstellen.

  1. Die einzige gute Möglichkeit, Kollisionen zu vermeiden, die ich mir vorstellen kann, ist, Klassennamen in importierten Bibliotheken zu ändern - aber das ist wirklich langweilig und ermüdend. Sie können auch etwas wie gradle shadow plugin verwenden, um Pakete zu verschieben, aber das scheint mir riskant. Es sieht so aus:

shadowJar { relocate 'com.google.gson', 'shadow.com.google.gson' }

  1. Auch Ihr Entwickler kann die Bibliothek entsperren, gson entfernen und erneut jagen. Aber wenn er eine andere Version von Gson verwendet, kann Ihre Bibliothek brechen.

  2. Oh ja, Sie können Ihr SDK auch als Quelle verteilen, nicht als JAR - dann können die Benutzer es in ihre Anwendung einfügen und beliebige Bibliotheken verwenden. Aber normalerweise möchten Sie den SDK-Code nicht öffentlich zugänglich machen (selbst durch Bibliotheks-Jars ist das sehr einfach umzukehren ...).

Jehy 16.08.2016 11:02
quelle
0

Die Option --multi-dex für dx ist nicht kompatibel mit Bibliotheksprojekten vor der Dexierung. Wenn Ihre App also Bibliotheksprojekte verwendet, müssen Sie die Vor-Dexierung deaktivieren, bevor Sie --multi-dex verwenden können.

ODER

Aktualisieren Sie Ihre IDE

    
Sanat Chandravanshi 19.08.2016 07:01
quelle
0

Wenn GSON entfernen für Sie keine Option ist, versuchen Sie es mit der Unterstützung von enablin multidex in Ihrer build.gradle -Datei:

%Vor%     
Jorgesys 22.08.2016 20:07
quelle