在 AS 3.0 升级后构建应用时"Cannot create directory"



通过运行构建时/gradlew使用下面的堆栈跟踪检查构建是否失败。我已经将面临这个问题的gradle更新为4.1,将AS更新为3.0。

  • 出了什么问题:任务":app:packageDefaultGlobalIndiaOnlyDebug"的执行失败。

    无法创建目录C:\Users\<>\<>\<>\app\build\outputs\apk\defaultGlobalIndiaOnly\debug\C:\Users\<>\<>\<>\app\build\outputs\apk\defaultGlobalIndiaOnly\debug\C:\Users\<>\<>\<>\app\build\outputs\apk\defaultGlobalIndiaOnly\debug

  • 尝试:使用--info or --debug选项运行以获得更多日志输出。

  • 例外情况是:

org.gradle.api.tasks.TaskExecutionException:任务":app:packageDefaultGlobalIndiaOnlyDebug"的执行失败。位于org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)位于org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)位于org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUptoDateTaskExecutor.java:63)位于org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutput CachingstateExecuter.java:54)网址:org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)位于org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmpitySourceFilesTaskexecuter.java:88)位于org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)位于org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.exexecute(SkipTaskWithNoActionsExecuter.java:52)位于org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnyIfTaskexecuter.java:54)位于org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)位于org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExcessionTaskExecuter.java:34)位于org.gradle.expension.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)位于org.gradle.internal.prounce.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutior.java:336)位于org.gradle.internal.prounce.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutior.java:328)网址:org.gradle.internal.prounce.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)网址:org.gradle.internal.prounce.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)位于org.gradle.expension.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)位于org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)网址:org.gradle.expension.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124)网址:org.gradle.expension.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80)在org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute上(DefaultTaskPlanExecutor.java:105)在org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute上(DefaultTaskPlanExecutor.java:99)网址:org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625)位于org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580)网址:org.gradle.expension.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99)网址:org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)网址:org.gradle.internal.concurrent.ManagedExecutiorImpl$1.run(ManagedExecutiorimpl.java:46)位于org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)由:org.grade.tooling.BuildException引起:无法创建目录C:\Users\<>\<>\<>\app\build\outputs\apk\defaultGlobalIndiaOnly\debug\C:\Users\<>\<>\<>\app\build\outputs\apk\defaultGlobalIndiaOnly\debug\C:\Users\<>\<>\<>\app\build\outputs\apk\defaultGlobalIndiaOnly\debug网址:com.android.build.gradle.internal.scope.OutputScopeLambda$parallelForEachOutput$10(OutputScop.java:241)网址:com.android.build.gradle.internal.scope.OutputScope.collelForEachOutput(OutputScop.java:236)网址:com.android.build.gradle.internal.scope.OutputScope.collelForEachOutput(OutputScop.java:197)网址:com.android.build.gradle.internal.scope.OutputScope.collelForEachOutput(OutputScop.java:181)网址:com.android.build.gradle.tasks.PackageAndroidArtifact.doFullTaskAction(PackageAndroidArtifact.java:471)网址:com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:109)网址:org.gradle.internal.reflect.JavaMethod.reinvoke(JavaMethod.java:73)位于org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:173)位于org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execure(DefaultTaskClassInfoStore.java:134)位于org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execure(DefaultTaskClassInfoStore.java:121)位于org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsSaskExecuter.java:122)位于org.gradle.internal.prounce.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutior.java:336)位于org.gradle.internal.prounce.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutior.java:328)网址:org.gradle.internal.prounce.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)网址:org.gradle.internal.prounce.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)位于org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111)位于org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)…还有27个由以下原因引起:java.lang.RuntimeException:无法创建目录C:\Users\<>\<>\<>\app\build\outputs\apk\defaultGlobalIndiaOnly\debug\C:\Users\<>\<>\<>\app\build\outputs\apk\defaultGlobalIndiaOnly\debug\C:\Users\<>\<>\<>\app\build\outputs\apk\defaultGlobalIndiaOnly\debug网址:com.android.utils.FileUtils.mkdirs(FileUtils.java:215)网址:com.android.build.gradle.tasks.PackageAndroidArtifact.doTask(PackageAndroidArtifact.java:664)网址:com.android.build.gradle.tasks.PackageAndroidArtifact.splitFullAction(PackageAndroidArtifact.java:522)网址:com.android.build.gradle.internal.scope.OutputScopeLambda$parallelForEachOutput$6(OutputScop.java:186)网址:com.android.build.gradle.internal.scope.OutputScopeLambda$parallelForEachOutput$7(OutputScop.java:203)网址:com.android.build.gradle.internal.scope.OutputScopeLambda$null$8(OutputScope.java:225)网址:com.android.ide.common.internal.WaitableExecutitor.waitForAllTasks(WaitableExecutior.java:215)网址:com.android.build.gradle.internal.scope.OutputScope.collelForEachOutput(OutputScop.java:235)…还有42个

  • 获取更多帮助,请访问https://help.gradle.org

找到这个@https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html

在构建时修改变量输出可能不起作用

使用变体API来操作变体输出被新插件打破了。它仍然适用于简单的任务,例如在构建时更改APK名称,如下所示:

// If you use each() to iterate through the variant objects,
// you need to start using all(). That's because each() iterates
// through only the objects that already exist during configuration time—
// but those object don't exist at configuration time with the new model.
// However, all() adapts to the new model by picking up object as they are
// added during execution.
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${variant.name}-${variant.versionName}.apk"
}
}

但是,涉及访问outputFile对象的更复杂的任务不再有效。这是因为在配置阶段不再创建特定于变体的任务。这导致插件无法提前知道其所有输出,但这也意味着更快的配置时间。

相关内容

最新更新