通過Ant將Android project編譯打包成APK檔案並安裝到手機

yangxi_001發表於2014-03-14

本文簡要介紹如何通過Ant指令碼Android project編譯打包成APK檔案並安裝到手機。

主要步驟:

1生成R.java類檔案:利用ant和命令列使用android SDK提供的aapt.ext程式生成R.java。
2將.aidl檔案生成.java類檔案:利用ant和命令列使用android SDK提供的aidl.exe生成.java檔案。
3第三步 編譯.java類檔案生成class檔案:利用ant和命令列使用jdk的javac編譯java類檔案生成class檔案。
4第四步 將class檔案打包生成classes.dex檔案:利用ant命令列使用android SDK提供的dx.bat命令列指令碼生成classes.dex檔案。
5第五步 打包資原始檔(包括res、assets、androidmanifest.xml等):ant命令列使用Android SDK提供的aapt.exe生成資源包檔案。
6第六步 生成未簽名的apk安裝檔案:ant和命令列使用android SDK提供的apkbuilder.bat命令指令碼生成未簽名的apk安裝檔案。
7第七步 對未簽名的apk進行簽名生成簽名後的android檔案:ant和命令列使用jdk的jarsigner對未簽名的包進行apk簽名。
8第八步 安裝和解除安裝APK檔案,利用ant命令列使用Android SDK提供的adb.exe。

下面貼出build指令碼和property檔案:具體例子可以從http://download.csdn.net/source/3505789 下載。

<?xml version="1.0" encoding="UTF-8"?>
<project name="AntTest" default="help">

    <property file="build.properties" />

    <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" />
    </path>

    <path id="project.classpath">
        <pathelement location="${android-jar}" />
    </path>
    <taskdef name="setup" classname="com.android.ant.SetupTask" classpathref="android.antlibs" />
    <setup/> 
    
    <target name="copy">
        <copy todir="${outdir-gen}">
            <fileset dir="${srcdir}" />
        </copy>
    </target>
    <target name="GenRJAVA">
        <echo>Generating R.java from the resources...</echo>
        <mkdir dir="${outdir-gen}" />
        <exec executable="${aapt}" failonerror="true">
            <arg value="package" />
            <arg value="-m" />
            <arg value="-J" />
            <arg value="${outdir-gen}" />
            <arg value="-M" />
            <arg value="${projecthomedir}/AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="${resource-dir}" />
            <arg value="-I" />
            <arg value="${android-jar}" />
        </exec>
    </target>
    <target name="aidl" depends="copy">
        <echo>Compiling aidl files into Java classes...</echo>
        <apply executable="${aidl}" failonerror="true">
            <arg value="-p${sdk.dir}" />
            <arg value="-I${srcdir}" />
            <fileset dir="${srcdir}">
                <include name="**/*.aidl" />
            </fileset>
        </apply>
    </target>
    <!-- Compile this project's .java files into .class files. -->
    <target name="compile" depends="copy, GenRJAVA, aidl">
        <mkdir dir="${outdir-classes}" />
        <javac encoding="UTF-8" target="1.5" debug="true" extdirs="" srcdir="${outdir-gen}" destdir="${outdir-classes}" bootclasspath="${android-jar}">
            <classpath refid="project.classpath" />
        </javac>
    </target>

    <!-- Convert this project's .class files into .dex files. -->
    <target name="dex" depends="compile">
        <echo>Converting compiled files and external libraries into ${outdir-dx}/test.dex...</echo>
        <mkdir dir="${outdir-dx}" />
        <apply executable="${dx}" failonerror="true" parallel="true">
            <arg value="--dex" />
            <arg value="--output=${outdir-dx}/test.dex" />
            <arg path="${outdir-classes}" />
            <fileset dir="${projecthomedir}" includes="*.jar" />
        </apply>
    </target>
    <!-- Put the project's resources into the output package file. -->
    <target name="package-res">
        <echo>Packaging resources and assets...</echo>
        <mkdir dir="${apkdir}" />
        <exec executable="${aapt}" failonerror="true">
            <arg value="package" />
            <arg value="-f" />
            <arg value="-M" />
            <arg value="${projecthomedir}/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="packageAPK" depends="dex, package-res">
        <echo>Packaging apk for release...</echo>
        <exec executable="${apkbuilder}" failonerror="true">
            <arg value="${apkdir}/${unsignedapkname}" />
            <arg value="-u" />
            <arg value="-z" />
            <arg value="${resources-package}" />
            <arg value="-f" />
            <arg value="${outdir-dx}/test.dex" />
            <arg value="-rf" />
            <arg value="${srcdir}" />
            <arg value="-rj" />
            <arg value="${outdir-gen}" />
        </exec>
        <echo>It will need to be signed with jarsigner before being published.</echo>
    </target>
    <target name="signAPK" depends="packageAPK">
        <echo>signAPK ${apkdir}/${apkname}</echo>
        <signjar
                jar="${apkdir}/${unsignedapkname}"
                signedjar="${apkdir}/${apkname}"
                keystore="keystore"
                storepass="123456"
                alias="alias"
                keypass="123456"
                verbose="-verbose" />
        <!--
        <exec executable="${jarsigner}" failonerror="true">
            <arg value="-verbose" />
            <arg value="-storepass" />
            <arg value="test" />
            <arg value="-keypass" />
            <arg value="test" />
            <arg value="-keystore" />
            <arg value="bbyread.keystore" />
            <arg value="-signedjar" />
            <arg value="${apkdir}/${apkname}" />
            <arg value="${apkdir}/${unsignedapkname}" />
            <arg value="byread" />
        </exec>-->
    </target>
    
    <target name="installAPK" depends="signAPK">
        <echo>Install APK...</echo>

        <exec executable="adb" failonerror="true">
            <arg value="install" />
            <arg value="${apkdir}/${apkname}" />
        </exec>
    </target>

    <target name="uninstallAPK">
        <echo>uninstall APK..</echo>
        <exec executable="adb" failonerror="true">
            <arg value="uninstall" />
            <arg value="com.anttest" />
        </exec>
    </target>

    <target name="help" />

</project>

property檔案內容:

target=android-8
sdk.dir=D:\\Android\\android-sdk-windows
    
apkbuilder=${sdk.dir}\\tools\\apkbuilder.bat

android-jar=${sdk.dir}\\platforms\\android-8\\android.jar

projecthomedir=D:\\Android\\AndriodWK\\AntTest
builddir=${projecthomedir}\\build
resource-dir=${projecthomedir}\\res
asset-dir=${projecthomedir}\\assets
srcdir=${projecthomedir}\\src

outdir-gen=${builddir}\\src
outdir-classes=${builddir}\\classes
outdir-dx=${builddir}\\dx
resources-package=${builddir}\\respak
apkdir=${builddir}\\apk
unsignedapkname=unsigntest.apk
apkname=test.apk


相關文章