天天看點

Android打包之将bat腳本轉換成ant腳本

《Android打包之bat腳本打包》實作了bat腳本的打包,現在我們将該腳本轉換成ant的腳本來執行。ant腳本是xml檔案,指令描述在target節點中,需要執行外置的指令時需要在target下增加子節點exec,并在exec節點中通過子節點arg來指定參數。我們同樣按打包流程來實作該腳本,打包流程如下:

1、生成R.java

2、編譯*.java

3、生成classes.dex

4、将assets、res打包

5、生成未簽名的apk

6、将apk簽名

基于這些步驟,我們來編寫ant腳本。

1、生成R.java

 <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... 
	1.aapt package -f -m -J gen -S res -I D:/android-sdk-windows/platforms/android-16/android.jar -M AndroidManifest.xml
        </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>
           

注:

(1)、target中的name是該target的名字,該名字會在其他target的depends中調用,也可在project的default中使用,也可在指定ant腳本時調用。

(2)、depends指定的是該target執行前需要執行的target。

(3)、arg中的參數與《Android打包之bat腳本打包》的1_genR的bat腳本參數相對應。

(4)、${XXX}是對變量的引用,這些變量定義到property屬性中。下面是相關的代碼。

<property
        name="sdk-folder"
        value="D:\android-sdk-windows" />

    <property
        name="platform-folder"
        value="${sdk-folder}\platforms\android-17" />

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

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

注:

(1)、sdk-folder指定了android-sdk所在的目錄。

(2)、jdk-folder指定的是jdk所在的目錄。建議使用jdk1.6,jdk1.7可能會有問題。

(3)、tools中指定了所要用到的工具。

(4)、其他變量自行對應。

2、編譯*.java

<target
        name="compile"
        depends="gen-R" >

        <echo>
	Compile...
 	2.javac -target 1.6 -bootclasspath D:/android-sdk-windows/platforms/android-16/android.jar -d bin gen\com\example\antdemo\*.java src\com\example\antdemo\*.java

        </echo>

        <exec
            executable="${tools.javac}"
            failοnerrοr="true" >

            <arg value="-target" />

            <arg value="1.6" />

            <arg value="-bootclasspath" />

            <arg value="${android-jar}" />

            <arg value="-d" />

            <arg value="${bin}" />

            <arg value="${java-file-gen}" />

            <arg value="${java-file-src}" />
        </exec>
    </target>
           

注:調用javac指令來編譯,相關的參數與《 Android打包之bat腳本打包》的2_compile.bat腳本相對應。

3、生成classes.dex

<target
        name="dex"
        depends="compile" >

        <echo>
	Generate dex...
  	3.dx 兩個短橫dex 兩個短橫output=G:\Code\Android\Workspace\AntDemo\bin\classes.dex G:\Code\Android\Workspace\AntDemo\bin
        </echo>

        <exec
            executable="${tools.dx}"
            failοnerrοr="true" >

            <arg value="--dex" />

            <arg value="--output=${dex-name}" />

            <arg value="${bin}" />
        </exec>
    </target>
           

注:

(1)、兩個短橫表示的是--,因--在xml中屬性特殊标記,是以使用文字來描述。

(2)、相關的參數與《Android打包之bat腳本打包》的3_dex.bat腳本相對應。

4、将assets、res打包

<target
        name="package"
        depends="dex" >
        <echo>
   	Package resource and assets...
   	4.aapt package -f -A assets -S res -I D:/android-sdk-windows/platforms/android-16/android.jar -M AndroidManifest.xml -F bin/AntDemo
        </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>
           

注:相關的參數與《Android打包之bat腳本打包》的4_package.bat腳本相對應。

5、生成未簽名的apk

<target
        name="build-unsigned-apk"
        depends="package" >
        <echo>
 	 Build unsigned apk
 	 5.apkbuilder G:\Code\Android\Workspace\AntDemo\bin\AntDemo_unsigned.apk -v -u -z G:\Code\Android\Workspace\AntDemo\bin\AntDemo -f G:\Code\Android\Workspace\AntDemo\bin\classes.dex -rf G:\Code\Android\Workspace\AntDemo\src
        </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>

           

注:相關的參數與《 Android打包之bat腳本打包》的5_unsinged.bat腳本相對應。

6、将apk簽名

<target
        name="sign-apk"
        depends="build-unsigned-apk" >
        <echo>
  	Sign apk
  	6.jarsigner -keystore G:\Code\Android\Workspace\AntDemo\build\my.keystore -storepass 123456 -keypass 123456 -signedjar G:\Code\Android\Workspace\AntDemo\bin\AntDemo_signed.apk G:\Code\Android\Workspace\AntDemo\bin\AntDemo_unsigned.apk ant_test
        </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>

           

注:相關的參數與《 Android打包之bat腳本打包 》的6_singed.bat腳本相對應。

附1: 增加release指令,執行一些收尾任務。

<target
        name="release"
        depends="sign-apk" >

        <delete file="${unsigned-apk-path}" />

        <echo>
	APK is released. path:${signed-apk-path}

        </echo>
    </target>
           

注:delete是ant的内置指令。

附2:腳本頭

<?xml version="1.0" encoding="UTF-8"?>
<project
    name="AntDemo"
    default="release" >
	....
</project>
           

注: name是工程名稱,default指的是預設執行的target。下面是執行的過程圖。

Android打包之将bat腳本轉換成ant腳本

輸出的apk檔案如下

Android打包之将bat腳本轉換成ant腳本

轉載請注明出處:Android打包之将bat腳本轉換成ant腳本

源碼下載下傳