《Android打包之将bat脚本转换成ant脚本》实现了ant打包,只是需要打入第三方jar包时,需要对其中的compie和dex部分进行修改,下面是实现的ant脚本。
build.xml
<?xml version="1.0" encoding="UTF-8"?> <project name="AntDemo" default="release" > <property name="sdk-folder" value="D:\android-sdk-windows" /> <property name="platform-folder" value="${sdk-folder}\platforms\android-8" /> <property name="platform-tools-folder" value="${sdk-folder}\platform-tools" /> <property name="jdk-folder" value="D:\Program Files (x86)\Java\jdk1.6.0_45" /> <!-- tools --> <property name="android-jar" value="${platform-folder}\android.jar" /> <property name="tools.aapt" value="${platform-tools-folder}\aapt.exe" /> <property name="tools.javac" value="${jdk-folder}\bin\javac.exe" /> <property name="tools.dx" value="${platform-tools-folder}\dx.bat" /> <property name="tools.apkbuilder" value="${sdk-folder}\tools\apkbuilder.bat" /> <property name="tools.jarsigner" value="${jdk-folder}\bin\jarsigner.exe" /> <!-- dir --> <property name="project-dir" value="G:\Code\Android\Workspace\AntDemo" /> <property name="res" value="${project-dir}\res" /> <property name="gen" value="${project-dir}\gen" /> <property name="src" value="${project-dir}\src" /> <property name="bin" value="${project-dir}\bin" /> <property name="assets" value="${project-dir}\assets" /> <property name="libs" value="${project-dir}\libs" /> <!-- files --> <property name="manifest" value="${project-dir}\AndroidManifest.xml" /> <property name="java-file-gen" value="${gen}\com\example\antdemo\*.java" /> <property name="java-file-src" value="${src}\com\example\antdemo\*.java" /> <property name="dex-name" value="${bin}\classes.dex" /> <property name="pakcage-temp-name" value="${bin}\${ant.project.name}" /> <property name="unsigned-apk-name" value="${ant.project.name}_unsigned.apk" /> <property name="unsigned-apk-path" value="${bin}\${unsigned-apk-name}" /> <property name="signed-apk-name" value="${ant.project.name}.apk" /> <property name="signed-apk-path" value="${bin}\${signed-apk-name}" /> <property name="keystore-name" value="${project-dir}\my.keystore" /> <property name="keystore-alias" value="ant_test" /> <!-- task --> <target name="init" > <echo> Initialize... </echo> <delete dir="${bin}" /> <mkdir dir="${bin}" /> </target> <target name="gen-R" depends="init" > <echo> Generating R.java from the resources... </echo> <exec executable="${tools.aapt}" failonerror="true" > <arg value="package" /> <arg value="-f" /> <arg value="-m" /> <arg value="-J" /> <arg value="${gen}" /> <arg value="-S" /> <arg value="${res}" /> <arg value="-M" /> <arg value="${manifest}" /> <arg value="-I" /> <arg value="${android-jar}" /> </exec> </target> <target name="compile" depends="gen-R" > <echo> Compile... </echo> <javac bootclasspath="${android-jar}" compiler="javac1.6" target="1.6" destdir="${bin}" encoding="utf-8" includeAntRuntime="true" listfiles="true"> <src path="${project-dir}"/> <classpath> <fileset dir="${libs}" includes="*.jar" /><!-- 引用第三方jar包需要引用,用于辅助编译,并没有将jar打包进去。jar的打包在dex命令中。--> </classpath> </javac> </target> <target name="dex" depends="compile" > <echo> Generate dex... </echo> <exec executable="${tools.dx}" failonerror="true" > <arg value="--dex" /> <arg value="--output=${dex-name}" /> <arg value="${bin}" /><!-- classes文件位置 --> <arg value="${libs}"/><!-- 把libs下所有jar打包 --> </exec> </target> <target name="package" depends="dex" > <echo> Package resource and assets... </echo> <exec executable="${tools.aapt}" failonerror="true" > <arg value="package" /> <arg value="-f" /> <arg value="-A" /> <arg value="${assets}" /> <arg value="-S" /> <arg value="${res}" /> <arg value="-I" /> <arg value="${android-jar}" /> <arg value="-M" /> <arg value="${manifest}" /> <arg value="-F" /> <arg value="${pakcage-temp-name}" /> </exec> </target> <target name="build-unsigned-apk" depends="package" > <echo> Build unsigned apk </echo> <exec executable="${tools.apkbuilder}" failonerror="true" > <arg value="${unsigned-apk-path}" /> <arg value="-v" /> <arg value="-u" /> <arg value="-z" /> <arg value="${pakcage-temp-name}" /> <arg value="-f" /> <arg value="${dex-name}" /> <arg value="-rf" /> <arg value="${src}" /> </exec> </target> <target name="sign-apk" depends="build-unsigned-apk" > <echo> Sign apk </echo> <exec executable="${tools.jarsigner}" failonerror="true" > <arg value="-keystore" /> <arg value="${keystore-name}" /> <arg value="-storepass" /> <arg value="123456" /> <arg value="-keypass" /> <arg value="123456" /> <arg value="-signedjar" /> <arg value="${signed-apk-path}" /> <arg value="${unsigned-apk-path}" /> <arg value="${keystore-alias}" /> </exec> </target> <target name="release" depends="sign-apk" > <delete file="${pakcage-temp-name}" /> <delete file="${unsigned-apk-path}" /> <echo> APK is released. path:${signed-apk-path} </echo> </target> </project>
注:
1、compile部分的classpath所引用的jar包是为了辅助编译的,并没有将jar打包进去。dex部分最后的一个参数${libs}才是真正将第三方jar包打包进去的部分,即将其打包到classes.dex中。
2、compile中的compiler是特别指定所用的javac,listfiles为true是显示编译过程中编译的文件。
3、includeAntRuntime:其作用是指定编译任务是否包含ant的classpath,在Ant1.8版以后如果没有设置该选项会弹出警告“warning: ‘includeantruntime’ was not set”。在Ant 总会把它自己的 runtime包含进对 javac 任务可见的 classpath中。因此,任何与Ant有关的库都会自动进入你的构建类路径,不管你是否需要它们。这对大部分人来说可能是没必要的,因此,新的Ant版本提供了这个选项。新版本不提供默认值是为了保证早期构建文件的可移植性,即在不同Ant版本下,构建文件都能保持一致的行为
4、src相当于javac中的srcdir。src可以是多个。