android - 如何在构建过程中正确生成 XML 资源文件?

标签 android gradle groovy build code-generation

我需要在构建过程中生成原始 XML 文件(“原始”,可通过 @raw/filename 访问)。

我一直在尝试使用挂接到 preBuild 上的自定义 Gradle 任务来完成此操作。然后,此任务将收集所有需要的需求并在 build/intermediates/res/main/raw 下生成文件。

到目前为止一切都很好;我可以看到文件已正确生成。但是,我似乎无法从我拥有的任何其他 XML 资源文件访问它。

我已经尝试将目标目录更改为 build/generated/source/res/main/raw 但问题仍然存在。

将其更改为 src/main/res/raw 可行,但我必须从 git 中排除生成的文件——我不想那样。另外,生成的源文件与书面对应文件位于同一目录中似乎很奇怪。

下面是我的自定义任务的简化 fragment :

task(generateChangelogXml) {
    def source = new File(rootProject.projectDir, "CHANGELOG")
    def targetDir = new File(projectDir, "/build/intermediates/res/main/raw")
    def target = new File(targetDir, "changelog_latest.xml")

    def versionName = ""
    def releaseDate = ""
    def changes = new ArrayList<String>()

    def reader = new BufferedReader(new FileReader(source))
    def currLine = ""
    while ((currLine = reader.readLine()) != null) {
        // Truncated for brevity
    }

    target.withWriter { writer ->
        writer.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
        writer.write("<changelog bulletedList=\"true\">\n")
        writer.write("    <changelogversion changeDate=\"\" versionName=\"$versionName\">\n")
        changes.forEach { change ->
            writer.write("        <changelogtext>$change</changelogtext>\n")
        }
        writer.write("    </changelogversion>\n")
        writer.write("</changelog>\n")
    }
}
preBuild.dependsOn(generateChangelogXml)

我是不是漏掉了什么?

最佳答案

好的,所以在阅读了更多关于此事的内容之后,我开始了解到我们真的不能依赖现有的文件夹(无论是在 generated 还是 intermediates 中)来放置我们生成的文件可能会被其他任务覆盖和/或根本不可读。

解决方案?为什么,只要创建一个我们自己的文件夹!例如,这就是我最终使用的:

def generatedResDir = new File("$buildDir/generated/local/main/res")

然后,只需将其用作每个生成的资源文件的基目录即可。如果您像我一样希望生成原始 XML,那么请执行以下操作:

def targetDir = new File("$generatedResDir/raw")
def target = new File(targetDir, "changelog_latest.xml")

最后但同样重要的是,通过这样做将 generatedResDir 添加为源目录:

sourceSets {
    main {
        res {
            srcDirs += generatedResDir
        }
    }
}

您现在应该能够毫无问题地生成您选择的任何文件。

关于android - 如何在构建过程中正确生成 XML 资源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48802142/

相关文章:

java - 单击“下一步”按钮后复选框未清除

android - Gradle包装器给出错误 “Could not create plugin of type ' AppPlugin'”

java - “AAPT2 error, check logs for datils ”和描述的情况

gradle - 将资源中的 Zip 文件夹压缩到 jar 中

android - 在 Adapter 中获取行

android - 在 Android Studio 中更改屏幕密度

gradle - 获取gradle play插件以使用替代application.conf

java - 如何在 unetstack 中实现水下网络的能量模型?

grails - 字符串比较在不应该通过if语句时传递

android - AsyncTask 从不执行 onPostExecute