大家好,又见面了,我是全栈君。
build.xml,local.properties,proguard-project.txt
android update project —path .
1、设定私钥库
2、如果项目引用了第三方库的话,只需要在项目根目录创建libs文件夹并将其放入即可。
<target name=”-pre-build” depends=”-ndk-build”>
</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 > |
。
</target>
。Ant会依照depends属性中target出现顺序依次执行每个target。在执行之前,首先需要执行它所依赖的target。程序中的名为run的target的depends属性compile,而名为compile的target的depends属性是prepare,所以这几个target执行的顺序是prepare->compile->run。一个target只能被执行一次,即使有多个target依赖于它。
if的值表示一个属性名,只有设置了该属性名,才能执行此target;
unless的值表示一个属性名,只有没有设置该属性名,才能执行此target;如果没有if或unless属性,target总会被执行。
用于定义属性,一般形如:
property name=”pname” value=”pvalue”/>
通过此属性文件导入属性;
编译此文件夹下或子文件夹下的全部java文件
。
编译后的class文件放置路径
。
而不是中断ANT命令,因此fork必须为yes;
可以删除a目录下的b目录;
,一般形式如下:
代码举例:一般项目中的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”‘依赖关系。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121331.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...