Обработчики аннотаций генерировали ресурсы, не упакованные в 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']
        }
    }
    ...
}