Ejecute la tarea antes de la compilación mediante el complemento Android Gradle

Tengo un archivo build.gradle muy simple con el siguiente contenido:

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.4.1' } } apply plugin: 'android' android { buildToolsVersion "17.0.0" compileSdkVersion 17 sourceSets { main { manifest.srcFile 'AndroidManifest.xml' res.srcDirs = ['res'] assets.srcDirs = ['assets'] } } } task generateSources { doFirst { def script = "python GenerateSources.py".execute() script.in.eachLine {line -> println line} script.err.eachLine {line -> println "ERROR: " + line} script.waitFor() } } 

Lo que quiero es ejecutar la tarea generateSources antes de iniciar la compilación de java. He encontrado varias soluciones de cómo hacerlo, como compileJava.dependsOn("generateSources") , pero lamentablemente dan un error:

 A problem occurred evaluating root project 'Android'. > Could not find property 'compileJava' on root project 'Android'. 

No sé Gradle y no puedo entender lo que está mal con este código. Así que me gustaría saber cómo puedo solucionar este error.

Aparentemente, el complemento de android no agrega una tarea de compileJava java (como el plugin de java ). Puede comprobar qué tareas están disponibles con gradle tasks --all , y elegir la correcta para su declaración de dependencia (de lo contrario correcta).

EDITAR:

Al parecer, el plugin de android difiere la creación de tareas de tal manera que no se puede acceder con impaciencia como de costumbre. Una forma de superar este problema es aplazar el acceso hasta el final de la fase de configuración :

 gradle.projectsEvaluated { compileJava.dependsOn(generateSources) } 

Lo más probable es que hay una forma más idiomática de resolver su caso de uso, pero rápidamente la navegación de los documentos de complemento de Android no pude encontrar uno.

La forma correcta de ejecutar una tarea antes de la compilación de Java en Android es hacer que una tarea de compilación para cada variante dependa de su tarea.

 afterEvaluate { android.applicationVariants.all { variant -> variant.javaCompiler.dependsOn(generateSources) } } 

Puede ver la ejecución de la tarea en la tarea de ejecución de terminal, por ejemplo, gradle assemble . Prueba este, se inicia prácticamente antes de nada.

 gradle.projectsEvaluated { preBuild.dependsOn(generateSources) } 

Editar , esto puede no funcionar en Android Studio, ya que el Android Gradle DSL no tiene un método projectsEvaluated .

Prueba esto:

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.4.1' } } apply plugin: 'android' android { buildToolsVersion "17.0.0" compileSdkVersion 17 sourceSets { main { manifest.srcFile 'AndroidManifest.xml' res.srcDirs = ['res'] assets.srcDirs = ['assets'] } } } task generateSources { def script = "python GenerateSources.py".execute() script.in.eachLine {line -> println line} script.err.eachLine {line -> println "ERROR: " + line} script.waitFor() } project.afterEvaluate { preBuild.dependsOn generateSources } clean.dependsOn generateSources clean.mustRunAfter generateSources 

Las dos últimas líneas son opcionales: invocarán la tarea "generateSources" al ejecutar un gradle clean

  • Edición de Kotlin Gradle
  • Gradle Duplicate Entry
  • Cómo agregar la dependencia de compilación a la ruta de clase javadoc en gradle
  • Problemas al iniciar error en Android Studio cuando packageDebug en Max OS X
  • Cómo utilizar opencv en android studio utilizando gradle build tool?
  • Cómo incluir dependencias de maven remoto en una biblioteca de Android
  • ¿Cómo depurar la variante de construcción específica del proyecto Android Gradle en IntelliJ IDEA?
  • Uso de la biblioteca personal alojada en github como dependencia gradle
  • Generación dinámica de sabores de productos
  • Android Studio Gradle Archivo no válido Manifest.xml
  • facebook screenshot-tests-para-android thow NullPointer en hacer captura de pantalla
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.