/** * This method extracts a port number from the serial number of a device. It assumes that the device name is of format * [xxxx-nnnn] where nnnn is the port number. * * @param device The device to extract the port number from. * @return Returns the port number of the device */ private int extractPortFromDevice(AndroidDevice device) { String portStr = device.getSerialNumber().substring(device.getSerialNumber().lastIndexOf("-") + 1); if (portStr != null && portStr.length() > 0) { try { return Integer.parseInt(portStr); } catch (NumberFormatException e) { return -1; } } // If the port is not available then return -1 return -1; }
/** * This method extracts a port number from the serial number of a device. It assumes that the device name is of format * [xxxx-nnnn] where nnnn is the port number. * * @param device The device to extract the port number from. * @return Returns the port number of the device */ private int extractPortFromDevice(AndroidDevice device) { String portStr = device.getSerialNumber().substring(device.getSerialNumber().lastIndexOf("-") + 1); if (portStr != null && portStr.length() > 0) { try { return Integer.parseInt(portStr); } catch (NumberFormatException e) { return -1; } } // If the port is not available then return -1 return -1; }
@Override public void deviceConnected(IDevice delegate) { this.delegate = delegate; device = new AndroidDeviceImpl(delegate); logger.log(Level.INFO, "Discovered an emulator device id={0} connected to ADB bus", device.getSerialNumber()); }
private void unlockEmulator(final DeviceConnectDiscovery deviceDiscovery, final ProcessExecutor executor) { final String adbPath = androidSDK.get().getAdbPath(); final AndroidDevice connectedDevice = deviceDiscovery.getDiscoveredDevice(); final String serialNumber = connectedDevice.getSerialNumber(); try { executor.execute(Collections.<String, String> emptyMap(), adbPath, "-s", serialNumber, "shell", "input", "keyevent", "82"); executor.execute(Collections.<String, String> emptyMap(), adbPath, "-s", serialNumber, "shell", "input", "keyevent", "4"); } catch (final Exception ignore) { // intentionally left empty } }
@Override public void deviceDisconnected(IDevice delegate) { if (delegate.isEmulator()) { if (delegate.getAvdName().equals(this.device.getAvdName())) { offline = true; logger.fine("Device id=" + delegate.getAvdName() + " disconnected from ADB bus."); } } else { if (delegate.getSerialNumber().equals(this.device.getSerialNumber())) { offline = true; logger.fine("Device id=" + delegate.getSerialNumber() + " disconnected from ADB bus."); } } }
private void loadProcessMap() { try { processMap.clear(); Command command = new Command(); command .add(androidSDK.getAdbPath()) .add("-s") .add(androidDevice.getSerialNumber()) .add("shell") .add("ps"); ProcessBuilder processBuilder = new ProcessBuilder(command.getAsList()); Process process = processBuilder.start(); // Ugly pattern, which helps us parse PS table Pattern pattern = Pattern.compile(".*?\\s+([0-9]+)\\s+[0-9]+\\s+[0-9]+\\s+[0-9]+\\s+[0-9a-f]+\\s+[0-9a-f]+\\s.?\\s(.*)"); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null; while((line = reader.readLine()) != null) { Matcher matcher = pattern.matcher(line); if(!matcher.matches()) { continue; } Integer processId = Integer.valueOf(matcher.group(1)); String processName = matcher.group(2); processMap.put(processId, processName); } } catch (IOException e) { logger.log(Level.SEVERE, "Couldn't load process map!", e); } }
public Writer prepareWriter() { // TODO implement log4j support if(configuration.getLogtype().equals(LogType.OUTPUT)) { String prefix = configuration.isLogSerialId() ? "LOGCAT (" + androidDevice.getSerialNumber() + "): " : "LOGCAT: "; return new LogcatToConsoleWriter(prefix); } else if(configuration.getLogtype().equals(LogType.LOGGER)) { String name = configuration.isLogSerialId() ? "LOGCAT (" + androidDevice.getSerialNumber() + ")" : "LOGCAT"; return new LogcatToLoggerWriter(Logger.getLogger(name)); } else if(configuration.getLogtype().equals(LogType.FILE)) { logPath += androidDevice.getSerialNumber(); logPath += androidDevice.getSerialNumber();
public Writer prepareWriter() { // TODO implement log4j support if (configuration.getLogType().equals(LogType.OUTPUT)) { String prefix = configuration.isLogSerialId() ? "LOGCAT (" + androidDevice.getSerialNumber() + "): " : "LOGCAT: "; return new LogcatToConsoleWriter(prefix); } else if (configuration.getLogType().equals(LogType.LOGGER)) { String name = configuration.isLogSerialId() ? "LOGCAT (" + androidDevice.getSerialNumber() + ")" : "LOGCAT"; return new LogcatToLoggerWriter(Logger.getLogger(name)); } else if (configuration.getLogType().equals(LogType.FILE)) { logPath += androidDevice.getSerialNumber(); logPath += androidDevice.getSerialNumber();
private AndroidDevice getPhysicalDevice() throws AndroidExecutionException { String serialId = configuration.get().getSerialId(); List<AndroidDevice> devices = androidBridge.get().getDevices(); if (devices == null || devices.size() == 0) { throw new AndroidExecutionException("There are no devices on the Android bridge."); } for (AndroidDevice device : devices) { if (!device.isEmulator() && serialId.equals(device.getSerialNumber())) { logger.info("Detected physical device with serial ID " + serialId + "."); return device; } } throw new AndroidExecutionException("Unable to get device with serial ID " + serialId + "."); }
private AndroidDevice getPhysicalDevice() throws AndroidExecutionException { String serialId = configuration.get().getSerialId(); List<AndroidDevice> devices = androidBridge.get().getDevices(); if (devices == null || devices.size() == 0) { throw new AndroidExecutionException("There are no physical devices on the Android bridge."); } for (AndroidDevice device : devices) { if (!device.isEmulator() && serialId.equals(device.getSerialNumber())) { logger.log(Level.INFO, "Connecting to physical device with serial ID {0}", serialId); return device; } } throw new AndroidExecutionException("Unable to get device with serial ID " + serialId + "."); }
logger.severe("Unable to retrieve port to stop emulator " + device.getSerialNumber() + "."); return false; } else { logger.info("Stopping emulator " + device.getSerialNumber() + " via port " + devicePort + ".");
Command command = new CommandBuilder(androidSDK.getAdbPath()) .parameter("-s") .parameter(androidDevice.getSerialNumber()) .parameter("logcat") .parameter("-c") .parameter(androidDevice.getSerialNumber()) .parameter("logcat") .parameter("*:" + configuration.getLogLevel())
logger.log(Level.INFO, "Serial number: " + connectedDevice.getSerialNumber()); final String serialNumber = connectedDevice.getSerialNumber(); logger.log(Level.INFO, "serial number: " + serialNumber);
.add(androidSDK.getAdbPath()) .add("-s") .add(androidDevice.getSerialNumber()) .add("logcat") .add("-c"); .add(androidSDK.getAdbPath()) .add("-s") .add(androidDevice.getSerialNumber()) .add("logcat") .add("*:" + configuration.getLogLevel());
private void loadProcessMap() { try { processMap.clear(); Command command = new CommandBuilder(androidSDK.getAdbPath()) .parameter("-s") .parameter(androidDevice.getSerialNumber()) .parameter("shell") .parameter("ps") .build(); List<String> runningProcesses = Spacelift.task(CommandTool.class) .addEnvironment(androidSDK.getPlatformConfiguration().getAndroidSystemEnvironmentProperties()) .command(command).execute().await().output(); Pattern pattern = Pattern .compile(".*?\\s+([0-9]+)\\s+[0-9]+\\s+[0-9]+\\s+[0-9]+\\s+[0-9a-f]+\\s+[0-9a-f]+\\s.?\\s(.*)"); for(String line: runningProcesses) { Matcher matcher = pattern.matcher(line); if (!matcher.matches()) { continue; } Integer processId = Integer.valueOf(matcher.group(1)); String processName = matcher.group(2); processMap.put(processId, processName); } } catch (ExecutionException e) { logger.log(Level.SEVERE, "Couldn't load process map!", e); } } }
@Override protected Boolean process(AndroidDevice device) throws Exception { final DeviceDiscovery deviceDiscovery = new DeviceDiscovery(); deviceDiscovery.setDevice(device); AndroidDebugBridge.addDeviceChangeListener(deviceDiscovery); try { getExecutionService().execute(sendEmulatorCommand(extractPortFromDevice(device), "kill")).awaitAtMost(10, TimeUnit.SECONDS); } catch (ExecutionException ex) { throw new AndroidExecutionException(String.format("Sending of kill command to emulator {0} was not completed " + "successfully in 10 seconds.", device.getSerialNumber()), ex); } boolean shuttedDown = false; try { shuttedDown = getExecutionService().execute(new Callable<Boolean>() { @Override public Boolean call() throws Exception { return deviceDiscovery.isOffline(); } }).reexecuteEvery(1, TimeUnit.SECONDS).until(countdown, new ExecutionCondition<Boolean>() { @Override public boolean satisfiedBy(Boolean offline) throws ExecutionException { return offline; } }); } catch (ExecutionException ex) { throw new AndroidExecutionException(String.format("Unable to get the emulator {0} down", device.getSerialNumber()), ex); } AndroidDebugBridge.removeDeviceChangeListener(deviceDiscovery); return shuttedDown; }
/** * Installs resigned Selendroid server which reflects Android application meant to be instrumented into Android device. * * @param deployment deployment to install to Android device * @throws IllegalArgumentException if {@code deployment} or {@code SelendroidDeployment#getResigned()} is a null object * @throws AndroidExecutionException */ public void install(SelendroidDeployment deployment) { Validate.notNull(deployment, "Selendroid deployment to deploy can not be a null object!"); Validate.notNull(deployment.getResigned(), "Resigned Selendroid application to deploy can not be a null object!"); Command selendroidInstallCommand = new Command(); selendroidInstallCommand.add(sdk.getAdbPath()) .add("-s") .add(device.getSerialNumber()) .add("install") .add(deployment.getResigned().getAbsolutePath()); logger.fine("Selendroid server installation command: " + selendroidInstallCommand.toString()); try { executor.execute(selendroidInstallCommand.getAsArray()); } catch (InterruptedException ex) { throw new AndroidExecutionException("Selendroid installation was interrupted."); } catch (ExecutionException ex) { throw new AndroidExecutionException("Unable to execute Selendroid installation process."); } if (!device.isPackageInstalled(deployment.getServerBasePackage())) { throw new AndroidExecutionException("Modified Selendroid server was not installed on device."); } }
.parameter(device.getSerialNumber()) .parameter("install") .parameter(deployment.getResignedApk().getAbsolutePath()) + device.getSerialNumber() + ".");
.addEnvironment(sdk.getPlatformConfiguration().getAndroidSystemEnvironmentProperties()) .command(new CommandBuilder(androidSDK.get().getAdbPath()) .parameters("-s", androidDevice.getSerialNumber(), "shell", "getprop")) .execute().until(watch, EmulatorStatusCheckTask.isBootedCondition); .serialNumber(androidDevice.getSerialNumber()) .sdk(sdk) .execute().await();