最近工作中需要用Ant对Android工程进行打包生成apk文件,工作完成之后对Ant又有一些新的认识,遂记录在这里。
一、Ant集成svnant
Ant有很多第三方工具,这些工具扩展了Ant的功能,使用起来也十分方便。工作中需要用Ant从SVN检出工程所以使用到svnant。
1、svnant下载地址
http://subclipse.tigris.org/svnant.html
目前最新的版本是1.3.1
2、Ant集成svnant
首先是引入svnant的lib目录下的jar包。
<!-- 将svnant的jar包加入到环境变量 -->
<path id="svnant.classpath">
<fileset dir="${svnantlib.dir}"><!-- dir表示svnant的lib目录所在位置 -->
<include name="**/*.jar"/>
</fileset>
</path>
其中svnantlib.dir配置在build.properties文件当中,指向svnant的lib目录的位置。
然后引入svn task文件。
<!-- 引用svn task文件,使svn功能可以使用-->
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath"/>
在svnant1.3.1版本,需要配置svn的Setting。
<!-- 设置svn属性 -->
<svnSetting id="svn.setting" svnkit="true" username="${svn.username}" password="${svn.password}" javahl="false" />
其中svn.username、svn.password分别是svn账户和密码配置在build.properties文件当中。
环境配置完毕,就可以通过svnant对工程进行检出操作。
<!-- 检出代码-->
<target name="checkout">
<svn refid="svn.setting">
<checkout url="${svn.url}" revision="HEAD" destPath="${project-svn}"/><!-- 默认支持叠加检出 -->
</svn>
</target>
使用svnant不仅能够检出工程,还能获得相应的svn信息,需要如下标签来获得检出工程的svn信息。
<info target="${project-svn}" /><!-- target表示要获得svn信息的目录,info标签表示svn信息 -->
通过上述过程,就能够从svn中检出项目, 并且获得对应项目的svn信息,比如其版本号,修改时间等等。
3、完整过程
<?xml version="1.0" encoding="utf-8"?>
<project name="svnant" basedir="." default="version-number">
<!-- 引入属性文件 -->
<property file="build.properties"/>
<!-- svn检出项目根目录 -->
<property name="project-svn" value="svnant" />
<!-- 将svnant的jar包加入到环境变量 -->
<path id="svnant.classpath">
<fileset dir="${svnantlib.dir}"><!-- dir表示svnant的lib目录所在位置 -->
<include name="**/*.jar"/>
</fileset>
</path>
<!-- 引用svn task文件,使svn功能可以使用-->
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath"/>
<!-- 设置svn属性 -->
<svnSetting id="svn.setting" svnkit="true" username="${svn.username}" password="${svn.password}" javahl="false" />
<!-- 检出代码-->
<target name="checkout">
<svn refid="svn.setting">
<checkout url="${svn.url}" revision="HEAD" destPath="${project-svn}"/><!-- 默认支持叠加检出 -->
<info target="${project-svn}" /><!-- target表示要获得svn信息的目录,info标签表示svn信息 -->
</svn>
<echo message="checkout version is ${svn.info.lastRev} and the lastmodify is ${svn.info.lastDate}"/>
</target>
<!-- 获得指定目录SVN版本号 -->
<target name="version-number" depends="checkout">
<property name="svn-version" value="${svn.info.lastRev}" /><!-- 必须在检出工程之后才能得到信息 -->
<echo message="the svnversion is ${svn-version}"></echo>
</target>
</project>
4、build.properties属性文件
svn.url=svn地址
svn.username=用户名
svn.password=密码
svnantlib.dir=svnant的lib目录
5、svnant的doc
svnant的doc,需要的时候可以做参考,这里主要用到checkout和info两个。
二、Ant集成xmltask
xmltask比Ant原生的replace具有更加强大的功能,使用xmltask能够对xml文件进行编辑,因为需要对清单文件进行编辑,所以使用到xmltask。
1、xmltask下载地址
http://sourceforge.net/projects/xmltask/
2、Ant集成xmltask
首先引入xmltask的jar包
<path id="xmltask.classpath">
<fileset dir="${xmltasklib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>
然后定义一个xmltask
<taskdef name="xmltask" classpathref="xmltask.classpath" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>
然后就可以通过xmltask来操作XML文件,这里列出一些常用的操作
替换某个指定标签的属性的值
<replace path="//manifest/@android:versionCode" withText="xmltask_attr"/>
<!-- path采用XPath匹配 -->
xmltask采用的是XPath进行XML的匹配
向指定标签添加属性
<attr path="//manifest" attr="android:versionName" value="xmltask_name" />
删除指定标签
<remove path="//manifest/application/activity[contains(@android:name, 'xml')]"/>
向指定位置添加标签
<insert path="//manifest/application/activity" position="after">
<![CDATA[
<activity>`
</activity>
]]>
</insert>
3、完整过程
<?xml version="1.0" encoding="utf-8"?>
<project name="xmltask" basedir="." default="xmltask">
<!-- 引入属性文件 -->
<property file="build.properties"/>
<path id="xmltask.classpath">
<fileset dir="${xmltasklib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>
<taskdef name="xmltask" classpathref="xmltask.classpath" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>
<!-- xmltask操作xml -->
<target name="xmltask">
<xmltask source="AndroidManifest.xml" dest="AndroidManifest.xml" preserveType="true" encoding="UTF-8"> <!-- source表示要操作的xml,dest表示输出的目标xml -->
<!-- 替换某个指定标签的属性的值 -->
<replace path="//manifest/@android:versionCode" withText="xmltask_attr"/><!-- path采用XPath匹配 -->
<!-- 向指定标签内添加属性 -->
<attr path="//manifest" attr="android:versionName" value="xmltask_name" />
<!-- 删除指定标签:删除activity标签内android:name属性还有xml的activity的标签 -->
<remove path="//manifest/application/activity[contains(@android:name, 'xml')]"/>
<!-- 向指定位置插入标签 -->
<insert path="//manifest/application/activity" position="after">
<![CDATA[
<activity>`
</activity>
]]>
</insert>
</xmltask>
</target>
</project>
4、build.properties属性文件
xmltasklib.dir=xmltaskjar包的位置
5、xmltask的doc
地址:http://www.oopsconsultancy.com/software/xmltask/index.html#examples