Android學習之Build.xml檔案
近日升級Android SDK至3.2版本,發現ant工具編譯失敗,仔細檢查Build.xml後進行了重新編寫,內容修正如下,希望對大家學習Ant有幫助。具體Build.xml內容如下:
具體演示工程參見:點選開啟連結,注意積分有點高哦,嘿嘿。。。
- <?xml version="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:\\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 SecondaryTelephonyManager jar包
- secondary-apis-moto-xt882-zip=secondary-apis-moto_xt882.zip
- secondary-apis-moto-xt800plus-zip=secondary-apis-moto_xt800plus.zip
- #QAS SDK包
- appstat-jar=appstat_A1.0.0.7_20110726.jar
- #資源路徑
- res-dir=res480x320
- #Manifest檔案
- manifest-file=manifest/AndroidManifest.xml
- #UA
- UA=SamsungI569
- #assets路徑
- assets-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">
- <!-- 指定配置檔案 -->
- <property file="default.properties" />
- <property file="local.properties" />
- <!-- 定義工具目錄 -->
- <property name="sdk.dir" value="${sdk-dir}" />
- <property name="android.tools.dir" value="${sdk.dir}/tools" />
- <property name="android.platformtools.dir" value="${sdk.dir}/platform-tools" />
- <property name="android.platforms.dir" value="${sdk.dir}/platforms/${target}" />
- <property name="android.tools.absolute.dir" location="${android.tools.dir}" />
- <property name="android.platformtools.absolute.dir" location="${android.platformtools.dir}" />
- <property name="android.platforms.absolute.dir" location="${android.platforms.dir}" />
- <!-- 定義工具
- <property name="verbose" value="false" />-->
- <condition property="exe" value=".exe" else="">
- <os family="windows" />
- </condition>
- <property name="jar.proguard" value="${proguard-jar}" />
- <property name="jar.android" value="${android.platforms.absolute.dir}/android.jar" />
- <property name="tools.dx" value="${android.platformtools.absolute.dir}/dx.bat" />
- <property name="tools.apkbuilder" value="${android.tools.absolute.dir}/apkbuilder.bat" />
- <property name="tools.adb" value="${android.tools.absolute.dir}/adb${exe}" />
- <property name="tools.zipalign" value="${android.tools.absolute.dir}/zipalign${exe}" />
- <property name="tools.aapt" value="${android.platformtools.absolute.dir}/aapt${exe}" />
- <property name="tools.aidl" value="${android.platformtools.absolute.dir}/aidl${exe}" />
- <property name="tools.jarsigner" value="${JAVA_HOME}/bin/jarsigner${exe}" />
- <!-- 定義引入工具庫
- <path id="android.antlibs">
- <pathelement path="${sdk.dir}/tools/lib/anttasks.jar" />
- <pathelement path="${sdk.dir}/tools/lib/sdklib.jar" />
- <pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" />
- <pathelement path="${sdk.dir}/tools/lib/apkbuilder.jar" />
- <pathelement path="${sdk.dir}/tools/lib/jarutils.jar" />
- </path>
- 定義任務
- <taskdef name="aaptexec" classname="com.android.ant.AaptExecLoopTask" classpathref="android.antlibs" />
- <taskdef name="apkbuilder" classname="com.android.ant.ApkBuilderTask" classpathref="android.antlibs" />
- <taskdef name="xpath" classname="com.android.ant.XPathTask" classpathref="android.antlibs" />
- -->
- <!-- 定義原始碼及資源等輸入目錄 -->
- <property name="in.source.dir" value="src" />
- <property name="in.resource.dir" value="${res-dir}" />
- <property name="in.asset.dir" value="${assets-dir}" />
- <property name="in.source.absolute.dir" location="${in.source.dir}" />
- <property name="in.resource.absolute.dir" location="${in.resource.dir}" />
- <property name="in.asset.absolute.dir" location="${in.asset.dir}" />
- <!-- 定義本地庫/第三方工具庫檔案目錄 -->
- <property name="in.external.libs.dir" value="libs" />
- <property name="in.native.libs.dir" value="libs" />
- <property name="in.external.libs.absolute.dir" location="${in.external.libs.dir}" />
- <property name="in.native.libs.absolute.dir" location="${in.native.libs.dir}" />
- <!-- 定義輸入檔案 -->
- <property name="in.manifest.file" value="${manifest-file}" />
- <property name="in.android.aidl.file" value="${android.platforms.dir}/framework.aidl" />
- <property name="in.manifest.absolute.file" location="${in.manifest.file}" />
- <property name="in.android.aidl.absolute.file" location="${in.android.aidl.file}" />
- <!-- 定義輸出檔案目錄 -->
- <property name="out.gen.dir" value="gen" />
- <property name="out.dir" value="bin" />
- <property name="out.classes.dir" value="${out.dir}/classes" />
- <property name="out.gen.absolute.dir" location="${out.gen.dir}" />
- <property name="out.absolute.dir" location="${out.dir}" />
- <property name="out.classes.absolute.dir" location="${out.classes.dir}" />
- <property name="release.absolute.dir" location="${release-dir}" />
- <!-- 定義輸出檔案 -->
- <property name="out.dex.file" value="${ant.project.name}-classes.dex" />
- <property name="out.resource.package.file" value="${ant.project.name}-resource.apk" />
- <property name="out.unsigned.package.file" value="${ant.project.name}-unsigned.apk" />
- <property name="out.signed.package.file" value="${ant.project.name}-signed.apk" />
- <property name="out.aligned.package.file" value="${ant.project.name}-aligned.apk" />
- <property name="release.package.file" value="${release-apk-file}" />
- <property name="out.dex.absolute.file" location="${out.dir}/${out.dex.file}" />
- <property name="out.resource.package.absolute.file" location="${out.dir}/${out.resource.package.file}" />
- <property name="out.unsigned.package.absolute.file" location="${out.dir}/${out.unsigned.package.file}" />
- <property name="out.signed.package.absolute.file" location="${out.dir}/${out.signed.package.file}" />
- <property name="out.aligned.package.absolute.file" location="${out.dir}/${out.aligned.package.file}" />
- <property name="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總
- 會被執行。
- -->
- <target name="-clean">
- <echo>Creating output directories if needed...</echo>
- <delete dir="${out.absolute.dir}" />
- <delete dir="${out.gen.absolute.dir}" />
- </target>
- <target name="-dirs" depends="-clean">
- <echo>Creating output directories if needed...</echo>
- <mkdir dir="${in.resource.absolute.dir}" />
- <mkdir dir="${in.external.libs.absolute.dir}" />
- <mkdir dir="${out.gen.absolute.dir}" />
- <mkdir dir="${out.absolute.dir}" />
- <mkdir dir="${out.classes.absolute.dir}" />
- </target>
- <!--
- 第一步 生成R.java類檔案:
- Eclipse中會自動生成R.java,ant和命令列使用android SDK提供的aapt.ext程式生成R.java。
- -->
- <target name="-resource-src" depends="-dirs">
- <echo>Generating R.java / Manifest.java from the resources...</echo>
- <exec executable="${tools.aapt}" failonerror="true">
- <arg value="package" />
- <arg value="-m" />
- <arg value="-J" />
- <arg path="${out.gen.absolute.dir}" />
- <arg value="-M" />
- <arg path="${in.manifest.absolute.file}" />
- <arg value="-S" />
- <arg path="${in.resource.absolute.dir}" />
- <arg value="-I" />
- <arg path="${jar.android}" />
- </exec>
- </target>
- <!--
- 第二步 將.aidl檔案生成.java類檔案:
- Eclipse中自動生成,ant和命令列使用android SDK提供的aidl.exe生成.java檔案。
- -->
- <!-- Generates java classes from .aidl files. -->
- <target name="-aidl" depends="-dirs">
- <echo>Compiling aidl files into Java classes...</echo>
- <apply executable="${tools.aidl}" failonerror="true">
- <arg value="-p${in.android.aidl.file}" />
- <arg value="-I${in.source.absolute.dir}" />
- <arg value="-o${out.gen.absolute.dir}" />
- <fileset dir="${in.source.absolute.dir}">
- <include name="**/*.aidl" />
- </fileset>
- </apply>
- </target>
- <!--
- 第三步 編譯.java類檔案生成class檔案:
- Eclipse中自動生成,ant和命令列使用jdk的javac編譯java類檔案生成class檔案。
- -->
- <!-- Compiles this project's .java files into .class files. -->
- <target name="compile" depends="-resource-src, -aidl" >
- <echo>Compiles project's .java files into .class files</echo>
- <javac encoding="utf-8" target="1.5" debug="true" extdirs="" srcdir="."
- destdir="${out.classes.absolute.dir}" bootclasspath="${jar.android}">
- <classpath>
- <fileset dir="${in.external.libs.absolute.dir}" includes="*.jar" />
- <fileset dir="${in.external.libs.absolute.dir}" includes="*.zip" />
- </classpath>
- </javac>
- </target>
- <!--Execute proguard class flies-->
- <target name="optimize" depends="compile">
- <echo>optimize classes are put to "${out.absolute.dir}" .</echo>
- <jar basedir="${out.classes.absolute.dir}" destfile="${out.absolute.dir}/temp.jar"/>
- <taskdef resource="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
- -dontusemixedcaseclassnames
- -dontskipnonpubliclibraryclasses
- -dontpreverify
- -verbose
- -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
- -include proguard.cfg
- </proguard>
- <delete file="${out.absolute.dir}/temp.jar"/>
- <delete dir="${out.classes.dir}" failonerror="false" />
- <mkdir dir="${out.classes.dir}"/>
- <unzip src="${out.absolute.dir}/optimized.jar" dest="${out.classes.absolute.dir}"/>
- <delete file="${out.absolute.dir}/optimized.jar"/>
- </target>
- <!--
- 第四步 將class檔案打包生成classes.dex檔案:
- Eclipse中自動生成,ant和命令列使用android SDK提供的dx.bat命令列指令碼生成classes.dex檔案。
- -->
- <target name="dex" depends="optimize">
- <echo>Converting compiled files and external libraries into ${out.absolute.dir}/${out.dex.file} ...</echo>
- <apply executable="${tools.dx}" failonerror="true" parallel="true">
- <arg value="--dex" />
- <arg value="--output=${out.dex.absolute.file}" />
- <arg path="${out.classes.absolute.dir}" />
- <fileset dir="${in.external.libs.absolute.dir}" includes="*.jar"/>
- </apply>
- <delete dir="${out.classes.absolute.dir}"/>
- </target>
- <!--
- 第五步 打包資原始檔(包括res、assets、androidmanifest.xml等):
- Eclipse中自動生成,ant和命令列使用Android SDK提供的aapt.exe生成資源包檔案。
- -->
- <target name="package-resource">
- <echo>Packaging resources and assets ${out.resource.package.absolute.file} ...</echo>
- <exec executable="${tools.aapt}" failonerror="true">
- <arg value="package" />
- <arg value="-f" />
- <arg value="-M" />
- <arg value="${in.manifest.file}" />
- <arg value="-S" />
- <arg value="${in.resource.absolute.dir}" />
- <arg value="-A" />
- <arg value="${in.asset.absolute.dir}" />
- <arg value="-I" />
- <arg value="${jar.android}" />
- <arg value="-F" />
- <arg value="${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. -->
- <target name="package" depends="dex, package-resource">
- <echo>Packaging ${out.unsigned.package.absolute.file} for release...</echo>
- <exec executable="${tools.apkbuilder}" failonerror="true">
- <arg value="${out.unsigned.package.absolute.file}" />
- <arg value="-u" />
- <arg value="-z" />
- <arg value="${out.resource.package.absolute.file}" />
- <arg value="-f" />
- <arg value="${out.dex.absolute.file}" />
- <arg value="-rf" />
- <arg value="${in.source.absolute.dir}" />
- <arg value="-rj" />
- <arg value="${in.external.libs.absolute.dir}" />
- </exec>
- <echo>It will need to be signed with jarsigner before being published.</echo>
- <delete file="${out.resource.package.absolute.file}" />
- <delete file="${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. -->
- <target name="jarsigner" depends="package">
- <echo>Packaging ${out.unsigned.package.absolute.file} for release...</echo>
- <exec executable="${tools.jarsigner}" failonerror="true">
- <arg value="-keystore" />
- <arg value="${keystore}" />
- <arg value="-storepass" />
- <arg value="${password}" />
- <arg value="-keypass" />
- <arg value="${password}" />
- <arg value="-signedjar" />
- <arg value="${out.signed.package.absolute.file}" />
- <arg value="${out.unsigned.package.absolute.file}" />
- <arg value="${keyalias}" />
- </exec>
- <delete file="${out.unsigned.package.absolute.file}" />
- </target>
- <!--
- 第七步 簽名的檔案進行位元組對齊;
- -->
- <target name="zipalign" depends="jarsigner">
- <echo>Zipalign ${out.aligned.package.absolute.file} for release...</echo>
- <exec executable="${tools.zipalign}">
- <arg value="-f" />
- <arg value="-v" />
- <arg value="4" />
- <arg value="${out.signed.package.absolute.file}" />
- <arg value="${out.aligned.package.absolute.file}" />
- </exec>
- <delete file="${out.signed.package.absolute.file}" />
- </target>
- <!--
- 第八步 簽名的檔案進行位元組對齊;
- -->
- <target name="release" depends="zipalign">
- <copy tofile="${release.package.absolute.file}">
- <fileset dir="${out.absolute.dir}" includes="${out.aligned.package.file}"/>
- </copy>
- <delete file="${out.aligned.package.absolute.file}" />
- </target>
- </project>
相關文章
- Android學習筆記之build.gradle檔案Android筆記UIGradle
- 有關android工程的構建指令碼(build.xml)的學習Android指令碼UIXML
- Java學習筆記之檔案Java筆記
- Linux學習之檔案操作Linux
- Android學習-2 :App工程檔案分析AndroidAPP
- python學習之讀寫檔案Python
- (十七)Python學習之檔案操作Python
- MyBatis學習 之 四、MyBatis配置檔案MyBatis
- 【AIX 學習】檔案系統之 PROCAI
- Android學習筆記之檔案分類和線性佈局Android筆記
- Android學習筆記之AndroidManifest.xml檔案解析(詳解)Android筆記XML
- Linux系統學習之檔案管理Linux
- Mahout學習之命令列建立序列檔案命令列
- Ant之build.xml詳解UIXML
- 【學習日記】oracle之表空間、資料檔案、控制檔案Oracle
- 零基礎學習 Python 之檔案Python
- 學習Source Generators之輸出生成的檔案
- gch檔案學習GC
- Android之SurfaceView學習AndroidView
- Android之XML檔案解析AndroidXML
- go學習之檔案讀取問題(需更新)Go
- Python學習筆記|Python之檔案操作Python筆記
- Python學習筆記|Python之特殊檔案Python筆記
- 【轉】Ant之build.xml詳解UIXML
- 檔案IO的學習
- EXT4檔案系統學習(15)VFS之VFS 檔案/目錄物件物件
- Android加密之檔案級加密Android加密
- android開發之網路學習-Socket學習Android
- 如何系統學習C 語言(下)之 檔案篇
- 學習 VIM 之 2014:和檔案打交道
- Android原始碼學習之handlerAndroid原始碼
- Android之Mina框架學習Android框架
- Android學習筆記之IntentAndroid筆記Intent
- Android學習之 屬性動畫Android動畫
- 學習Rust 檔案與 IORust
- B站java學習檔案Java
- oracle的profile檔案學習Oracle
- Android:檔案下載和寫入SD卡學習小結AndroidSD卡