16

我有自定义注释处理器生成工厂类和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-aars、jars 和intermediates/sourceFolderJavaResources

有什么方法可以合并META-INFintermediates/classes这是创建注释处理器的资源文件的地方)或使注释处理器在其中创建文件sourceFolderJavaResources

到目前为止我发现的唯一解决方法是添加CopyTask应用程序的构建脚本

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
}

但是我不希望强制编译器库用户做任何比添加依赖项更多的事情。

4

1 回答 1

1

似乎该问题与 META-INF 文件夹有关。这是服务加载程序和 META-INF报告的错误

顺便说一句,有一个确认的解决方案

  • 右键单击 /src/main (您有 /java 和 /res 文件夹的位置),
  • 选择新建 > 文件夹 > Java 资源文件夹,
  • 单击完成(不要更改文件夹位置),
  • 右键单击新的 /resources 文件夹,
  • 选择新建 > 目录
  • 输入“META-INF”(不带引号),
  • 右键单击 /resources/META-INF 文件夹,
  • 选择新建 > 目录
  • 输入“服务”(不带引号)
  • 将您需要的任何文件复制到 /resources/META-INF/services

此外,您可能需要检查以下关于 SO 的问题:


初步答案:

您可能想尝试配置您的library source setresources属性(使用您的 META-INF/services 的位置),该属性负责:

要复制到 javaResources 输出目录中的 Java 资源。

这是一个例子:

android {
    ...
    sourceSets {
        main {
            resources.srcDirs = ['/src/META_INF_generated']
        }
    }
    ...
}
于 2015-12-29T14:25:01.647 回答