使用res生成任务添加资源时“重复资源”

时间:2016-04-28 10:49:50

标签: android android-gradle gradle-plugin

我有自己的Gradle插件,我想添加一个任务,它会从main文件夹中获取启动器图标,并根据用户的扩展配置为每个构建类型/风味文件夹输出不同颜色的图标。

我添加了应用程序变体的任务:

variant.registerResGeneratingTask(tintTask, new File("${project.buildDir}/generated/res/${variant.name}"))

然后在任务中我执行上述操作。直到这里一切都很好 - 生成源并将文件夹标记为资源文件夹。

问题是当我尝试创建构建并且流程命中mergeXXXResources任务时(在这种情况下xxx == debug)。

此时我将mipmap-[dpi]-v4/ic_launcher中的main/resgenerated/res/debug中的Execution failed for task ':app:mergeDebugResources'. [mipmap-hdpi-v4/ic_launcher] /{proj_location}/android_example/app/src/main/res/mipmap-hdpi/ic_launcher.png [mipmap-hdpi-v4/ic_launcher] /{proj_location}/android_example/app/build/generated/res/debug/mipmap-hdpi/ic_launcher.png: Error: Duplicate resources 进行了比较。

例如:

@TaskAction
def convertLauncherIcons() {
    def android = project.extensions.getByType(AppExtension)
    File outputDir = new File("${project.buildDir}/generated/tintLaunchIcons/res/${taskVariant.name}")

    android.sourceSets.each {
        if ("main".equals(it.name)) {
            it.res.srcDirs.each { dirIt ->
                dirIt.absoluteFile.list().each { resDir ->
                    if (resDir.startsWith("mipmap-")) {
                        def relIconPath = "${resDir}/ic_launcher.png"
                        File launcherFile = new File(dirIt.absolutePath, relIconPath);
                        if (launcherFile.exists()) {
                            BufferedImage img = ImageIO.read(launcherFile);
                            /* IMAGE MANIPULATION HERE */
                            File outputFile = new File(outputDir, relIconPath);
                            if (!outputFile.exists()) {
                                File parent = outputFile.getParentFile();
                                if (!parent.exists() && !parent.mkdirs()) {
                                    throw new IllegalStateException("Couldn't create dir: " + parent);
                                }
                                outputFile.createNewFile();
                            }
                            println "writing file ${outputFile.canonicalPath}"
                            ImageIO.write(img, "png", outputFile);
       } ... 

我为输出文件尝试了不同的位置,但我不相信它有任何区别。我希望资源合并能够识别生成的资源并在最终输出中解析它们,但显然我正在做一些可怕的错误。

我尝试过使用Transform API,但也许是因为文档稀少而我缺乏理解,我的尝试并不是很成功(我无法找到类似于我找到的方式的资源文件转换操作期间的java文件)。

我正在寻找关于如何解决我当前问题的建议,或者是一种可以执行我最初要实现的任务的替代方法。

根据请求

编辑,我的任务操作代码:

var re = new RegExp('\\b' + word + '\\b', 'i');

1 个答案:

答案 0 :(得分:2)

好的,总结一下我们在上面的评论讨论中提出的内容:

这里的问题很可能是您在gradle脚本将main目录与当前flavor混合之前尝试修改文件的事实。我的建议是你应该在合并完成后尝试解雇你的任务,如下所示:

variant.mergeResources.doLast { //fire your task here }

这应该更简单一点,并且可以为您节省大量关于Android gradle插件如何实际处理这些内容的研究: - )