android - 如何在 Android Gradle 任务中注册生成的资源?

标签 android gradle android-gradle-plugin android-resources

我正在尝试在 Gradle 任务中生成一些 Android 资源。

我编写了一个任务,它解析输入文件,并将 XML 文件写入应用程序的 build 目录下的某个位置。

app/build.gradle

import groovy.xml.MarkupBuilder


task generateSomeAppResources {
    ext.outputDir = new File(projectDir, "build/generated/res/values")
    doFirst {
        mkdir outputDir

        new File(outputDir, "generated.xml").withWriter { writer ->
            def destXml = new MarkupBuilder(new IndentPrinter(writer, "    ", true, true))
            destXml.setDoubleQuotes(true)
            def destXmlMkp = destXml.getMkp()
            destXmlMkp.xmlDeclaration(version: "1.0", encoding: "utf-8")
            destXmlMkp.comment("Generated at ${new Date()}")
            destXmlMkp.yield "\r\n"

            destXml.resources() {
                "string"("name": "generated_app_resource") {
                    destXmlMkp.yield("Some generated value for the app")
                }
            }
        }
    }
}

这很好用,生成的输出看起来像我预期的那样。

生成的.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Generated at Wed Feb 12 12:46:12 GMT 2020 -->
<resources>
    <string name="generated_app_resource">Some generated value for the app</string>
</resources>


不过,我正在努力让 Android 构建系统检测生成的文件。 Google's advice

to write a task that outputs a generated resource directory structure with whatever you need, use BaseVariant.registerGeneratedResFolders()

但没有关于 registerGeneratedResFolders() 的文档。经过一番繁琐的搜索,我在 Play Services Plugin source 中找到了一些示例用法。 ,例如,所以我尝试在这些方面添加一些内容。

app/build.gradle

android.applicationVariants.all { variant ->
    def files = project.files(generateSomeAppResources.outputDir)
    files.builtBy(generateSomeAppResources)
    variant.preBuildProvider.configure { dependsOn(generateSomeAppResources) }
    variant.mergeResourcesProvider.configure { dependsOn(generateSomeAppResources) }
    variant.registerGeneratedResFolders(files)
}

但我错过了一些东西。生成的资源在 Android Studio 中显示为紫色,表示 IDE 认为它存在...

enter image description here

...但代码无法编译,并出现 Unresolved reference: generated_app_resource 错误。

我不知道需要什么魔法才能让 Android 构建系统获取这些资源。我该如何构建它?

最佳答案

要创建资源,android需要

1) values 文件夹上方的资源目录,然后您可以根据需要添加所需的资源

2) 指示构建过程在构建R.java

时添加生成的资源

所以首先配置你的构建资源任务,比如:

task generateSomeAppResources {
    ext.outputDir = new File(projectDir, "build/generated/res/custom/values")
    print("path is "+projectDir)
    doFirst {
        mkdir outputDir

        new File(outputDir, "strings.xml").withWriter { writer ->
            def destXml = new MarkupBuilder(new IndentPrinter(writer, "    ", true, true))
            destXml.setDoubleQuotes(true)
            def destXmlMkp = destXml.getMkp()
            destXmlMkp.xmlDeclaration(version: "1.0", encoding: "utf-8")
            destXmlMkp.comment("Generated at ${new Date()}")
            destXmlMkp.yield "\r\n"

            destXml.resources() {
                "string"("name": "generated_app_resource") {
                    destXmlMkp.yield("Some generated value for the app")
                }
            }
        }
    }
}

现在使用 build.gradle(app) 中的 sourceSets 在构建过程中添加路径,例如

android {
    //....
    sourceSets {
        main {
            res.srcDirs += [
                    'build/generated/res/custom',
            ]
        }
    }
}

另外,将当前构建过程中的任务添加为

gradle.projectsEvaluated {
    preBuild.dependsOn('generateSomeAppResources')
} // no need of `android.applicationVariants.all...` 

现在同步项目,它将按预期工作。

结果:

enter image description here

关于android - 如何在 Android Gradle 任务中注册生成的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60189073/

相关文章:

android - 适用于平板电脑的 Google+ Android 网格小部件教程

android studio java_home 未正确定义

android - 如何修复android多个dex文件定义异常

android - 解决 list 合并失败错误 - 工具 :replace

java - 我想从一个 Activity 调用两个 ContentView

java - 是否可以在 java android 项目中使用 lua 脚本?

gradle - 运行gradle有困难

android - 升级到Cordova Android 8.0后,Gradle无法同步

android - 在项目名称文件 : build. gradle 上找不到属性 'GROUP'

android - HERE Android SDK NavigateManager 在没有 map 的情况下模拟不提供操作