在Windows下用ant编译Android应用生成apk安装包

一般情况下,我们用Eclipse开发Android应用,几乎从来没有考虑用命令行来编译,因为Eclipse太强大了以至于Android开发成为了傻瓜。

今天,我决心来尝试一下用ant来编译Android应用,ant编译Android应用其实就是调用多个Android SDK提供的多个编译工具,最后编译打包签名,形成apk文件。

我的开发环境是Windows XP,Java是1.6的,Eclipse是adt自带的那个。下面是用ant来编译Android应用的build.xml的内容。

<project default="main" basedir=".">
 
    <property name="apk-name" value="product" />
    <property name="apk-version" value="latest" />
    <property name="apk-market" value="dev" />
    <property name="basedir" value="." />
 
    <property name="android-jar" value="E:/adt-bundle-windows-x86-20130219/sdk/platforms/android-8/android.jar" />
    <!-- <property name="android-jar" value="/usr/lib/android-sdk/platforms/android-10/android.jar" /> -->
 
    <target name="init">
        <echo>start initing ... </echo>
 
        <mkdir dir="out" />
        <delete>
            <fileset dir="out"></fileset>
        </delete>
         
        <mkdir dir="gen" />
        <delete>
            <fileset dir="gen"></fileset>
        </delete>
         
        <mkdir dir="bin/classes" />
        <delete>
            <fileset dir="bin/classes"></fileset>
        </delete>
         
        <mkdir dir="build/${apk-version}" />
 
        <echo>finish initing. </echo>
    </target>
 
    <target name="main" depends="init">
        <echo>generating R.java for project to dir gen (using aapt) ... </echo>
        <exec executable="aapt">
            <arg value="package" />
            <arg value="-m" />
            <arg value="-J" />
            <arg value="gen" />
            <arg value="-M" />
            <arg value="AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="res" />
            <arg value="-S" />
            <arg value="${basedir}/res" />
            <arg value="-I" />
            <arg value="${android-jar}" />
            <arg value="--auto-add-overlay" />
        </exec>
 
        <echo>generating R.java for library to dir gen (using aapt) ... </echo>
        <exec executable="aapt">
            <arg value="package" />
            <arg value="-m" />
            <arg value="--non-constant-id" />
            <arg value="--auto-add-overlay" />
            <arg value="-J" />
            <arg value="gen" />
            <arg value="-M" />
            <arg value="${basedir}/AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="res" />
            <arg value="-S" />
            <arg value="${basedir}/res" />
            <arg value="-I" />
            <arg value="${android-jar}" />
        </exec>
 
        <path id="project.libs">
            <fileset dir="libs">
                <include name="*.jar" />
            </fileset>
        </path>
        <echo>compiling java files to class files (include R.java, library and the third-party jars) ... </echo>
        <javac destdir="bin/classes" bootclasspath="${android-jar}">
            <src path="${basedir}/src" />
            <src path="src" />
            <src path="gen" />
            <classpath refid="project.libs" />
        </javac>
 
        <echo>packaging class files (include the third-party jars) to calsses.dex ... </echo>
        <!-- <exec executable="dx"> -->
        <exec executable="dx.bat">
            <arg value="--dex" />
            <arg value="--output=${basedir}/out/classes.dex" />
            <arg value="${basedir}/bin/classes" />
            <arg value="${basedir}/libs" />
        </exec>
 
        <echo>packaging resource (include res, assets, AndroidManifest.xml, etc.) to res.zip ... </echo>
        <exec executable="aapt">
            <arg value="package" />
            <arg value="-f" />
            <arg value="-M" />
            <arg value="AndroidManifest.xml" />
            <arg value="-S" />
            <arg value="res" />
            <arg value="-S" />
            <arg value="${basedir}/res" />
            <arg value="-A" />
            <arg value="assets" />
            <arg value="-I" />
            <arg value="${android-jar}" />
            <arg value="-F" />
            <arg value="out/res.zip" />
            <arg value="--auto-add-overlay" />
        </exec>
 
        <echo>building unsigned.apk ... </echo>
        <!-- <exec executable="apkbuilder"> -->
        <exec executable="apkbuilder.bat">
            <arg value="${basedir}/out/unsigned.apk" />
            <arg value="-u" />
            <arg value="-z" />
            <arg value="${basedir}/out/res.zip" />
            <arg value="-f" />
            <arg value="${basedir}/out/classes.dex" />
        </exec>
 
        <echo>signing the unsigned apk to final product apk ... </echo>
        <exec executable="jarsigner">
            <arg value="-keystore" />
            <arg value=".keystore" />
            <arg value="-storepass" />
            <arg value="hello123456" />
            <arg value="-keypass" />
            <arg value="hello123456" />
            <arg value="-signedjar" />
            <arg value="${basedir}/build/${apk-version}/${apk-name}_${apk-version}_${apk-market}.apk" />
            <arg value="${basedir}/out/unsigned.apk" />
            <arg value="zhy" />
        </exec>
 
        <echo>done.</echo>
    </target>
</project>

上面的build.xml文件在我的机器上测试通过了。注意,我加粗的部分就是要稍作修改的部分,你应该懂的。

要注意的是,在执行之前要用 keytool -genkey -alias yourname 来生成一个密钥。并将.keystore文件复制到目录下,或者指定具体的位置。否则,最后一步不能成功的话,就无法生成在手机上可安装使用的apk文件了。

E:\workspace\Hello8>ant
Buildfile: E:\workspace\Hello8\build.xml

init:
     [echo] start initing ...
    [mkdir] Created dir: E:\workspace\Hello8\out
    [mkdir] Created dir: E:\workspace\Hello8\gen
    [mkdir] Created dir: E:\workspace\Hello8\bin\classes
    [mkdir] Created dir: E:\workspace\Hello8\build\latest
     [echo] finish initing.

main:
     [echo] generating R.java for project to dir gen (using aapt) ...
     [echo] generating R.java for library to dir gen (using aapt) ...
     [echo] compiling java files to class files (include R.java, library and the
 third-party jars) ...
    [javac] E:\workspace\Hello8\build.xml:76: warning: 'includeantruntime' was n
ot set, defaulting to build.sysclasspath=last; set to false for repeatable build
s
    [javac] Compiling 2 source files to E:\workspace\Hello8\bin\classes
     [echo] packaging class files (include the third-party jars) to calsses.dex
...
     [echo] packaging resource (include res, assets, AndroidManifest.xml, etc.)
to res.zip ...
     [echo] building unsigned.apk ...
     [exec]
     [exec] THIS TOOL IS DEPRECATED. See --help for more information.
     [exec]
     [echo] signing the unsigned apk to final product apk ...
     [exec]
     [exec] 警告:
     [exec] 签名者证书将在六个月内过期。
     [echo] done.

BUILD SUCCESSFUL
Total time: 9 seconds

E:\workspace\Hello8>

因为我在用keytool -genkey 的时候没有指定有效期,默认就是六个月。这在实际使用的时候,肯定是要指定时长的,比如10年20年之类的。

之所以,我能够这么快就能成功的使用ant编译android应用,全都是下面这篇文章的功能(不过我修改了一下build.xml才运行通过):

Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包

http://www.cnblogs.com/qianxudetianxia/archive/2012/07/04/2573687.html#commentform

在此,对该文的作者表示感谢和敬意!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值