• 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}"
                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>
    注:

    (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}platformsandroid-17" />
    
        <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.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" />
    
        <!-- 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}.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 gencomexampleantdemo*.java srccomexampleantdemo*.java
    
            </echo>
    
            <exec
                executable="${tools.javac}"
                failonerror="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:CodeAndroidWorkspaceAntDemoinclasses.dex G:CodeAndroidWorkspaceAntDemoin
            </echo>
    
            <exec
                executable="${tools.dx}"
                failonerror="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}"
                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>
    注:相关的参数与《Android打包之bat脚本打包》的4_package.bat脚本相对应。
    5、生成未签名的apk

     <target
            name="build-unsigned-apk"
            depends="package" >
            <echo>
     	 Build unsigned apk
     	 5.apkbuilder G:CodeAndroidWorkspaceAntDemoinAntDemo_unsigned.apk -v -u -z G:CodeAndroidWorkspaceAntDemoinAntDemo -f G:CodeAndroidWorkspaceAntDemoinclasses.dex -rf G:CodeAndroidWorkspaceAntDemosrc
            </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>
    
    注:相关的参数与《Android打包之bat脚本打包》的5_unsinged.bat脚本相对应。
    6、将apk签名

    <target
            name="sign-apk"
            depends="build-unsigned-apk" >
            <echo>
      	Sign apk
      	6.jarsigner -keystore G:CodeAndroidWorkspaceAntDemouildmy.keystore -storepass 123456 -keypass 123456 -signedjar G:CodeAndroidWorkspaceAntDemoinAntDemo_signed.apk G:CodeAndroidWorkspaceAntDemoinAntDemo_unsigned.apk ant_test
            </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>
    
    注:相关的参数与《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。下面是执行的过程图。

    输出的apk文件如下


    转载请注明出处:Android打包之将bat脚本转换成ant脚本

    源码下载

  • 相关阅读:
    转载php在IIS中运行
    程序员必去的网站
    分享一下jQuery UI的地址
    dbcp相关配置
    shell学习第二弹-进阶
    shell学习第一弹-初识
    java servlet 3.0文件上传
    Junit使用第二弹
    各个数据库中,查询前n条记录的方法
    junit使用第一弹
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7605020.html
Copyright © 2020-2023  润新知