2015-10-16 61 views
1

我有一个系统,经过一些用户输入后,我打电话os.system("./gradlew assembleDebug ")来生成APK。在此之后,定义了一个函数用于下载APK,该函数将被调用。这一切在当地环境中运作良好。但是在我的AWS EC2实例中,前者的调用不是阻塞的,即使在APK生成过程中也会调用下载apk函数,这显然会失败。我在我的EC3实例上使用ngnix。成功生成apk后运行python脚本

我想在我的apk成功生成后调用python脚本。

这是在我的build.gradle文件中。

task generateSources << { 
     def script = "python downloadAPK.py".execute() 
    } 

gradle.projectsEvaluated { 
    compileJava.dependsOn(generateSources) 
} 

我得到这个错误错误:(84,0)在项目':app'上找不到属性'compileJava'。

无论如何,我认为这不会帮助我,因为我不确定这是否会在APK生成后运行。所以我看到两件事情可以在这里完成:

  1. 配置ngnix或其他在我的实例,这使得前者的呼叫是阻塞的。
  2. 生成APK后调用python脚本。可以使用assembleDebug命令并在构建成功后调用python脚本。

请让我知道哪一个是更好的方法,以及如何去做。

回答

0

这实际上是一个常规技巧。 GString#execute()默认情况下未被阻止。不过,我们可以通过等待exitValue来阻止它。

所以,你的代码会,如果你改变

task generateSources << { 
    def script = "python downloadAPK.py".execute() 
} 

等待Process又让完成任务

task generateSources(dependsOn: assembleDebug) << { 
    def process = "python downloadAPK.py".execute() 
    // Wait till the process completes before continuing 
    int exitValue = process.waitFor() 
    println "Process exited with value $exitValue" 
} 

然后之前结束的时候,你只构建运行gradlew generateSources工作,因为这项任务依赖在assembleDebug运行第一个apk将始终在任务运行之前生成。这可能也意味着Process#waitFor是没有意义的,因为它在APK生成后执行

+0

谢谢。但是我怎么知道这个任务会在构建成功后被调用? –

+0

@HarshVardhan,已更新答案以添加dependsOn参数来创建任务。或者,不要提供作为参数,你可以执行'generateSources.dependsOn(assembleDebug)' – JBirdVegas