我有自己的Gradle插件,我想添加一个任务,它会从main
文件夹中获取启动器图标,并根据用户的扩展配置为每个构建类型/风味文件夹输出不同颜色的图标。
我添加了应用程序变体的任务:
variant.registerResGeneratingTask(tintTask, new File("${project.buildDir}/generated/res/${variant.name}"))
然后在任务中我执行上述操作。直到这里一切都很好 - 生成源并将文件夹标记为资源文件夹。
问题是当我尝试创建构建并且流程命中mergeXXXResources
任务时(在这种情况下xxx == debug)。
此时我将mipmap-[dpi]-v4/ic_launcher
中的main/res
与generated/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');
答案 0 :(得分:2)
好的,总结一下我们在上面的评论讨论中提出的内容:
这里的问题很可能是您在gradle脚本将main
目录与当前flavor混合之前尝试修改文件的事实。我的建议是你应该在合并完成后尝试解雇你的任务,如下所示:
variant.mergeResources.doLast { //fire your task here }
这应该更简单一点,并且可以为您节省大量关于Android gradle插件如何实际处理这些内容的研究: - )