我正在尝试在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")
}
}
}
}
}
这很好,并且生成的输出看起来像我期望的。
generated.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是
要编写一个输出所需内容的生成资源目录结构的任务,请使用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认为它存在...
...但是代码无法编译,并显示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") } } } } }
现在使用
sourceSets
在构建过程中添加路径,如
android { //.... sourceSets { main { res.srcDirs += [ 'build/generated/res/custom', ] } } }
此外,将任务添加到当前构建过程中为>
gradle.projectsEvaluated { preBuild.dependsOn('generateSomeAppResources') } // no need of `android.applicationVariants.all...`
现在同步项目,它将按预期工作。
结果: