Обработчики аннотаций генерировали ресурсы, не упакованные в APK
У меня есть пользовательский процессор аннотаций, генерирующий классы factory и ресурс META-INF/services/factory.interface.class
.
Обработчик аннотации используется в проекте библиотеки, и все сгенерированные файлы правильно упакованы в AAR.
Когда я использую обработчик аннотации в проекте приложения с библиотекой, добавленной как зависимость, только классы из библиотек META-INF/services/factory.interface.class
существуют в APK/META-INF/services/factory.interface.class
После некоторого исследования я понял, что MergeJavaResourcesTransform
в android- gradle -plugin-1.5.0 (и 2.0.0-alpha3) ищет ресурсы для слияния во всех exploded-aar
s, jar
s и intermediates/sourceFolderJavaResources
Есть ли способ слить META-INF
из intermediates/classes
(где создаются файлы ресурсов из обработчика аннотаций) или сделать обработчик аннотации создать файл в sourceFolderJavaResources
?
Обходной путь, который я нашел до сих пор, заключается в том, чтобы добавить CopyTask
в application buildscript
android.applicationVariants.all { variant ->
def variantName = variant.name
def variantNameCapitalized = variantName.capitalize()
def copyMetaInf = tasks.create "copyMetaInf$variantNameCapitalized", Copy
copyMetaInf.from project.fileTree(javaCompile.destinationDir)
copyMetaInf.include "META-INF/**"
copyMetaInf.into "build/intermediates/sourceFolderJavaResources/$variantName"
tasks.findByName("transformResourcesWithMergeJavaResFor$variantNameCapitalized").dependsOn copyMetaInf
}
Но я не хочу, чтобы заставить компилятор пользователей библиотеки делать что-то большее, чем добавлять зависимости.
Ответы
Ответ 1
Кажется, что проблема связана с папкой META-INF. Вот сообщение об ошибке Service Loader и META-INF
Кстати, есть подтвержденное решение:
- щелкните правой кнопкой мыши /src/main (где у вас есть /java и/res папки),
- выберите "Создать" > "Папка" > "Папка ресурсов Java",
- нажмите "Готово" (не меняйте местоположение папки),
- щелкните правой кнопкой мыши папку new/resources,
- выберите "Создать" > "Справочник"
- введите "META-INF" (без кавычек),
- щелкните правой кнопкой мыши/resources/папку META-INF,
- выберите "Создать" > "Справочник"
- введите "службы" (без кавычек)
- скопируйте любой файл в /resources/META -INF/services
Кроме того, вы можете проверить следующие вопросы о SO:
Исходный ответ:
Возможно, вы захотите настроить источник библиотеки resources
(с указанием местоположения META-INF/services), который отвечает за:
Ресурсы Java, которые должны быть скопированы в javaResources выходной каталог.
Вот пример:
android {
...
sourceSets {
main {
resources.srcDirs = ['/src/META_INF_generated']
}
}
...
}