在我的Android Studio/gradle build中,我试图自动生成我的应用程序图标。生成图标图像(PNG)的任务正在正确的时间运行,但图像在消耗它的任务运行之前正在被删除。在稍后的任务可以使用它们之前,如何阻止gradle删除我的中间文件?
这是什么,我已经添加到我的app/build.gradle
这说明该问题的简化版本:如果我运行./gradlew clean
然后./gradlew assembleDebug
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
}
}
,我可以看到我的createIcon
任务的输出文件, “app/build/intermediates/res/merged/debug/drawable-ldpi/ic_launcher.png”被创建,然后很快删除。我从gradlew以下的输出:
: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
值我AndroidManifest.xml
),这应该对应于的地方,我正在生成PNG。
请注意,我已经确认PNG不仅是从控制台输出中的“位图另存为”行生成的,还可以通过在构建过程中观看目标目录来生成。该文件眨眼间存在,然后稍后消失。
即使比这更奇怪,如果我第二次运行./gradlew assembleDebug
构建成功!
如何防止我的生成的PNG被删除,并确保processDebugResources
可以看到它,而无需运行我的构建两次?
您应该赞成项目对象上的[file](https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html#file(java.lang.Object))便利方法,而不是明确实例化一个文件对象。例如'def fromSvgDir = file(“$ buildDir/generated/fromSvg /”)''而不是'def fromSvgDir = new File(buildDir,“generated/fromSvg /”)' –
@LanceJava谢谢。我对gradle(和groovy)相当陌生,所以我还不熟悉所有的最佳实践。我已根据您的建议更新了答案。 –