Ant是java项目主要的打包工具,而在Android项目中也同样发挥重要作用.现在整理用到的一些基本用法.更详细的可以参考官方帮助文档(http://ant.apache.org/manual/index.html).
(1)基本标签
包括project,task和property(loadproperties),path等.这些是构成ant脚本的基本标签,其中
project为必须带有的标签,且只能有一个.
task是表示每个任务的标签,至少有一个.
property为定义变量使用,一般用于文件路径等地方.而loadproperties则是加载保存在文件中的变量(用=号分隔).
path是指明目录路径,作为其他命令的目录参数使用.
(2)基本文件操作标签
包括 copy,delete,mkdir等,具体的用法可以查看ant官方文档.
(3)java编译打包相关
这里主要用到的是javac 和 jar 这两个标签.其实ant中只是将我们之前需要通过命令行执行的改为通过xml标签形式,使用的方式与通过命令行敲命令一致.
具体参考帮助文档例子.
(4)class文件的混淆
<target name="proguard" description="进行proguard混淆" depends="compilejar"> <java jar="${proguard.dir}/proguard.jar" fork="true" failonerror="true"> <jvmarg value="-Dmaximum.inlined.code.length=16" /> <arg value="@${ant.proguard.cfg}" /> </java> </target>
对于一些对外发布的jar包库,会需要进行混淆后发布,以上为执行混淆的ant脚本,核心是通过java命令执行proguard.jar,对使用的的jar包按照配置文件进行混淆操作.
(5)android打包步骤
这些步骤主要都是通过exec标签,执行andorid sdk提供的打包工具命令.
a)根据资源目录和manifest文件生成R.java,用于资源id绑定.
<target name="resource-src" depends="copy"> <echo>生成 R.java / Manifest.java</echo> <exec executable="${aapt}" failonerror="true"> <arg value="package" /> <arg value="-m" /> <arg value="-J" /> <arg value="${outdir-gen}" /> <arg value="-M" /> <arg value="${destdir}\AndroidManifest.xml" /> <arg value="-S" /> <arg value="${resource-dir}" /> <arg value="-I" /> <arg value="${android-jar}" /> </exec> </target>
这一步会有可能需要用到library project的R.java的,具体可以参考之前的一篇文章.
b)编译aidl
<!-- Generate java classes from .aidl files. --> <target name="aidl" depends="copy"> <echo>编译 aidl</echo> <apply executable="${aidl}" failonerror="true"> <arg value="-p${android-framework}" /> <arg value="-I${srcdir}" /> <fileset dir="${srcdir}"> <include name="**/*.aidl" /> </fileset> </apply> </target>
c)编译java源文件,参考上面javac命令使用.如果需要混淆的,也在这步进行,具体可以参考上面步骤.
d)转换为dex文件
主要将步骤c生成的class文件转为dex文件.
<target name="dex" depends="compile"> <echo>转化文件为dex文件</echo> <apply executable="${dx}" failonerror="true" parallel="true"> <arg value="--dex" /> <arg value="--output=${intermediate-dex}" /> <arg path="${outdir-obfuscate-classes}" /> <fileset dir="${external-libs}" includes="*.jar" /> </apply> </target>
e)资源打包
将具体的资源(包括res和assets)进行打包.
<target name="package-res-no-assets"> <echo>资源打包</echo> <exec executable="${aapt}" failonerror="true"> <arg value="package" /> <arg value="-f" /> <arg value="-M" /> <arg value="${destdir}\AndroidManifest.xml" /> <arg value="-S" /> <arg value="${resource-dir}" /> <arg value="-A" /> <arg value="${asset-dir}" /> <arg value="-I" /> <arg value="${android-jar}" /> <arg value="-F" /> <arg value="${resources-package}" /> </exec> </target> <target name="package-res"> <available file="${asset-dir}" type="dir" property="res-target" value="and-assets" /> <property name="res-target" value="no-assets" /> <antcall target="package-res-${res-target}" /> </target>
f)生成未签名的apk
<target name="package" depends="dex, package-res-no-assets"> <echo>Packaging ${out-unsigned-package} for release...</echo> <exec executable="${apk-builder}" failonerror="true"> <arg value="${out-unsigned-package}" /> <arg value="-u" /> <arg value="-z" /> <arg value="${resources-package}" /> <arg value="-f" /> <arg value="${intermediate-dex}" /> <arg value="-rf" /> <arg value="${srcdir}" /> <arg value="-nf" /> <arg value="${external-libs}" /> <arg value="-rj" /> <arg value="${external-libs}" /> </exec> <echo>It will need to be signed with jarsigner before being published.</echo> </target>
g)打入签名
<target name="debug" depends="package"> <echo>Packaging ${out-signed-package}, and signing it with a debug key...</echo> <exec executable="${apk-builder}" failonerror="true"> <arg value="${out-signed-package}" /> <arg value="-z" /> <arg value="${resources-package}" /> <arg value="-f" /> <arg value="${intermediate-dex}" /> <arg value="-rf" /> <arg value="${srcdir}" /> <arg value="-nf" /> <arg value="${external-libs}" /> <arg value="-rj" /> <arg value="${external-libs}" /> </exec> </target>