2015-10-16 70 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