1、设定私钥库
2、如果项目引用了第三方库的话,只需要在项目根目录创建libs文件夹并将其放入即可。
</target>
<target name=”-ndk-build”>
<exec executable=”ndk-build” failοnerrοr=”true”>
<arg value=”clean” />
</exec>
<exec executable=”ndk-build” failοnerrοr=”true” />
</target>
1
2
3
4
5
|
<?
xml
version = "1.0" encoding = "GBK" ?>
<
project
default = " targetname" >
<
target
name = "name" >
</
target
>
</
project
>
|
project是生成文件的根元素,表示一个工程;
target是project的子元素,表示一个任务;一个project中可以定义多个target元素,表示多个任务;
default属性表示默认执行的target,如果ant命令没有指定target,则执行default的target;
ant targetname;则会执行此target,而忽略default设置的target;
注意:不能有两个相同的targetname;
代码举例:创建并删除hello目录;
1
2
3
4
5
6
7
8
9
10
|
<?
xml
version = "1.0" encoding = "gbk" ?>
<
project
default = "delete" >
<
property
name = "name" value = "xiazdong" />
<
target
name = "delete" depends = "mkdir" >
<
delete
dir = "${name}" />
</
target
>
<
target
name = "mkdir" >
<
mkdir
dir = "${name}" />
</
target
>
</
project
>
|
代码举例:一般项目中的ant结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<
project
default
=
"init"
>
<
property
name
=
"src"
value
=
"src"
/>
<
property
name
=
"classes"
value
=
"classes"
/>
<
property
name
=
"dest"
value
=
"dest"
/>
<
path
id
=
"classpath"
>
<
pathelement
path
=
"${classes}"
/>
</
path
>
<
target
name
=
"help"
>
<
echo
>help -打印帮助信息</
echo
>
<
echo
>compile -编译java源文件</
echo
>
<
echo
>run -运行程序</
echo
>
<
echo
>build -打成jar包</
echo
>
<
echo
>clean -清楚全部编译生成文件</
echo
>
</
target
>
<
target
name
=
"compile"
>
<
delete
dir
=
"${classes}"
/>
<
mkdir
dir
=
"${classes}"
/>
<
javac
srcdir
=
"${src}"
destdir
=
"${classes}"
/>
</
target
>
<
target
name
=
"run"
depends
=
"compile"
>
<
java
classname
=
"org.xiazdong.Test"
fork
=
"yes"
>
<
classpath
path
=
"${classes}"
/>
</
java
>
</
target
>
<
target
name
=
"build"
depends
=
"run"
>
<
delete
dir
=
"${dest}"
/>
<
mkdir
dir
=
"${dest}"
/>
<
jar
destfile
=
"${dest}/Test.jar"
basedir
=
"${classes}"
>
<
manifest
>
<
attribute
name
=
"Main-Class"
value
=
"org.xiazdong.Test"
/>
</
manifest
>
</
jar
>
</
target
>
<
target
name
=
"clean"
>
<
delete
dir
=
"${classes}"
/>
<
delete
dir
=
"${dest}"
/>
</
target
>
</
project
>
|
总结一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
<?
xml
version
=
"1.0"
encoding
=
"GBK"
?>
<
project
name
=
"Test"
default
=
""
basedir
=
"."
>
<
property
name
=
"src"
value
=
"${basedir}\src"
/>
<
property
file
=
"${basedir}\a.properties"
/>
<!--
path用法
1.id属性表示编号,用于被引用
-->
<
path
id
=
"classpath"
>
<!--
pathelement的用法
1.path表示多个目录,用“;”隔开目录
2.location表示一个目录
-->
<
pathelement
path
=
"lib;src"
/>
<
pathelement
location
=
"lib"
/>
<!--
dirset的用法
1.dir属性指定根目录
2.子元素<include name=" "/>表示包含的目录
3.子元素<exclude name=" "/>表示不包含的目录
-->
<
dirset
dir
=
"lib"
>
<
include
name
=
"**/*Test*"
/>
<
exclude
name
=
"**/class"
/>
</
dirset
>
<!--
filelist的用法
1.dir属性指定根路径
2.files属性指定文件名的列表,用","隔开
-->
<
filelist
dir
=
"lib"
files
=
"a.xml,b.xml"
/>
<!--
fileset用法
1.dir属性指出根路径
2.子元素<include name=" "/>指定包含的文件名
-->
<
fileset
dir
=
"lib"
>
<
include
name
=
"**/*.jar"
/>
</
fileset
>
</
path
>
<!--
target用法
1.表示任务,子元素为各种task的集合;
-->
<
target
name
=
"target1"
>
<!--
javac用法
1.srcdir表示java文件的目录
2.destdir表示class文件的保存目录
-->
<
javac
srcdir
=
"src"
destdir
=
"bin"
>
<!--
classpath用法
1.refid引用前面的path指定的路径
-->
<
classpath
refid
=
"classpath"
/>
</
javac
>
<!--
java用法
1.classname表示要运行的类
2.fork="yes"一定要写上!!
-->
<
java
classname
=
"Test"
fork
=
"yes"
>
<
classpath
refid
=
"classpath"
/>
<!--
arg表示指定的参数
-->
<
arg
value
=
"a b c"
/>
</
java
>
<!--
echo表示输出
-->
<
echo
>Hello world</
echo
>
<!--
copy表示复制文件
delete表示删除文件
mkdir表示创建目录
move表示移动文件
-->
<
copy
file
=
"src.txt"
tofile
=
"dest.txt"
/>
<
delete
dir
=
"src"
/>
<
mkdir
dir
=
"src"
/>
<
move
file
=
"src.txt"
tofile
=
"dest.txt"
/>
</
target
>
</
project
>
|
一、由函数到macrodef
假设我们定义一个函数:
- def test (arg):
- to do something
我们可以通过以下方法来执行这个方法
- test('test')
将这些移到ant中:
将to do something使用echo标签输出,然后使用<test/>调用这个宏。
- <project name="test_ant">
- <macrodef name="test">
- <attribute name="arg" default="testssss"/>
- <sequential>
- <echo>to do something</echo>
- </sequential>
- </macrodef>
- <test/>
- </project>
运行ant -f test.xml结果:
- ---------- ant ----------
- Buildfile: D:\workspace\workspace20130318\Z_Frame\test.xml
- [echo] to do something
- BUILD SUCCESSFUL
- Total time: 0 seconds
- 输出完成 (耗时 0 秒) - 正常终止
标签macrodef:声明这是一个宏,name="test"来告诉ant这个宏的名字叫做test。之后我们调用这个宏就可以使用</test>。
标签attribute:声明这个宏所需要的参数。
标签sequential:声明这个宏需要执行的实体。
二、传入参数
上面的例子中我们请求传入一个参数arg,并给这个arg设置了默认值"testssss",接下来我们希望调用这个宏的时候传递这个参数,并且输出这个参数。如下:
- <project name="test_ant">
- <macrodef name="test">
- <attribute name="arg" default="testssss"/>
- <sequential>
- <echo>arg is : @{arg}</echo>
- </sequential>
- </macrodef>
- <test arg="i am a param"/>
- </project>
运行结果:
- ---------- ant ----------
- Buildfile: D:\workspace\workspace20130318\Z_Frame\test.xml
- [echo] arg is : i am a param
- BUILD SUCCESSFUL
- Total time: 0 seconds
- 输出完成 (耗时 0 秒) - 正常终止
我们将arg作为test标签的属性名传入进入,而属性arg的内容就是arg的内容。我们通过@{参数}来调用这个参数的内容。
三、调用一个声明的函数
假定我们希望我们的函数是这样的:
- def test (arg):
- print(arg)
- test('test')
也就是我们的会调用另一个函数print,这个在ant宏定义中是这样使用的:
- <macrodef name="test">
- <attribute name="arg" default="testssss"/>
- <element name="print" optional="yes" />
- <sequential>
- <echo>arg is : @{arg}</echo>
- <print/>
- </sequential>
- </macrodef>
我们通过element函数来声明我们需要使用一个名字叫做print的函数。optional用来说明这个函数是否是必须存在的。也就是上面的程序加上element那一行是可以正常使用的。
尝试把optional改为no试试??自己试试吧。
我们这里声明了使用函数print,其实这是一个回调,为什么呢?一般来说我们会在<sequential>中使用这个函数。那么这个函数是需要在调用test的时候实现的。如果optional为no那么这个函数就是必须实现的,如果不实现是会报错的。如下:
- <project name="test_ant">
- <macrodef name="test">
- <attribute name="arg" default="testssss"/>
- <element name="print" optional="yes" />
- <sequential>
- <echo>arg is : @{arg}</echo>
- <print/>
- </sequential>
- </macrodef>
- <test arg="i am a param">
- <print>
- <echo>i am a function</echo>
- </print>
- </test>
- </project>
我们在调用test时通过一个标签对来实现了print函数。其实际的执行就是按照sequential的顺序执行:
首先输出:arg is : @{arg}
其次执行我们的 :print,当然我们的print存在的话。
- ---------- ant ----------
- Buildfile: D:\workspace\workspace20130318\Z_Frame\test.xml
- [echo] arg is : i am a param
- [echo] i am a function
- BUILD SUCCESSFUL
- Total time: 0 seconds
- 输出完成 (耗时 0 秒) - 正常终止
Ok,编写个脚本试试吧!下面再给大家一个例子:
- <project name="test" default="test">
- <macrodef name="print">
- <attribute name="text"/>
- <element name="telement" optional="yes" />
- <sequential>
- <echo>@{text}</echo>
- </sequential>
- </macrodef>
- <macrodef name="testing">
- <attribute name="v" default="NOT SET"/>
- <!-- 这里就相当于提供了一个接口 -->
- <element name="some-tasks" optional="yse"/>
- <sequential>
- <echo>v is @{v}</echo>
- <some-tasks/>
- </sequential>
- </macrodef>
- <testing v="This is v">
- <some-tasks>
- <echo>this is a test</echo>
- </some-tasks>
- </testing>
- <target name="telement">
- <print text="telement"/>
- </target>
- <target name="test">
- <print text="print test"/>
- </target>
- </project>
不使用MacroDef的情况下,编译和打包math和io等目录:
<target name="build_math" depends="base"> <echo message="... building jck-api-math-cases now ..."/> <javac debug="false" destdir="bin" source="1.5" target="1.5"> <src path="./java_math"/> <classpath refid="java_jck.classpath"/> </javac> </target> <target name="make_math" depends="build_math"> <echo message="... make math jar ...."></echo> <jar jarfile="math.jar" basedir="./bin"/> <move file="./math.jar" tofile="./lex/math.jar" overwrite="true"/> </target> <target name="build_io" depands="base"> …… </target> <target name="make_io" depends="build_io"> …… </target> ……
使用MacroDef的情况下,编译和打包math和io等目录:
———————————————————————————————————————
<macrodef name="dealWithTestCases"> //macrodef的定义,定义了name属性 <attribute name="tarName" /> //参数定义 <attribute name="srcPath" /> <!--element name="dex-elements"/--> <sequential> //实际执行的内容在<sequential>里 <echo message="... building jck-api-@{tarName}-cases now ...."/> <javac debug="false" destdir="bin" source="1.5" target="1.5" includeantruntime="on"> <src path="./@{srcPath}"/> <classpath refid="java_jck.classpath"/> <excludesfile name="exclude.@{tarName}"/> </javac> <echo message="... make @{tarName} jar ..."></echo> <jar jarfile="@{tarName}.jar" basedir="./bin"/> <move file="./@{tarName}.jar" tofile="./lex/@{tarName}.jar" overwrite="true"/> </sequential> </macrodef> <target name="lex" depands="base"> <dealWithTestCases tarName="math" srcPath="./java_math"/> //外部调用宏 <dealWithTestCases tarName="io" srcPath="./java_io"/> …… </target>
1、在整个build文件里,<macrodef>是和<target>平级的,上例中定义的<dealWithTestCases>若不将其放在<target>里面,执行Ant时,脚本会直接执行这部分的宏代码,而不会去执行<target>中定义的‘depands="base"‘依赖关系。