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>