点击打开链接:http://blog.sina.com.cn/s/blog_47021dd401010f2f.html
Build.xml文件详解
- <?xml
version="1.0" encoding="UTF-8"?> - <!--
-
参考文章: -
http://www.cnblogs.com/zuolongsnail/archive/2011/05/25/2058210.html -
show_full=truehttp://haya.iteye.com/? -
http://jojol-zhou.iteye.com/blog/729271 -
http://jojol-zhou.iteye.com/blog/729254 -
http://www.cnblogs.com/Pickuper/archive/2011/6/14.html -
http://www.51testing.com/?uid-213912-action-viewspace-itemid-235086 -
http://jimmy-duan.iteye.com/blog/1057967 -
命名原则: -
(1)使用"."替代local.properties文件中的"-"作为文件分隔符 -
(2)前缀: -
使用"jar"表示包 -
使用"tools"表示工具 -
使用"in"表示输入 -
使用"out"表示输出 -
使用"release"表示产品 -
(3)后缀:使用"dir"表示目录,"file"表示文件 -
(3)使用"absolute"表示绝对路径,未使用"absolute"的表示相对路径,所有路径实际使用前转换为绝对路径再使用 -
文件及变量使用: -
(1)使用到了系统自带的proguard.cfg文件,用于配置混淆设置 -
(2)使用到了系统自带的local.properties文件,用于定义用户设置的本地变量,典型的文件中包含: -
#SDK路径 -
sdk-dir=D:\\Android\\android-sdk-windows -
#混淆路径 -
proguard=D:\\Android\\proguard\\lib\\proguard.jar -
#jarsiger路径 -
jarsigner=D:\\Java\\jdk1.6.0_25\\bin\\jarsigner.exe -
#签名文件 -
keystore=D:\\Android\\xxxx.keystore -
keyalias=xxxxx -
password=xxxxxx -
#moto SecondaryTelephonyManage r jar包 -
secondarysecondary-apis-moto-xt882-zip=secondary-apis-moto_xt882.zip -
secondarysecondary-apis-moto-xt800plus-zip=secondary-apis-moto_xt800plus.zip -
#QAS SDK包 -
appstat-jar=appstat_A1.0.0.7_20110726.jar -
#资源路径 -
res-dir=res480x320 -
#Manifest文件 -
manifestmanifest-file=manifest/AndroidManifest.xml -
#UA -
UA=SamsungI569 -
#assets路径 -
assetsassets-dir=assets${UA} -
#输出路径 -
out-release-dir=E:\\tmp -
#版本号 -
TYSX_VER=2.1.11.2 -
#android版本 -
android_ver=AD23 -
#文件名 -
#TYSX-机型型号(UA)-版本号-厂商缩写-操作系统缩写 -
release-apk-file=XXXX-${UA}-${TYSX_VER}-MH-${android_ver}.apk - -->
-
- <!--
-
<project>标签 -
<project>标签时构建文件的根标签。它可以有多个内在属性,每个构建文件对应一个项目。 -
就如代码中所示,其各个属性的含义分别如下。 -
(1) default表示默认的运行目标,这个属性是必须的。 -
(2) basedir表示项目的基准目录。 -
(3) name表示项目名。 -
(4) description表示项目的描述。 -
每个构建文件都对应于一个项目,但是大型项目经常包含大量的子项目,每一个子项目都可以有 -
自己的构建文件。 - -->
- <project
name="AntTest" default="release"> -
<!--指定配置文件 --> -
<propertyfile="default.properties" /> -
<propertyfile="local.properties" /> -
-
<!--定义工具目录 --> -
<propertyname="sdk.dir" value="${sdk-dir}" /> -
<propertyname="android.tools.dir" value="${sdk.dir}/tools" /> -
<propertyname="android.platformtools.dir" value="${sdk.dir}/platform-tools" /> -
<propertyname="android.platforms.dir" value="${sdk.dir}/platforms/${target}" /> -
-
<propertyname="android.tools.absolute.dir" location="${android.tools.dir}" /> -
<propertyname="android.platformtools.absolute.dir" location="${android.platformtools.dir}" /> -
<propertyname="android.platforms.absolute.dir" location="${android.platforms.dir}" /> -
-
<!-- 定义工具 -
<propertyname="verbose" value="false" />--> -
<conditionproperty="exe" value=".exe" else=""> -
<osfamily="windows" /> -
</condition> -
<propertyname="jar.proguard" value="${proguard-jar}" /> -
<propertyname="jar.android" value="${android.platforms.absolute.dir}/android.jar" /> -
<propertyname="tools.dx" value="${android.platformtools.absolute.dir}/dx.bat" /> -
<propertyname="tools.apkbuilder" value="${android.tools.absolute.dir}/apkbuilder.bat" /> -
<propertyname="tools.adb" value="${android.tools.absolute.dir}/adb${exe}" /> -
<propertyname="tools.zipalign" value="${android.tools.absolute.dir}/zipalign${exe}" /> -
<propertyname="tools.aapt" value="${android.platformtools.absolute.dir}/aapt${exe}" /> -
<propertyname="tools.aidl" value="${android.platformtools.absolute.dir}/aidl${exe}" /> -
<propertyname="tools.jarsigner" value="${JAVA_HOME}/bin/jarsigner${exe}" /> -
-
<!-- 定义引入工具库 -
<pathid="android.antlibs"> -
<pathelementpath="${sdk.dir}/tools/lib/anttasks.jar" /> -
<pathelementpath="${sdk.dir}/tools/lib/sdklib.jar" /> -
<pathelementpath="${sdk.dir}/tools/lib/androidprefs.jar" /> -
<pathelementpath="${sdk.dir}/tools/lib/apkbuilder.jar" /> -
<pathelementpath="${sdk.dir}/tools/lib/jarutils.jar" /> -
</path> -
定义任务 -
<taskdefname="aaptexec" classname="com.android.ant.AaptExecLoopTask" classpathref="android.antlibs" /> -
<taskdefname="apkbuilder" classname="com.android.ant.ApkBuilderTask" classpathref="android.antlibs" /> -
<taskdefname="xpath" classname="com.android.ant.XPathTask" classpathref="android.antlibs" /> -
>-- -
-
<!--定义源代码及资源等输入目录 --> -
<propertyname="in.source.dir" value="src" /> -
<propertyname="in.resource.dir" value="${res-dir}" /> -
<propertyname="in.asset.dir" value="${assets-dir}" /> -
-
<propertyname="in.source.absolute.dir" location="${in.source.dir}" /> -
<propertyname="in.resource.absolute.dir" location="${in.resource.dir}" /> -
<propertyname="in.asset.absolute.dir" location="${in.asset.dir}" /> -
-
<!--定义本地库/第三方工具库文件目录 --> -
<propertyname="in.external.libs.dir" value="libs" /> -
<propertyname="in.native.libs.dir" value="libs" /> -
-
<propertyname="in.external.libs.absolute.dir" location="${in.external.libs.dir}" /> -
<propertyname="in.native.libs.absolute.dir" location="${in.native.libs.dir}" /> -
-
<!--定义输入文件 --> -
<propertyname="in.manifest.file" value="${manifest-file}" /> -
<propertyname="in.android.aidl.file" value="${android.platforms.dir}/framework.aidl" /> -
-
<propertyname="in.manifest.absolute.file" location="${in.manifest.file}" /> -
<propertyname="in.android.aidl.absolute.file" location="${in.android.aidl.file}" /> -
-
<!--定义输出文件目录 --> -
<propertyname="out.gen.dir" value="gen" /> -
<propertyname="out.dir" value="bin" /> -
<propertyname="out.classes.dir" value="${out.dir}/classes" /> -
-
<propertyname="out.gen.absolute.dir" location="${out.gen.dir}" /> -
<propertyname="out.absolute.dir" location="${out.dir}" /> -
<propertyname="out.classes.absolute.dir" location="${out.classes.dir}" /> -
<propertyname="release.absolute.dir" location="${release-dir}" /> -
-
<!--定义输出文件 --> -
<propertyname="out.dex.file" value="${ant.project.name}-classes.dex" /> -
<propertyname="out.resource.package.file" value="${ant.project.name}-resource.apk" /> -
<propertyname="out.unsigned.package.file" value="${ant.project.name}-unsigned.apk" /> -
<propertyname="out.signed.package.file" value="${ant.project.name}-signed.apk" /> -
<propertyname="out.aligned.package.file" value="${ant.project.name}-aligned.apk" /> -
<propertyname="release.package.file" value="${release-apk-file}" /> -
-
<propertyname="out.dex.absolute.file" location="${out.dir}/${out.dex.file}" /> -
<propertyname="out.resource.package.absolute.file" location="${out.dir}/${out.resource.package.file}" /> -
<propertyname="out.unsigned.package.absolute.file" location="${out.dir}/${out.unsigned.package.file}" /> -
<propertyname="out.signed.package.absolute.file" location="${out.dir}/${out.signed.package.file}" /> -
<propertyname="out.aligned.package.absolute.file" location="${out.dir}/${out.aligned.package.file}" /> -
<propertyname="release.package.absolute.file" location="${release.absolute.dir}/${release.package.file}" /> -
-
-
<!-- -
<target>标签 -
一个项目标签下可以有一个或多个target标签。一个target标签可以依赖其他的target标签。例 -
如,有一个target用于编译程序,另一个target用于声称可执行文件。在生成可执行文件之前必 -
须先编译该文件,因策可执行文件的target依赖于编译程序的target。Target的所有属性如下。 -
(1)name表示标明,这个属性是必须的。 -
(2)depends表示依赖的目标。 -
(3)if表示仅当属性设置时才执行。 -
(4)unless表示当属性没有设置时才执行。 -
(5)description表示项目的描述。 -
Ant的depends属性指定了target的执行顺序。Ant会依照depends属性中target出现顺序依次执行 -
每个target。在执行之前,首先需要执行它所依赖的target。程序中的名为run的target的 -
depends属性compile,而名为compile的target的depends属性是prepare,所以这几个target执 -
>compile->run。行的顺序是prepare- -
一个target只能被执行一次,即使有多个target依赖于它。如果没有if或unless属性,target总 -
会被执行。 - -->
-
<targetname="-clean"> -
<echo>Creatingoutput </echo>directories if needed... -
<deletedir="${out.absolute.dir}" /> -
<deletedir="${out.gen.absolute.dir}" /> -
</target> -
-
<targetname="-dirs" depends="-clean"> -
<echo>Creatingoutput </echo>directories if needed... -
<mkdirdir="${in.resource.absolute.dir}" /> -
<mkdirdir="${in.external.libs.absolute.dir}" /> -
<mkdirdir="${out.gen.absolute.dir}" /> -
<mkdirdir="${out.absolute.dir}" /> -
<mkdirdir="${out.classes.absolute.dir}" /> -
</target> -
-
<!-- -
第一步 生成R.java类文件: -
Eclipse中会自动生成R.java,ant和命令行使用android SDK提供的aapt.ext程序生成R.java。 -
>-- -
<targetname="-resource-src" depends="-dirs"> -
<echo>GeneratingR.java </echo>/ Manifest.java from the resources... -
<execexecutable="${tools.aapt}" failonerror="true"> -
<argvalue="package" /> -
<argvalue="-m" /> -
<argvalue="-J" /> -
<argpath="${out.gen.absolute.dir}" /> -
<argvalue="-M" /> -
<argpath="${in.manifest.absolute.file}" /> -
<argvalue="-S" /> -
<argpath="${in.resource.absolute.dir}" /> -
<argvalue="-I" /> -
<argpath="${jar.android}" /> -
</exec> -
</target> -
-
<!-- -
第二步 将.aidl文件生成.java类文件: -
Eclipse中自动生成,ant和命令行使用android SDK提供的aidl.exe生成.java文件。 -
>-- -
<!--Generates java classes from .aidl files. --> -
<targetname="-aidl" depends="-dirs"> -
<echo>Compilingaidl </echo>files into Java classes... -
<applyexecutable="${tools.aidl}" failonerror="true"> -
<argvalue="-p${in.android.aidl.file}" /> -
<argvalue="-I${in.source.absolute.dir}" /> -
<argvalue="-o${out.gen.absolute.dir}" /> -
<filesetdir="${in.source.absolute.dir}"> -
<includename="**/*.aidl" /> -
</fileset> -
</apply> -
</target> -
-
<!-- -
第三步 编译.java类文件生成class文件: -
Eclipse中自动生成,ant和命令行使用jdk的javac编译java类文件生成class文件。 -
>-- -
<!--Compiles this project's .java files into .class files. --> -
<targetname="compile" depends="-resource-src, -aidl" > -
<echo>Compilesproject's </echo>.java files into .class files -
<javacencoding="utf-8" target="1.5" debug="true" extdirs="" srcdir="." -
destdir="${out.classes.absolute.dir}"bootclasspath="${jar.android}"> -
<classpath> -
<filesetdir="${in.external.libs.absolute.dir}" includes="*.jar" /> -
<filesetdir="${in.external.libs.absolute.dir}" includes="*.zip" /> -
</classpath> -
</javac> -
</target> -
-
<!--Executeproguard class flies--> -
<targetname="optimize" depends="compile"> -
<echo>optimizeclasses </echo>are put to "${out.absolute.dir}" . -
<jarbasedir="${out.classes.absolute.dir}" destfile="${out.absolute.dir}/temp.jar"/> -
<taskdefresource="proguard/ant/task.properties" classpath="${jar.proguard}"/> -
<proguard> -
-injars ${out.absolute.dir}/temp.jar -
-outjars ${out.absolute.dir}/optimized.jar -
-libraryjars ${jar.android} -
-optimizationpasses 5 -
-dontusemixedcaseclassnam es -
-dontskipnonpubliclibrary classes -
-dontpreverify -
-verbose -
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -
-include proguard.cfg -
</proguard> -
<deletefile="${out.absolute.dir}/temp.jar"/> -
<deletedir="${out.classes.dir}" failonerror="false" /> -
<mkdirdir="${out.classes.dir}"/> -
<unzipsrc="${out.absolute.dir}/optimized.jar" dest="${out.classes.absolute.dir}"/> -
<deletefile="${out.absolute.dir}/optimized.jar"/> -
</target> -
-
<!-- -
第四步 将class文件打包生成classes.dex文件: -
Eclipse中自动生成,ant和命令行使用android SDK提供的dx.bat命令行脚本生成classes.dex文件。 -
>-- -
<targetname="dex" depends="optimize"> -
<echo>Convertingcompiled </echo>files and external libraries into ${out.absolute.dir}/${out.dex.file} ... -
<applyexecutable="${tools.dx}" failonerror="true" parallel="true"> -
<argvalue="--dex" /> -
<argvalue="--output=${out.dex.absolute.file}" /> -
<argpath="${out.classes.absolute.dir}" /> -
<filesetdir="${in.external.libs.absolute.dir}" includes="*.jar"/> -
</apply> -
<deletedir="${out.classes.absolute.dir}"/> -
</target> -
-
<!-- -
第五步 打包资源文件(包括res、assets、androidmanifest.xml等): -
Eclipse中自动生成,ant和命令行使用Android SDK提供的aapt.exe生成资源包文件。 -
>-- -
<targetname="package-resource"> -
<echo>Packagingresources </echo>and assets ${out.resource.package.absolute.file} ... -
<execexecutable="${tools.aapt}" failonerror="true"> -
<argvalue="package" /> -
<argvalue="-f" /> -
<argvalue="-M" /> -
<argvalue="${in.manifest.file}" /> -
<argvalue="-S" /> -
<argvalue="${in.resource.absolute.dir}" /> -
<argvalue="-A" /> -
<argvalue="${in.asset.absolute.dir}" /> -
<argvalue="-I" /> -
<argvalue="${jar.android}" /> -
<argvalue="-F" /> -
<argvalue="${out.resource.package.absolute.file}" /> -
</exec> -
</target> -
-
<!-- -
第六步 生成未签名的apk安装文件: -
Eclipse中自动生成debug签名文件存放在bin目录中,ant和命令行使用android SDK提供的apkbuilder.bat命令脚本生成未签名的apk安装文件。 -
>-- -
<!--Package the application without signing it. This allows for the application to be signed later with an official publishing key. --> -
<targetname="package" depends="dex, package-resource" > -
<echo>Packaging${out.unsigned.package.absolute.file} </echo>for release... -
<execexecutable="${tools.apkbuilder}" failonerror="true"> -
<argvalue="${out.unsigned.package.absolute.file}" /> -
<argvalue="-u" /> -
<argvalue="-z" /> -
<argvalue="${out.resource.package.absolute.file}" /> -
<argvalue="-f" /> -
<argvalue="${out.dex.absolute.file}" /> -
<argvalue="-rf" /> -
<argvalue="${in.source.absolute.dir}" /> -
<argvalue="-rj" /> -
<argvalue="${in.external.libs.absolute.dir}" /> -
</exec> -
<echo>Itwill </echo>need to be signed with jarsigner before being published. -
<deletefile="${out.resource.package.absolute.file}" /> -
<deletefile="${out.dex.absolute.file}" /> -
</target> -
-
<!-- -
第七步 对未签名的apk进行签名生成签名后的android文件: -
--> -
<!--Package the application without signing it. This allows for the application to be signed later with an official publishing key. --> -
<targetname="jarsigner" depends="package"> -
<echo>Packaging${out.unsigned.package.absolute.file} </echo>for release... -
<execexecutable="${tools.jarsigner}" failonerror="true"> -
<argvalue="-keystore" /> -
<argvalue="${keystore}" /> -
<argvalue="-storepass" /> -
<argvalue="${password}" /> -
<argvalue="-keypass" /> -
<argvalue="${password}" /> -
<argvalue="-signedjar" /> -
<argvalue="${out.signed.package.absolute.file}" /> -
<argvalue="${out.unsigned.package.absolute.file}" /> -
<argvalue="${keyalias}" /> -
</exec> -
<deletefile="${out.unsigned.package.absolute.file}" /> -
</target> -
-
<!-- -
第七步 签名的文件进行字节对齐; -
--> -
<targetname="zipalign" depends="jarsigner"> -
<echo>Zipalign${out.aligned.package.absolute.file} </echo>for release... -
<execexecutable="${tools.zipalign}"> -
<argvalue="-f" /> -
<argvalue="-v" /> -
<argvalue="4" /> -
<argvalue="${out.signed.package.absolute.file}" /> -
<argvalue="${out.aligned.package.absolute.file}" /> -
</exec> -
<deletefile="${out.signed.package.absolute.file}" /> -
</target> -
-
<!-- -
第八步 签名的文件进行字节对齐; -
--> -
<targetname="release" depends="zipalign"> -
<copytofile="${release.package.absolute.file}"> -
<filesetdir="${out.absolute.dir}" includes="${out.aligned.package.file}"/> -
</copy> -
<deletefile="${out.aligned.package.absolute.file}" /> -
</target> -
-
- </project>