注释处理器生成的资源未打包到APK

sky*_*man 15 android annotations meta-inf gradle

我有自定义注释处理器生成工厂类和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应用程序的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
}
Run Code Online (Sandbox Code Playgroud)

但我不打算强制编译库,用户除了添加依赖项之外还做更多的事情.

Gre*_*ryK 1

看来问题与 META-INF 文件夹有关。这是针对Service Loader 和 META-INF报告的错误

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

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

另外,您可能还想检查以下有关 SO 的问题:


初步答复:

您可能想尝试配置库源集resources属性(使用 META-INF/services 的位置),该属性负责:

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

这是一个例子:

android {
    ...
    sourceSets {
        main {
            resources.srcDirs = ['/src/META_INF_generated']
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)