【问题标题】:Annotation Processors generated resources not packaged to APK注释处理器生成的资源未打包到 APK
【发布时间】:2024-04-22 07:10:01
【问题描述】:

我有自定义注释处理器生成工厂类和META-INF/services/factory.interface.class 资源。

库项目中使用注释处理器,所有生成的文件都正确打包到AAR中。

当我在应用程序项目中使用注释处理器并将库添加为依赖项时,APK/META-INF/services/factory.interface.class 中仅存在来自库 META-INF/services/factory.interface.class 的类

经过一番调查,我意识到 android-gradle-plugin-1.5.0(和 2.0.0-alpha3)中的 MergeJavaResourcesTransform 在所有 exploded-aars、jars 和 @987654327 中寻找合并资源@

有没有办法将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
}

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

【问题讨论】:

    标签: android gradle annotations meta-inf


    【解决方案1】:

    问题似乎与 META-INF 文件夹有关。这是Service Loader and META-INF 报告的错误

    对了,有一个确认solution

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

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


    初步答案:

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

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

    这是一个例子:

    android {
        ...
        sourceSets {
            main {
                resources.srcDirs = ['/src/META_INF_generated']
            }
        }
        ...
    }
    

    【讨论】:

    • 库 META-INF 已正确打包到 aar,应用程序中的 MET-INF 文件存在问题。添加resources.srcDirs 'intermediates/classes/debug/META-INF' 没有帮助
    • @skyman 我更新了更多细节。该问题有一些解决方法。希望对您有所帮助。
    • 它不适用于构建系统。 META-INF 是在库和应用程序的编译时生成的,因此在编译之前处理但在打包之前不是解决方案
    • META-INF 在注释处理器中正确生成并在构建库项目时放置在 jar(然后是 aar)中。它也在应用程序项目中正确创建(并与库中的 INE 合并),但在创建结果 jar 时未考虑在内。