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?
Es gibt zwei Fälle, die auf
berücksichtigt werden müssenZiehen Sie zunächst in Betracht, Gson zu entfernen, wenn Sie es in app / build.gradle
deklariert habenAbhä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
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%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.
shadowJar {
relocate 'com.google.gson', 'shadow.com.google.gson'
}
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.
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 ...).
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
Tags und Links dependencies android android-gradle aar