String selector = arguments.next(); if (!selector.startsWith("--")) { logger.error( null /* throwable */, "Invalid parameter " + selector + ", expected a command switch"); return 1; logger.error( null /* throwable */, "Command switch " + selector + " has no value associated"); return 1; String value = arguments.next(); if (Strings.isNullOrEmpty(value)) { logger.error(null /* throwable */, "Empty value for switch " + selector); return 1; logger.error( null /* throwable */, "Invalid property setting, should be NAME=VALUE format"); return 1; invoker.setOverride(manifestSystemProperty, value.substring(value.indexOf('=') + 1)); } catch (IllegalArgumentException e) { logger.error( e, "Invalid property name " logger.error( null /* throwable */, "Invalid placeholder setting, should be NAME=VALUE format"); return 1;
/** * Prints a line to stderr. * This is protected so that it can be overridden in unit tests. * * @param format The string to be formatted. Cannot be null. * @param args Format arguments. */ protected void stderr(String format, Object...args) { mLog.error(null, format, args); }
private void error(String message) { if (logger != null) { logger.error(null, message); } else { System.err.println(message); } }
private void errorAndExit(String format, Object... args) { mSdkLog.error(null, format, args); exit(1); }
@VisibleForTesting protected void copyFile(File inputFile, File outputFile) { try { Files.createParentDirs(outputFile); Files.copy(inputFile, outputFile); } catch(IOException e) { LOGGER.error(e, "Cannot copy %1$s to back up folder, build will continue but " + "next time this file is modified will result in a cold swap.", inputFile.getAbsolutePath()); } }
@Override public void installPackage(@NonNull File apkFile, @NonNull Collection<String> options, int timeout, ILogger logger) throws DeviceException { try { iDevice.installPackage(apkFile.getAbsolutePath(), true /*reinstall*/, options.isEmpty() ? null : options.toArray(new String[options.size()])); } catch (Exception e) { logger.error(e, "Unable to install " + apkFile.getAbsolutePath()); throw new DeviceException(e); } }
@Override public void shutdown() { if (!mAaptProcesses.isEmpty()) { mLogger.warning("Process list not empty"); for (Map.Entry<String, AaptProcess> aaptProcessEntry : mAaptProcesses .entrySet()) { mLogger.warning("Thread(%1$s): queue not cleaned", aaptProcessEntry.getKey()); try { aaptProcessEntry.getValue().shutdown(); } catch (Exception e) { mLogger.error(e, "while shutting down" + aaptProcessEntry.getKey()); } } } mAaptProcesses.clear(); } };
@Override public void shutdown() { if (!mAaptProcesses.isEmpty()) { mLogger.warning("Process list not empty"); for (Map.Entry<String, AaptProcess> aaptProcessEntry : mAaptProcesses .entrySet()) { mLogger.warning("Thread(%1$s): queue not cleaned", aaptProcessEntry.getKey()); try { aaptProcessEntry.getValue().shutdown(); } catch (Exception e) { mLogger.error(e, "while shutting down" + aaptProcessEntry.getKey()); } } } mAaptProcesses.clear(); } };
@Override public void installPackage(@NonNull File apkFile, @NonNull Collection<String> options, int timeout, ILogger logger) throws DeviceException { try { iDevice.installPackage(apkFile.getAbsolutePath(), true /*reinstall*/, options.isEmpty() ? null : options.toArray(new String[options.size()])); } catch (Exception e) { logger.error(e, "Unable to install " + apkFile.getAbsolutePath()); throw new DeviceException(e); } }
@Override public void logError(@NonNull String s, @Nullable Throwable e) { mWrapped.error(e, s); }
@Override @Nullable public ClassReader loadClassBytes(@NonNull String className, @NonNull ILogger logger) { File outerClassFile = new File(binaryFolder, className + ".class"); if (outerClassFile.exists()) { logger.verbose("Parsing %s", outerClassFile); try(InputStream outerClassInputStream = new BufferedInputStream(new FileInputStream(outerClassFile))) { return new ClassReader(outerClassInputStream); } catch (IOException e) { logger.error(e, "Cannot parse %s", className); } } return null; } }
@Override public void creation(@NonNull Thread t) throws IOException { try { AaptProcess aaptProcess = new AaptProcess.Builder(mAaptLocation, mLogger).start(); assert aaptProcess != null; mLogger.verbose("Thread(%1$s): created aapt slave, Process(%2$s)", Thread.currentThread().getName(), aaptProcess.hashCode()); aaptProcess.waitForReady(); mAaptProcesses.put(t.getName(), aaptProcess); } catch (InterruptedException e) { mLogger.error(e, "Cannot start slave process"); e.printStackTrace(); } }
@Override public void creation(@NonNull Thread t) throws IOException { try { mLogger.verbose("Thread(%1$s): create aapt slave", Thread.currentThread().getName()); AaptProcess aaptProcess = new AaptProcess.Builder(mAaptLocation, mLogger).start(); assert aaptProcess != null; aaptProcess.waitForReady(); mAaptProcesses.put(t.getName(), aaptProcess); } catch (InterruptedException e) { mLogger.error(e, "Cannot start slave process"); e.printStackTrace(); } }
@Override public void installPackages(@NonNull List<File> splitApkFiles, @NonNull Collection<String> options, int timeoutInMs, ILogger logger) throws DeviceException { try { iDevice.installPackages(splitApkFiles, true /*reinstall*/, ImmutableList.copyOf(options), timeoutInMs, TimeUnit.MILLISECONDS); } catch (Exception e) { List<String> apkFileNames = Lists.transform( splitApkFiles, input -> input != null ? input.getAbsolutePath() : null); logger.error(e, "Unable to install " + Joiner.on(',').join(apkFileNames)); throw new DeviceException(e); } }
@Override public void error(@Nullable Throwable t, @Nullable String msgFormat, Object... args) { if (msgFormat != null && shouldDowngrade(msgFormat, args)) { mDelegate.info(Strings.nullToEmpty(msgFormat), args); } else { mDelegate.error(t, msgFormat, args); } }
@Override public void uninstallPackage(@NonNull String packageName, int timeout, ILogger logger) throws DeviceException { try { iDevice.uninstallPackage(packageName); } catch (Exception e) { logger.error(e, "Unable to uninstall " + packageName); throw new DeviceException(e); } }
@Override public void uninstallPackage(@NonNull String packageName, int timeout, ILogger logger) throws DeviceException { try { iDevice.uninstallPackage(packageName); } catch (Exception e) { logger.error(e, "Unable to uninstall " + packageName); throw new DeviceException(e); } }
@Override public void run(@NonNull Job<AaptProcess> job, @NonNull JobContext<AaptProcess> context) throws IOException { AaptProcess aapt = context.getPayload(); if (aapt == null) { mLogger.error(null /* throwable */, "Thread(%1$s) has a null payload", Thread.currentThread().getName()); return; } mLogger.verbose("Thread(%1$s): submitting job %2$s to %3$d", Thread.currentThread().getName(), job.getJobTitle(), aapt.hashCode()); aapt.crunch(from, to, job); mLogger.verbose("Thread(%1$s): submitted job %2$s", Thread.currentThread().getName(), job.getJobTitle()); }
@Override public void transform(@NonNull TransformInvocation transformInvocation) throws IOException, TransformException, InterruptedException { TransformOutputProvider outputProvider = transformInvocation.getOutputProvider(); boolean isIncremental = transformInvocation.isIncremental(); Collection<TransformInput> inputs = transformInvocation.getInputs(); if (outputProvider == null) { logger.error(null /* throwable */, "null TransformOutputProvider for InstantRunSlicer"); return; } Slices slices = new Slices(); if (isIncremental) { processCodeChanges(inputs, outputProvider, slices); } else { slice(inputs, outputProvider, slices); } }