2017-01-31 8 views
1

Я пишу задачу градиента, чтобы установить apk для эмуляторов до запуска тестов эспрессо.Задача Gradle с использованием adb для установки apk не выполняется

Это задача, которую я имею до сих пор.

task installButlerApk { 

doLast { 
    println "Verifying test-butler installation in emulators" 

    final adb = "$android.sdkDirectory.absolutePath/platform-tools/adb" 

    final String[] split = ["$adb", "devices", "-l"].execute().text.split("\\r?\\n") 

    split.each { 

     if (it.isEmpty()) 
      return; 

     println "Emulator: $it" 

     final emu = it.split("\\s")[0] 
     checks whether the APK is already installed 
     if (["$adb", "-s", "$emu", "shell", "pm", "list", "packages"].execute().text.contains(butlerPackage)) 
      return; 

     final installResult = ["$adb", "-s", "$emu", "install", "$butlerApkPath"].execute().text 

     if (!installResult.contains("Success")) 
      println "Could not install APK. Install output:\n$installResult" 

     else 
      println "Installed $butlerApkPath in $emu successfully" 

    } 
} 

}

Однако когда я запустить его с помощью терминала задание заканчивается замораживание. Я не знаю, почему. Я сделал некоторые исследования об этом, и однажды я подумал, что команда, передаваемая процессу ProcessGroovyMethods, терпит неудачу, потому что она передается как строка (execute(String self)), поэтому я затем использовал представление массива execute (execute(String[] commandArray)), чтобы узнать, это будет работать, но я все равно получаю тот же результат, поэтому я просто прошу кого-то, у кого есть опыт написания этих задач, чтобы оказать мне некоторую помощь. До сих пор я печатаю результат команды, и она не обнаружила никаких ошибок. Это просто застряло в процессе строительства часами.

Microsoft Windows [Version 6.3.9600] 
(c) 2013 Microsoft Corporation. All rights reserved. 

C:\Users\Joel\Documents\Projects\Forms>gradlew installButlerApk 
Picked up _JAVA_OPTIONS: -XX:ParallelGCThreads=2 
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: 
https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html. 
Incremental java compilation is an incubating feature.            
:app:installButlerApk                     
Verifying test-butler installation in emulators 
Emulator: List of devices attached 
> Building 0% > :app:installButlerApk 

ответ

2

Ну, это ожидаемое поведение.

Если вы посмотрите на ваш вывод внимательно, вы видите

Emulator: Список устройств прилагается

Так следующий код:

println "Emulator: $it" 

выходов, которые выстилают я процитировал

final emu = it.split("\\s")[0] 

занимает первое пространство, отделенное маркер, который List

checks whether the APK is already installed 

это даже не компилируется, но я предполагаю, что вы просто забыли комментарий символы, которые вы добавили в вопросе как объяснение

if (["$adb", "-s", "$emu", "shell", "pm", "list", "packages"].execute().text.contains(butlerPackage)) 
     return; 

Теперь вы execute adb -s List shell pm list
Выполнено вручную эти два раза печатает error: device not found для меня, а затем выходы, поэтому ваше состояние contains равно false, а return не сделано.

final installResult = ["$adb", "-s", "$emu", "install", "$butlerApkPath"].execute().text 

Теперь вы выполняете adb -s List install butler.apk
Выполненный вручную это три раза печатает error: device not found, затем один раз - waiting for device -, а затем сидит там ждет, пока вы не отмените его, или устройство с серийным номером List становится доступным, который, конечно, никогда не будет и, таким образом, ваша задача висит, пока вы ее не убьете.

Вы должны пропустить строку заголовка, когда работаете со списком устройств, поскольку это, конечно, не устройство.

Помимо этого, вы можете, конечно, использовать стандартные способы Groovy для выполнения внешних команд. Тем не менее, в то время как в Gradle, я предпочел бы использовать варианты Gradle.Если вы хотите, чтобы выполнить одно это будет задачей типа Exec, если вы хотите выполнить несколько вещей, как в вашем случае, это является Project.exec() или Script.exec() методов, так что вы могли бы сделать что-то вроде

def output 
new ByteArrayOutputStream().withStream { baos -> 
    exec { 
     executable adb 
     args "-s", emu, "shell", "pm", "list", "packages" 
     standardOutput os 
    }.assertNormalExitValue() 
    output = baos.toString() 
} 
if (output.contains(butlerPackage)) { 
    return 
} 

exec { 
    executable adb 
    args "-s", emu, "install", butlerApkPath 
}.assertNormalExitValue()