在ant打包的时候老是忘记把manifest.xml中的android:debugable改为false,后来干脆自定义个task来修改这项
官方的Turtorialhttp://ant.apache.org/manual/tutorial-writing-tasks.html
ant一般要干的事情,
1,编译我的东西
2,打一个可以发布的jar
3,清除现场
下面是个加上了个<property>s的简单的demo
<?xml version="1.0" encoding="ISO-8859-1"?> <project name="MyTask" basedir="." default="jar"> <property name="src.dir" value="src"/> <property name="classes.dir" value="classes"/> <target name="clean" description="Delete all generated files"> <delete dir="${classes.dir}" failonerror="false"/> <delete file="${ant.project.name}.jar"/> </target> <target name="compile" description="Compiles the Task"> <mkdir dir="${classes.dir}"/> <javac srcdir="${src.dir}" destdir="${classes.dir}"/> </target> <target name="jar" description="JARs the Task" depends="compile"> <jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/> </target> </project>
首先自定义task要继承于ant.jar中的org.apache.tools.ant.Task,实现自己的execute内容
简单的demo如下,
import org.apache.tools.ant.Task; public class HelloWorld extends Task { public void execute() { // use of the reference to Project-instance String message = getProject().getProperty("ant.project.name"); // Task's log method log("Here is project '" + message + "'."); // where this task is used? log("I am used in: " + getLocation() ); } }
获取自定义task的父工程可以通过方法getProject(),例如,projectName = getProject().getProperty("project.name"); 但是,不要在自定义task的构造方法中调用,此时会返回为null,在execute方法中才可以拿到数据
还有两个重要方法,可以从project中获取数据
String getProperty(String propertyName)
String replaceProperties(String value)
下面说下不带参数的build.xml文件中的调用
<?xml version="1.0" encoding="ISO-8859-1"?> <project name="MyTask" basedir="." default="use"> ... <target name="use" description="Use the Task" depends="jar"> <taskdef name="helloworld" classname="HelloWorld" classpath="${ant.project.name}.jar"/>//定义声明过程 <helloworld/>//调用过程 </target> </project>
<helloworld message="Hello World"/>,task中通过setMessage来读取,
import org.apache.tools.ant.Task; import org.apache.tools.ant.BuildException; public class HelloWorld extends Task { String message; public void setMessage(String msg) { message = msg; } public void execute() { if (message==null) { throw new BuildException("No message set."); } log(message); } }
<helloworld> <message msg="Nested Element 1"/> <message msg="Nested Element 2"/> </helloworld>对于的读取方式
先定义Message的内部类表示Message节点,该类有个msg属性,同样有一个setter函数,使其在build.xml中赋值,再根据Ant的框架,定义给Helloword注入message的 createXXX函数和持有Message列表的message对象,ant就会为你完成自动注入。
import java.util.Vector;
import java.util.Iterator; ... public void execute() { if (message!=null) log(message); for (Iterator it=messages.iterator(); it.hasNext(); ) { // 4 Message msg = (Message)it.next(); log(msg.getMsg()); } } Vector messages = new Vector(); // 2 public Message createMessage() { // 3 Message msg = new Message(); messages.add(msg); return msg; } public class Message { // 1 public Message() {} String msg; public void setMsg(String msg) { this.msg = msg; } public String getMsg() { return msg; } } ...