这个页面将用于记录我在使用gradle的过程中遇到过的一些问题,有些可能是未解决的问题,如果有哪位大神知道解决方案,可以给小弟支几招~

1、在gradle的build.gradle文件中无法通过commandLine的方式调动系统中的命令;

描述:其实是我想在gradle命令中运行一个protoc命令,用于生成protobuffer的代码,protoc已经安装,并可以在系统终端中正常执行。 代码如下: task autogen(type : Exec) { File file = file(‘../lib_protocols/build/generated/source/autogen’); if (!file.exists()) { file.mkdirs() } commandLine ‘protoc’,’–java_out=../lib_protocols/build/generated/source/autogen’,’./autogen/Racecar.proto’ }

运行提示错误如下:

:lib_protocols:prepareComAndroidSupportAnimatedVectorDrawable2321Library (Thread[Task worker Thread 2,5,main]) completed. Took 0.046 secs.

FAILURE: Build failed with an exception.

  • What went wrong: Execution failed for task ‘:app:autogen’.

    A problem occurred starting process ‘command ‘protoc’’

  • Try: Run with –debug option to get more log output.

  • Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ‘:app:autogen’. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:66) at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53) at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40) Caused by: org.gradle.process.internal.ExecException: A problem occurred starting process ‘command ‘protoc’’ at org.gradle.process.internal.DefaultExecHandle.setEndStateInfo(DefaultExecHandle.java:197) at org.gradle.process.internal.DefaultExecHandle.failed(DefaultExecHandle.java:327) at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:86) … 2 more Caused by: net.rubygrapefruit.platform.NativeException: Could not start ‘protoc’ at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:27) at net.rubygrapefruit.platform.internal.WrapperProcessLauncher.start(WrapperProcessLauncher.java:36) at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:68) … 2 more Caused by: java.io.IOException: Cannot run program “protoc” (in directory “/Volumes/Development/repository/cornerstone-repository/bemetoy/BpApp/android/trunk/BpApp/app”): error=2, No such file or directory at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:25) … 4 more Caused by: java.io.IOException: error=2, No such file or directory … 5 more

BUILD FAILED

问题原因:暂时未查明,猜测是gradle命令行运行的环境和系统的终端不同,protoc命令并不在gradle命令行环境中。

解决方案:期待大神指教~

2、自定义的Task,只被执行一次的问题

描述:自定义的Task,运行过一次后,一直提示UP-TO-DATE,然后就不在跑Task里面的逻辑了

原因:经过查明,Gradle Task的生命周期分为initialization(初始化)、configuration(配置) 和execution(运行) 。Task可以定义Input和Output,Gradle在执行时会比对Input和Output,如果两者都没有改动,则会认为该Task是最新的状态,就不会执行了

解决方案:根据具体情况设置Input和Output,可以参考下面的这篇文章,适当的设置TaskOutputs.upToDateWhen(),便可满足需求了。 http://wiki.jikexueyuan.com/project/gradle/detailed-task.html

3、下一个问题…

描述:简单描述

原因:简述原因

解决方案:简述方案…