《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}platformsandroid-8" /> <property name="platform-tools-folder" value="${sdk-folder}platform-tools" /> <property name="jdk-folder" value="D:Program Files (x86)Javajdk1.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}injavac.exe" /> <property name="tools.dx" value="${platform-tools-folder}dx.bat" /> <property name="tools.apkbuilder" value="${sdk-folder} oolsapkbuilder.bat" /> <property name="tools.zipalign" value="${sdk-folder} oolszipalign.exe" /> <property name="tools.jarsigner" value="${jdk-folder}injarsigner.exe" /> <!-- dir --> <property name="project-dir" value="G:CodeAndroidWorkspaceAntDemo" /> <property name="res" value="${project-dir} es" /> <property name="gen" value="${project-dir}gen" /> <property name="src" value="${project-dir}src" /> <property name="bin" value="${project-dir}in" /> <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}comexampleantdemo*.java" /> <property name="java-file-src" value="${src}comexampleantdemo*.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}_signed.apk" /> <property name="signed-apk-path" value="${bin}${signed-apk-name}" /> <property name="zipalign-apk-name" value="${ant.project.name}.apk" /> <property name="zipalign-apk-path" value="${bin}${zipalign-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" destdir="${bin}" encoding="utf-8" includeAntRuntime="true" listfiles="true" target="1.6" > <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="zipalign" depends="sign-apk" > <echo> Zipalign... </echo> <exec executable="${tools.zipalign}" failonerror="true" > <arg value="-v" /> <arg value="4" /> <arg value="${signed-apk-path}" /> <arg value="${zipalign-apk-path}" /> </exec> </target> <target name="release" depends="zipalign" > <delete file="${pakcage-temp-name}" /> <delete file="${unsigned-apk-path}" /> <delete file="${signed-apk-path}" /> <echo> APK is released. path:${zipalign-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可以是多个。
5、zipalign进行4字节对齐的优化。具体的可以参看此文《简单优化:Zipalign》