@Override public void start() { if (mCruncher != null) { key = mCruncher.start(); } }
@Override public boolean needsPreprocessing(File resourceFile) { return mMinSdk < MIN_SDK_WITH_VECTOR_SUPPORT && isXml(resourceFile) && isInDrawable(resourceFile) && getEffectiveVersion(resourceFile) < MIN_SDK_WITH_VECTOR_SUPPORT && isRootVector(resourceFile); }
@Override public void end() throws InterruptedException { if (mCruncher != null && key != -1) { mCruncher.end(key); } }
@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 synchronized void out(@Nullable String line) { // an empty message or aapt startup message are ignored. if (Strings.isNullOrEmpty(line)) { return; } if (line.equals("Ready")) { AaptProcess.this.mReady.set(true); AaptProcess.this.mReadyLatch.signal(); return; } NotifierProcessOutput delegate = getNotifier(); mLogger.verbose("AAPT out(%1$s): %2$s", toString(), line); if (delegate != null) { mLogger.verbose("AAPT out(%1$s): -> %2$s", toString(), delegate.mJob); delegate.out(line); } else { mLogger.error(null, "AAPT out(%1$s) : No Delegate set : lost message:%2$s", toString(), line); } }
public boolean needsPreprocessing(File resourceFile) { // TODO: parse the root element of the file to check. return resourceFile.getPath().endsWith(".xml") && isInDrawable(resourceFile) && getEffectiveVersion(resourceFile) < MIN_SDK_WITH_VECTOR_SUPPORT; }
@Override public synchronized void out(@Nullable String line) { // an empty message or aapt startup message are ignored. if (Strings.isNullOrEmpty(line)) { return; } if (line.equals("Ready")) { AaptProcess.this.mReady.set(true); AaptProcess.this.mReadyLatch.signal(); return; } NotifierProcessOutput delegate = getNotifier(); mLogger.verbose("AAPT out(%1$s): %2$s", mProcess.hashCode(), line); if (delegate != null) { mLogger.verbose("AAPT out(%1$s): -> %2$s", mProcess.hashCode(), delegate.mJob); delegate.out(line); } else { mLogger.error(null, "AAPT out(%1$s) : No Delegate set : lost message:%2$s", mProcess.hashCode(), line); } }
@Override public void destruction(@NonNull Thread t) throws IOException, InterruptedException { AaptProcess aaptProcess = mAaptProcesses.get(Thread.currentThread().getName()); if (aaptProcess != null) { mLogger.verbose("Thread(%1$s): notify aapt slave shutdown", Thread.currentThread().getName()); aaptProcess.shutdown(); mAaptProcesses.remove(t.getName()); mLogger.verbose("Thread(%1$s): after shutdown queue_size=%2$d", Thread.currentThread().getName(), mAaptProcesses.size()); } }
private int getEffectiveVersion(File resourceFile) { FolderConfiguration configuration = getFolderConfiguration(resourceFile); configuration.createDefault(); // Because of the above, the will be no NPE here. //noinspection ConstantConditions return configuration.getVersionQualifier().getVersion(); } }
public AaptProcess start() throws IOException, InterruptedException { String[] command = new String[] { mAaptLocation, "m", }; mLogger.verbose("Trying to start %1$s", command[0]); Process process = new ProcessBuilder(command).start(); mLogger.verbose("Started %1$d", process.hashCode()); return new AaptProcess(process, mLogger); } }
@Override public void err(@Nullable String line) { if (line != null) { mLogger.verbose("AAPT warning(%1$s), Job(%2$s): %3$s", mOwner.getProcess().hashCode(), mJob, line); mLogger.warning("AAPT: %3$s", mOwner.getProcess().hashCode(), mJob, line); } } }
/** * Creates a new {@link com.android.builder.png.QueuedCruncher} or return an existing one * based on the underlying AAPT executable location. * @param aaptLocation the APPT executable location. * @param logger the logger to use * @return a new of existing instance of the {@link com.android.builder.png.QueuedCruncher} */ public QueuedCruncher newCruncher( @NonNull String aaptLocation, @NonNull ILogger logger) { synchronized (sLock) { logger.info("QueuedCruncher is using %1$s", aaptLocation); if (!sInstances.containsKey(aaptLocation)) { QueuedCruncher queuedCruncher = new QueuedCruncher(aaptLocation, logger); sInstances.put(aaptLocation, queuedCruncher); } return sInstances.get(aaptLocation); } } }
@Override public void out(@Nullable String line) { if (line != null) { mLogger.verbose("AAPT notify(%1$s): %2$s", mJob, line); if (line.equalsIgnoreCase("Done")) { mOwner.reset(); mJob.finished(); } else if (line.equalsIgnoreCase("Error")) { mOwner.reset(); mJob.error(); } else { mLogger.verbose("AAPT(%1$s) discarded: %2$s", mJob, line); } } }
@Override public void run(@NonNull Job<AaptProcess> job, @NonNull JobContext<AaptProcess> context) throws IOException { mLogger.verbose("Thread(%1$s): begin executing job %2$s", Thread.currentThread().getName(), job.getJobTitle()); context.getPayload().crunch(from, to, job); mLogger.verbose("Thread(%1$s): done executing job %2$s", Thread.currentThread().getName(), job.getJobTitle()); }
@Override public void generateFile(File toBeGenerated, File original) throws IOException { try { super.generateFile(toBeGenerated, original); } catch (ResourcesNotSupportedException e) { // Add gradle-specific error message. throw new GradleException( String.format( "Can't process attribute %1$s=\"%2$s\": " + "references to other resources are not supported by " + "build-time PNG generation. " + "See http://developer.android.com/tools/help/vector-asset-studio.html " + "for details.", e.getName(), e.getValue())); } } }
@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 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(); } };
private static int getEffectiveVersion(File resourceFile) { FolderConfiguration configuration = getFolderConfiguration(resourceFile); if (configuration.getVersionQualifier() == null) { configuration.createDefault(); } //noinspection ConstantConditions - handled above. return configuration.getVersionQualifier().getVersion(); } }
public AaptProcess start() throws IOException, InterruptedException { String[] command = new String[] { mAaptLocation, "m", }; mLogger.verbose("Trying to start %1$s", command[0]); Process process = new ProcessBuilder(command).start(); AaptProcess aaptProcess = new AaptProcess(mAaptLocation, process, mLogger); mLogger.verbose("Started %1$d", aaptProcess.hashCode()); return aaptProcess; } }
@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(); } };