2015-12-09 2 views
1

Я пытаюсь написать задачу в build.gradle, которая выполняет команды оболочки на всех подключенных устройствах. Однако, когда я запускаю свою задачу, я получаю печально известную ошибку, связанную с несколькими устройствами.Как запросить все подключенные устройства в build.gradle?

task(myTask, type: Exec) { 
    doFirst { 
     println 'myTask' 
     commandLine 'adb', 'shell', 'my command' 
    } 
} 

Это понятно, потому что я не уточнил, какое устройство для работы на с -s. Однако я заметил, что задача installDebug выполнит свои команды на всех подключенных устройствах (установите debug .apk на всех устройствах).

Есть ли API в плагине Android, который возвращает коллекцию идентификаторов устройств, которые я могу перебрать?

ответ

4

Yes.You может проверить Android Gradle плагин source here, где вы найдете следующее:

import com.android.ddmlib.AndroidDebugBridge 
import com.android.ddmlib.IDevice 

// ...  

AndroidDebugBridge.initIfNeeded(false /*clientSupport*/) 
AndroidDebugBridge bridge = AndroidDebugBridge.createBridge(android.getAdbExe().absolutePath, 
     false /*forceNewBridge*/) 

long timeOut = 30000 // 30 sec 
int sleepTime = 1000 
while (!bridge.hasInitialDeviceList() && timeOut > 0) { 
    sleep(sleepTime) 
    timeOut -= sleepTime 
} 
if (timeOut <= 0 && !bridge.hasInitialDeviceList()) { 
    throw new RuntimeException("Timeout getting device list.", null) 
} 
IDevice[] devices = bridge.devices 
if (devices.length == 0) { 
    throw new RuntimeException("No connected devices!", null) 
} 

File destination = project.file("$project.buildDir/outputs/screenshots") 
delete destination 

for (IDevice device : devices) { 
    // iterate over your devices here ;) 
} 

Также вы заметите, что есть геттер для ADB, так что вы можете использовать в цикле из выше:

project.exec { 
      executable = android.getAdbExe() 
      args '-s' 
      args "$device.serialNumber" 
} 
+0

Я смущен тем, как мы должны использовать это. Этот первый файл является частью источника плагина Gradle. Вы говорите, что нам нужно сделать свою собственную вилку плагина Android Gradle? Как мы получаем доступ к этому из 'build.gradle'? –

1

Старая нить, но, возможно, это помогает кому-то в какой-то момент.

В качестве David Medenjak уже упоминалось решение android.ddmlib. Вы можете использовать его как следующее:

В yourscript.gradle:

import com.android.ddmlib.AndroidDebugBridge 
import com.android.ddmlib.IDevice 
import com.android.ddmlib.NullOutputReceiver 

task pressPower { 

    description = "Press the power button of a device using the adb." 

    AndroidDebugBridge.initIfNeeded(false) 
    def bridge = AndroidDebugBridge.createBridge(android.adbExecutable.path, false) 

    doLast { 
     bridge.devices.each { 
      it.executeShellCommand("input keyevent 26", NullOutputReceiver.receiver) 
     } 
    } 
} 

В каком «вход KeyEvent 26» соответствует команде оболочки ./adb shell input keyevent 26.

Если вы хотите работать с выходом оболочки можно использовать CollectingOutputReceiver, как показано ниже:

import com.android.ddmlib.AndroidDebugBridge 
import com.android.ddmlib.IDevice 
import com.android.ddmlib.CollectingOutputReceiver 

task getAnimationValue { 

    description = "Get the Value for the window animation scale." 

    AndroidDebugBridge.initIfNeeded(false) 
    def bridge = AndroidDebugBridge.createBridge(android.adbExecutable.path, false) 
    def receiver = CollectingOutputReceiver.newInstance() 

    doLast{ 
     bridge.devices.each { 
      it.executeShellCommand("settings get global window_animation_scale", receiver) 
      println "Value: ${receiver.getOutput()}" 
     } 
    } 
} 

задача печатает значение для окна анимация масштаб собрал receiver.getOutput().

Смежные вопросы