in src/com/facebook/buck/cli/AdbCommandRunner.java [199:265]
protected boolean adbCall(AdbOptions options,
TargetDeviceOptions deviceOptions,
ExecutionContext context,
AdbCallable adbCallable) {
// Initialize adb connection.
AndroidDebugBridge adb = createAdb(context);
if (adb == null) {
console.printBuildFailure("Failed to create adb connection.");
return false;
}
// Build list of matching devices.
List<IDevice> devices = filterDevices(adb.getDevices(), options, deviceOptions);
if (devices == null) {
return false;
}
int adbThreadCount = options.getAdbThreadCount();
if (adbThreadCount <= 0) {
adbThreadCount = devices.size();
}
// Start executions on all matching devices.
List<ListenableFuture<Boolean>> futures = Lists.newArrayList();
ListeningExecutorService executorService =
listeningDecorator(newMultiThreadExecutor(getClass().getSimpleName(), adbThreadCount));
for (final IDevice device : devices) {
futures.add(executorService.submit(adbCallable.forDevice(device)));
}
// Wait for all executions to complete or fail.
List<Boolean> results = null;
try {
results = Futures.allAsList(futures).get();
} catch (ExecutionException ex) {
console.printBuildFailure("Failed: " + adbCallable);
ex.printStackTrace(console.getStdErr());
return false;
} catch (InterruptedException ex) {
console.printBuildFailure("Interrupted.");
ex.printStackTrace(console.getStdErr());
return false;
} finally {
executorService.shutdownNow();
}
int successCount = 0;
for (Boolean result : results) {
if (result) {
successCount++;
}
}
int failureCount = results.size() - successCount;
// Report results.
if (successCount > 0) {
console.printSuccess(
String.format("Succesfully ran %s on %d device(s)", adbCallable, successCount));
}
if (failureCount > 0) {
console.printBuildFailure(
String.format("Failed to %s on %d device(s).", adbCallable, failureCount));
}
return failureCount == 0;
}