点击打开链接:http://blog.sina.com.cn/s/blog_47021dd401010f2f.html
Build.xml文件详解
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!--
- 参考文章:
- http://www.cnblogs.com/zuolongsnail/archive/2011/05/25/2058210.html
- http://haya.iteye.com/?show_full=true
- 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:Androidandroid-sdk-windows
- #混淆路径
- proguard=D:Androidproguardlibproguard.jar
- #jarsiger路径
- jarsigner=D:Javajdk1.6.0_25binjarsigner.exe
- #签名文件
- keystore=D:Androidxxxx.keystore
- keyalias=xxxxx
- password=xxxxxx
- #motoSecondaryTelephonyManagerjar包
- secondarysecondary-apis-moto-xt882-zip=secondary-apis-moto_xt882.zip
- secondarysecondary-apis-moto-xt800plus-zip=secondary-apis-moto_xt800plus.zip
- #QASSDK包
- 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表示项目的描述。
- 每个构建文件都对应于一个项目,但是大型项目经常包含大量的子项目,每一个子项目都可以有
- 自己的构建文件。
- -->
- <projectname="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执
- 行的顺序是prepare->compile->run。
- 一个target只能被执行一次,即使有多个target依赖于它。如果没有if或unless属性,target总
- 会被执行。
- -->
- <targetname="-clean">
- <echo>Creatingoutputdirectoriesifneeded...</echo>
- <deletedir="${out.absolute.dir}"/>
- <deletedir="${out.gen.absolute.dir}"/>
- </target>
-
- <targetname="-dirs"depends="-clean">
- <echo>Creatingoutputdirectoriesifneeded...</echo>
- <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和命令行使用androidSDK提供的aapt.ext程序生成R.java。
- -->
- <targetname="-resource-src"depends="-dirs">
- <echo>GeneratingR.java/Manifest.javafromtheresources...</echo>
- <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和命令行使用androidSDK提供的aidl.exe生成.java文件。
- -->
- <!--Generatesjavaclassesfrom.aidlfiles.-->
- <targetname="-aidl"depends="-dirs">
- <echo>CompilingaidlfilesintoJavaclasses...</echo>
- <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文件。
- -->
- <!--Compilesthisproject's.javafilesinto.classfiles.-->
- <targetname="compile"depends="-resource-src,-aidl">
- <echo>Compilesproject's.javafilesinto.classfiles</echo>
- <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>
-
- <!--Executeproguardclassflies-->
- <targetname="optimize"depends="compile">
- <echo>optimizeclassesareputto"${out.absolute.dir}".</echo>
- <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}
- -optimizationpasses5
- -dontusemixedcaseclassnames
- -dontskipnonpubliclibraryclasses
- -dontpreverify
- -verbose
- -optimizations!code/simplification/arithmetic,!field/*,!class/merging/*
- -includeproguard.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和命令行使用androidSDK提供的dx.bat命令行脚本生成classes.dex文件。
- -->
- <targetname="dex"depends="optimize">
- <echo>Convertingcompiledfilesandexternallibrariesinto${out.absolute.dir}/${out.dex.file}...</echo>
- <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和命令行使用AndroidSDK提供的aapt.exe生成资源包文件。
- -->
- <targetname="package-resource">
- <echo>Packagingresourcesandassets${out.resource.package.absolute.file}...</echo>
- <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和命令行使用androidSDK提供的apkbuilder.bat命令脚本生成未签名的apk安装文件。
- -->
- <!--Packagetheapplicationwithoutsigningit.Thisallowsfortheapplicationtobesignedlaterwithanofficialpublishingkey.-->
- <targetname="package"depends="dex,package-resource">
- <echo>Packaging${out.unsigned.package.absolute.file}forrelease...</echo>
- <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>Itwillneedtobesignedwithjarsignerbeforebeingpublished.</echo>
- <deletefile="${out.resource.package.absolute.file}"/>
- <deletefile="${out.dex.absolute.file}"/>
- </target>
-
- <!--
- 第七步对未签名的apk进行签名生成签名后的android文件:
- -->
- <!--Packagetheapplicationwithoutsigningit.Thisallowsfortheapplicationtobesignedlaterwithanofficialpublishingkey.-->
- <targetname="jarsigner"depends="package">
- <echo>Packaging${out.unsigned.package.absolute.file}forrelease...</echo>
- <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}forrelease...</echo>
- <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>
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|