我正在尝试在build.gradle中编写一个在所有连接的设备上执行shell命令的任务。但是,当我运行我的任务时,我得到了臭名昭着的“连接多个设备”错误。
task(myTask, type: Exec) {
doFirst {
println 'myTask'
commandLine 'adb', 'shell', 'my command'
}
}
这是可以理解的,因为我没有指定使用-s
运行哪个设备。但是,我注意到installDebug
任务将在所有连接的设备上执行其命令(在所有设备上安装debug .apk)。
Android插件中是否有API返回我可以迭代的设备ID集合?
答案 0 :(得分:4)
是的。您可以查看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的getter也可以在上面的循环中使用:
project.exec {
executable = android.getAdbExe()
args '-s'
args "$device.serialNumber"
}
答案 1 :(得分: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)
}
}
}
其中&#34;输入keyevent 26&#34;对应于shell命令./adb shell input keyevent 26.
如果您想使用shell的输出,可以使用下面的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()
收集的窗口动画比例的值。