首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阻止gradle在以后的任务使用中间文件之前删除它们?

如何阻止gradle在以后的任务使用中间文件之前删除它们?
EN

Stack Overflow用户
提问于 2016-03-26 00:08:05
回答 2查看 1.1K关注 0票数 1

在我的Android /gradle构建中,我试图自动生成我的应用程序图标。生成图标映像的任务( PNG)是在正确的时间运行的,但是在使用它运行的任务之前正在删除该图像。

这是我添加到我的app/build.gradle中的一个简化版本,它说明了这个问题:

代码语言:javascript
复制
task createIcon(type:Exec) {
    def outdir =
        new File("$buildDir/intermediates/res/merged/debug/drawable-ldpi/")
    outputs.dir(outdir)
    if (!outdir.exists()) {
        outdir.mkdirs()
    }
    def svg = 'src/images/ic_launcher.svg'
    inputs.source(new File(svg))
    def png = new File(outdir, "ic_launcher.png")
    outputs.file(png)
    commandLine "$workingDir/svgToPng.sh", svg, png
}

tasks.whenTaskAdded{ t ->
      if(t.name.equals("generateDebugAssets")){
          t.dependsOn createIcon
      }
}

如果我运行./gradlew clean,然后运行./gradlew assembleDebug,我可以看到创建了createIcon任务的输出文件,然后很快就删除了。我从gradlew得到以下输出:

代码语言:javascript
复制
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
...
Bitmap saved as: /home/laurence/src/foo/app/build/intermediates/res/merged/debug/drawable-ldpi/ic_launcher.png
:app:generateDebugAssets
:app:mergeDebugAssets
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources
:app:mergeDebugResources
:app:processDebugManifest
:app:processDebugResources
/home/laurence/src/foo/app/build/intermediates/manifests/full/debug/AndroidManifest.xml:13:23-44 : AAPT: No resource found that matches the given name (at 'icon' with value '@drawable/ic_launcher').

:app:processDebugResources FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:processDebugResources'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/home/laurence/.local/android-sdks/build-tools/23.0.2/aapt'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

您可以看到任务:app:processDebugResources失败了,因为aapt声称它找不到@drawable/ic_launcher ( android:icon在my AndroidManifest.xml中的值),它应该对应于生成PNG的位置。

请注意,我已经确认,PNG不仅是从控制台输出中的"Bitmap保存为“行生成的,而且是通过在构建过程中监视目标目录生成的。文件眨眼就会存在,然后一会儿就消失了。

更奇怪的是,如果我第二次运行./gradlew assembleDebug构建成功!

如何防止删除生成的PNG并确保processDebugResources可以在不必运行两次构建的情况下查看它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-28 18:48:15

原来有两个小虫子和一个大虫子。

一个小错误是Lance Java指出:目录创建是在配置阶段,而不是在执行阶段。另一个小错误是,它应该连接到generateDebugResources,而不是generateDebugAssets。然而,修复这些较小的bug并不能解决问题。

最大的错误是这些文件被写入到一个子树中,该子树也被另一个任务写入。我这么做是因为我不知道其他方法如何将文件收集起来以便包含在程序集中,但这不是正确的方法,因为写入子树的其他任务有时会踩在文件上(取决于执行的任务的顺序),从而导致它们“消失”。

要解决所有这些问题,第一步是为我们的任务选择一个不干扰其他任务的新输出目录:

代码语言:javascript
复制
def fromSvgDir = file("$buildDir/generated/fromSvg/")

然后,我们将它添加到srcDirs for res中,在build.gradle文件顶部附近的现有android块中:

代码语言:javascript
复制
sourceSets {
    main {
        res {
            srcDirs += fromSvgDir
        }
    }
}

最后,让我们的任务使用该目录,并修复另外两个bug:

代码语言:javascript
复制
task createIcon(type:Exec) {
    def outdir = file("$fromSvgDir/drawable-ldpi/")
    outputs.dir(outdir)
    doFirst {
        outdir.mkdirs()
    }
    def svg = file('src/images/ic_launcher.svg')
    inputs.source(svg)
    def png = file("$outdir/ic_launcher.png")
    outputs.file(png)
    commandLine "$workingDir/svgToPng.sh", svg, png
}

tasks.whenTaskAdded{ t ->
      if(t.name.equals("generateDebugResources")){
          t.dependsOn createIcon
      }
}

这是可靠的工作,也有一个优点,生成的PNGs将通过PNG cruncher,就像非生成的PNGs。

票数 1
EN

Stack Overflow用户

发布于 2016-03-27 15:09:22

我认为您的问题是在configuration阶段而不是execution阶段创建目录(更多信息这里)。

试一试:

代码语言:javascript
复制
task createIcon(type:Exec) {
    def svg = 'src/images/ic_launcher.svg'
    def outdir = file("$buildDir/intermediates/res/merged/debug/drawable-ldpi/")
    def png = new File(outdir, "ic_launcher.png")
    inputs.file(svg)
    outputs.dir(outdir)
    commandLine "$workingDir/pngToSvg.sh", png, svg
    doFirst {
        outdir.mkdirs()
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36230047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档