《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.zipalign"
value="${sdk-folder}\tools\zipalign.exe" />
<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}_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}"
failοnerrοr="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}"
failοnerrοr="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}"
failοnerrοr="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}"
failοnerrοr="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}"
failοnerrοr="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}"
failοnerrοr="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》