public AdbShellProcess(final AndroidDevice device, final AndroidProcessBuilder builder) { this.device = device; this.builder = builder; this.workingDir = device.getTempDir() + "/" + UUID.randomUUID(); this.device.deleteOnClose(this.workingDir); this.stdErr = builder.redirectErrorStream() ? AdbShellStream.getNull() : AdbShellStream.get(builder.redirectError(), System.err); /* Our exit code future */ this.exitFuture = SettableFuture.create(); /* Set up a service that just maps to our own functions */ this.service = new AbstractExecutionThreadService() { @Override protected void startUp() throws IOException { AdbShellProcess.this.startUp(); } @Override protected void run() throws IOException, InterruptedException { AdbShellProcess.this.run(); } @Override protected void shutDown() { AdbShellProcess.this.shutDown(); } }; service.addListener(new Service.Listener() { @Override public void failed(final Service.State from, final Throwable failure) { AdbShellProcess.this.onFail(failure); } }, MoreExecutors.sameThreadExecutor()); service.startAsync(); }