// Dex Ant Task // // Douglas Thrift // // $Id$ /* Copyright 2008 Douglas Thrift * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.douglasthrift.anttasks; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.taskdefs.ExecTask; import org.apache.tools.ant.taskdefs.condition.Os; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.ResourceCollection; import org.apache.tools.ant.types.resources.FileResource; import org.apache.tools.ant.util.FileUtils; public class Dex extends CommandTask { private boolean debug_; private boolean verbose_; private String positions_; private boolean noLocals_; private boolean noOptimize_; private boolean statistics_; private File noOptimizeList_; private File optimizeList_; private boolean noStrict_; private boolean keepClasses_; private File output_; private File dumpTo_; private Integer dumpWidth_; private String dumpMethod_; private boolean verboseDump_; private boolean noFiles_; private boolean coreLibrary_; private ArrayList fileSets_ = new ArrayList(); public void setDebug(boolean debug) { debug_ = debug; } public void setVerbose(boolean verbose) { verbose_ = verbose; } public void setPositions(String positions) { positions_ = positions; } public void setNoLocals(boolean noLocals) { noLocals_ = noLocals; } public void setNoOptimize(boolean noOptimize) { noOptimize_ = noOptimize; } public void setStatistics(boolean statistics) { statistics_ = statistics; } public void setNoOptimizeList(File noOptimizeList) { noOptimizeList_ = noOptimizeList; } public void setOptimizeList(File optimizeList) { optimizeList_ = optimizeList; } public void setNoStrict(boolean noStrict) { noStrict_ = noStrict; } public void setKeepClasses(boolean keepClasses) { keepClasses_ = keepClasses; } public void setOutput(File output) { output_ = output; } public void setDumpTo(File dumpTo) { dumpTo_ = dumpTo; } public void setDumpWidth(int dumpWidth) { dumpWidth_ = new Integer(dumpWidth); } public void setDumpMethod(String dumpMethod) { dumpMethod_ = dumpMethod; } public void setVerboseDump(boolean verboseDump) { verboseDump_ = verboseDump; } public void setNoFiles(boolean noFiles) { noFiles_ = noFiles; } public void setCoreLibrary(boolean coreLibrary) { coreLibrary_ = coreLibrary; } public void add(ResourceCollection fileSet) { fileSets_.add(fileSet); } @Override public void execute() { if (fileSets_.isEmpty()) throw new BuildException("no input files specified"); for (ResourceCollection fileSet : fileSets_) if (!fileSet.isFilesystemOnly()) throw new BuildException("not file system only"); if (isUpToDate()) return; command(Os.isFamily(Os.FAMILY_WINDOWS) ? "dx.bat" : "dx"); argument("--dex"); if (debug_) argument("--debug"); if (verbose_) argument("--verbose"); if (positions_ != null) argument("--positions=" + positions_); if (noLocals_) argument("--no-locals"); if (noOptimize_) argument("--no-optimize"); if (statistics_) argument("--statistics"); if (noOptimizeList_ != null) argument("--no-optimize-list=" + noOptimizeList_); if (optimizeList_ != null) argument("--optimize-list=" + optimizeList_); if (noStrict_) argument("--no-strict"); if (keepClasses_) argument("--keep-classes"); if (output_ != null) argument("--output=" + output_); if (dumpTo_ != null) argument("--dump-to=" + dumpTo_); if (dumpWidth_ != null) argument("--dump-width=" + dumpWidth_); if (dumpMethod_ != null) argument("--dump-method=" + dumpMethod_); if (verboseDump_) argument("--verbose-dump"); if (noFiles_) argument("--no-files"); if (coreLibrary_) argument("--core-library"); for (ResourceCollection fileSet : fileSets_) for (Iterator iterator = fileSet.iterator(); iterator.hasNext();) argument(iterator.next().toString()); super.execute(); } private boolean isUpToDate() { if (output_ == null || !output_.exists()) return false; FileUtils utils = FileUtils.getFileUtils(); for (ResourceCollection fileSet_ : fileSets_) for (Iterator iterator_ = fileSet_.iterator(); iterator_.hasNext();) { FileResource resource = (FileResource)iterator_.next(); if (!resource.isExists()) return false; if (resource.isDirectory()) { FileSet fileSet = (FileSet)getProject().createDataType("fileset"); fileSet.setDir(resource.getFile()); fileSet.setIncludes("**/*.apk **/*.class **/*.jar **/*.zip"); for (Iterator iterator = fileSet.iterator(); iterator.hasNext();) if (!utils.isUpToDate(((FileResource)iterator.next()).getFile(), output_)) return false; } else if (!utils.isUpToDate(resource.getFile(), output_)) return false; } return true; } }