Я пишу простую задачу 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'
}