在我的Android /gradle构建中,我试图自动生成我的应用程序图标。生成图标映像的任务( PNG)是在正确的时间运行的,但是在使用它运行的任务之前正在删除该图像。
这是我添加到我的app/build.gradle中的一个简化版本,它说明了这个问题:
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得到以下输出:
: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可以在不必运行两次构建的情况下查看它?
发布于 2016-03-28 18:48:15
原来有两个小虫子和一个大虫子。
一个小错误是Lance Java指出:目录创建是在配置阶段,而不是在执行阶段。另一个小错误是,它应该连接到generateDebugResources,而不是generateDebugAssets。然而,修复这些较小的bug并不能解决问题。
最大的错误是这些文件被写入到一个子树中,该子树也被另一个任务写入。我这么做是因为我不知道其他方法如何将文件收集起来以便包含在程序集中,但这不是正确的方法,因为写入子树的其他任务有时会踩在文件上(取决于执行的任务的顺序),从而导致它们“消失”。
要解决所有这些问题,第一步是为我们的任务选择一个不干扰其他任务的新输出目录:
def fromSvgDir = file("$buildDir/generated/fromSvg/")然后,我们将它添加到srcDirs for res中,在build.gradle文件顶部附近的现有android块中:
sourceSets {
main {
res {
srcDirs += fromSvgDir
}
}
}最后,让我们的任务使用该目录,并修复另外两个bug:
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。
发布于 2016-03-27 15:09:22
我认为您的问题是在configuration阶段而不是execution阶段创建目录(更多信息这里)。
试一试:
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()
}
}https://stackoverflow.com/questions/36230047
复制相似问题