Задача Gradle для сборки Jar, исключая классы Android - PullRequest
0 голосов
/ 05 июня 2018

Я пишу простую задачу Gradle, которая должна взять все промежуточные классы и упаковать их в файл .jar, задача вставлена ​​в цепочку задач Gradle, которые используются для создания библиотеки Android.

Обратите внимание, что библиотека Android не упакована в архив *.aar, у меня есть несколько заданий, которые соберут jar, соберу несколько общих объектов и поместят их в каталог.

ЗадачаДо сих пор я писал следующее:

task createDevJarRelease(type: Jar) {
    from 'build/intermediates/classes/release'

    manifest {
        attributes 'Implementation-Title': 'MYJar library',  
            'Implementation-Version': '1.0'
    }

    archiveName "my-jar.jar"
    doLast {
        // Copy the jar in the target directory.
        copy {
            include "my-jar.jar"
            from    "build/libs/"
            into    "targetDir"
        }
    }
}

Что происходит, так это то, что баночка правильно создана и помещена в мой targetDir НО я не смогу фактически использовать ее внутри проекта Android, потому чтофайл jar содержит вместе с моими классами также другие классы из зависимостей Android, которые вызывают столкновения при включении в приложение Android.

Я вошел в build/intermediates/classes/release и заметил следующую иерархию каталогов:

build/intermediates/classes/release
    |_ android
    |  |_ arch
    |  |  |_ core
    |  |     |_ ...
    |  |  |_ lifecycle
    |  |     |_ ...
    |  |_ support 
    |    |_ ...
    |    |  |_ ...
    |    |_ ...
    |_ my
      |_ package
        |_ name
          |_ foo.class
          |_ bar.class

Я пробовал разные решения, найденные в Интернете, чтобы исключить классы из каталога android, но сбезуспешно.

Я попытался явно добавить команду exclude в задаче Gradle выше, но не работал вообще (классы все еще там).

exclude 'build/intermediates/classes/release/android'

Ошибка при создании приложения с этим jar:

> Task :app:transformDexArchiveWithDexMergerForDebug
Dex: Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Landroid/arch/lifecycle/R;
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Landroid/arch/lifecycle/R;

com.android.dex.DexException: Multiple dex files define Landroid/arch/lifecycle/R;
        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661)
        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616)
        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:198)
        at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:61)
        at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:36)
        at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)


FAILURE: Build failed with an exception.

Зависимости проекта:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    implementation 'com.android.support:appcompat-v7:27.1.1'
    testImplementation 'junit:junit:4.12'
}

1 Ответ

0 голосов
/ 06 июня 2018

Фактическим решением для этого было не exclude классы в задаче jar gradle, а изменение зависимостей проекта, используя compileOnly вместо implementation при установке зависимости com.android.support.

Исправление:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
     androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compileOnly 'com.android.support:appcompat-v7:27.1.1'
    testImplementation 'junit:junit:4.12'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...