2

Guten Tag. Ich habe eine kotlin android Bibliothek geschrieben und auf bintray hochgeladen. Aber wenn ich versuche, es zu benutzen (via gradle Kompilierung) in einem Projekt, schlägt es mit folgenden Fehler bauen:Deaktivieren Sie META-INF/* Generation in Groß-Android-Bibliothek kotlin Projekt

> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/library_release.kotlin_module 
File1: C:\Users\Charlie\.android\build-cache\2939fbc6b0336396c9c4912d615880645b2c729d\output\jars\classes.jar 
File2: C:\Users\Charlie\OneDrive\Dev\Projects\AndroidStudio\MetuCardLib\demo\build\intermediates\bundles\default\classes.jar 

Ich habe diese beiden .jar-Dateien nachgeschlagen und sie enthielten beide META-INF Ordner mit library_release.kotlin_module Datei. Aber noch wichtiger, generierte .aar (android Archiv in bintray veröffentlicht) enthielt diesen Ordner sowie diese Datei. Ich habe andere anständige bintray Android-Bibliotheken überprüft und sie scheinen keine META-INF Dateien enthalten. Aber diejenigen, die es enthalten (in den meisten Fällen enthalten sie Lizenzdateien), erzeugen das gleiche DuplicateFileException und die Art und Weise, es zu lösen, besteht darin, sie explizit in der groplle-Datei von use-project auszuschließen.

Was ist die Verwendung dieser Datei library_release.kotlin_module und wie kann ich die Generierung während der Veröffentlichung deaktivieren? Weil ich nicht explizit von jedem Projekt ausschließen möchte, das diese Bibliothek benutzt, und ich möchte andere Entwickler nicht darum bitten.

Hier ist die Repo-Bibliothek: https://github.com/arslancharyev31/Anko-ExpandableTextView/ Und es ist bintray Repo: https://bintray.com/arslancharyev31/android/Anko-ExpandableTextView

Antwort

3

Der ursprüngliche Zweck von .kotlin_module Dateien ist das Paket Teile Zuordnung zu den kompilierten Klassendateien zu speichern. Der Compiler verwendet sie zum Auflösen von Funktionsaufrufen der obersten Ebene in einer Bibliothek, die an das Projekt angehängt ist. Außerdem verwendet Kotlin Reflection die Dateien .kotlin_module, um die Metadaten der obersten Ebene zur Laufzeit zu erstellen. Weitere Informationen: Improving Java Interop: Top-Level Functions and Properties

Angesichts dessen möchten Sie nicht ihre Generierung in Bibliotheksprojekten deaktivieren, da es die Kompilierung gegen die Bibliotheken brechen könnte.

Stattdessen können Sie durch build.gradle in Ihrer Anwendung mit der Duplikate entfernen, wie here sagte:

android { 
    // ... 

    packagingOptions { 
     exclude 'META-INF/library_release.kotlin_module' 
    } 
} 

Hinweis: ohne diese Dateien aus einer Anwendung APK zur Laufzeit mit Reflexion stört und deshalb ist auch nicht die beste Lösung.


Eine weitere Option ist einzigartig Modulnamen in Ihren Bibliotheken zu verwenden:

compileReleaseKotlin.kotlinOptions.freeCompilerArgs += ["-module-name", "my.library.id"] 

die Aufgabe auswählen, die die Ausgabe erzeugt, die dann in den AAR verpackt. Es ist möglicherweise nicht compileReleaseKotlin, und beachten Sie auch, dass dies die Testkompilierung für diese Variante beeinträchtigen könnte.

Oder, was ist zuverlässiger, wählen Sie nur einzigartige Gradle Modulnamen, weil das Kotlin-Modul nach dem Gradle-Projekt benannt ist.

Verwandte Themen