首页 > 代码库 > Ant自动化构建Andriod项目详解

Ant自动化构建Andriod项目详解

       因工作需要,最近一直在用ant实现各android工程的自动化构建。在编写自动化构建脚本过程中遇到了各种各样的坑,在逐一跳坑的过程中,也对ant的自动化构建过程也有了较为深入的了解。本文将着重介绍android平台下如何使用ant自动化编译打包apk, 及在使用过程中的遇到的问题和解决方式,希望能够对大家有所帮助。

1.      简单了解下Ant

1.1.    什么是 Ant:

Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于 Java 环境中的软件开发。由 Apache 软件基金会所提供。—— 维基百科

1.2.    Ant 的优点:

1)      跨平台性—— Ant 是由 Java 语言编写的,所以具有很好的跨平台性。

2)      操作简单—— Ant 构建文件基于 XML 格式的文件,所以和容易维护和书写,而且结构很清晰。

3)      方便集成到开发环境——由于 Ant 的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。

1.3.    Ant 安装部署及关键元素:

大家可以参照下面这篇文章,讲得非常清晰细致:      http://www.blogjava.net/amigoxie/archive/2007/11/09/159413.html

2.      Android Apk的编译流程

首先来看一下使用Java语言编写的Android应用程序从源码到安装包的整个过程,示意图如下,其中包含编译、链接和签名等:

图1 Apk编译流程图

使用Ant来对应用打包,实际上就是在build.xml(Ant的构件文件是基于XML编写的,默认名称为build.xml)文件中实现以下几个步骤:

1)        调用aapt工具生成R.java文件(对应eclipse的Android工程中,eclipse自动生成的gen目录下的文件,用于保存控件对应的id)。

2)        调用aidl命令生成相应java文件(若工程中没有*.aidl文件,则该步骤可省略

3)        调用javac将java文件编译成java字节码(.class文件)。

4)        调用dx.bat将.class文件和其他调用到的第三方库文件编译成.dex文件。(.dex文件是可以在dalvik虚拟机上直接运行文件格式,可以理解为对java字节码做的针对嵌入式设备的优化)。

5)        再次调用aapt命令编译项目中的资源文件生成资源包resources.ap_

6)        用apkbuilder.bat打包资源和classes.dex文件,生成unsigned.apk

7)        用jarsinger命令对apk认证,生成signed.apk

8)        调用zipalign进行性能提升。

为了便于理解和记忆,下面来用一张流程图来说明以上的几个过程:

图2 Ant自动化构建步骤

3.      Ant自动化构建的两种方法

Android 工程的自动化构建,听起来很复杂,但掌握了下面两种方法之一,就很容易做到。

具体方法有:

① 自定义构建脚本来实现带有Android Apk的自动化构建。

② 使用Android SDK自带的构建脚本,通过参数传人构建Android Apk。

下面将分别介绍这两种自动化构建方法。

3.1.    方法一:自定义构建脚本实现Android Apk自动化编译

上面已经介绍了使用ant编译的流程,下面我们将分别以单工程多工程的ant编译过程为例,对其每个部分进行详细讲解,把每一个步骤都弄清楚。

3.1.1. 单工程手动实现ant自动化编译

1)        Android程序基本目录结构,如下图所示:

Android工程目录结构总共分几部分:src、gen、libs、assets、res以及根目录的属性等文件,各目录及文件的作用,大家可参考:http://www.360doc.com/content/14/0425/16/9200790_372140391.shtml

Ant编译主要是用到src、libs、res和AndroidManifest.xml几个文件夹。

gen: 为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID。

bin: 目录是编译之后的apk存放目录,编译的过程首先是编译成为Android java虚拟机文件classes.dex,再把该classes.dex文件打包成为apk包。

2)        Ant自动化编译Android单工程详细步骤

l  初始化:创建和清理输出路径的文件

在正式打包之前,有必要说明一下可能需要用到的初始化变量和操作。前面已经讲述了打包的大概流程,现在,第一, 打包需要你使用哪个版本android.jar; 第二, 生成的R文件放到gen目录下;第三, 生成的classes文件放到bin目录下; 第四, 生成的打包文件放到out目录下......
    所以,如下的初始化必须先要做好,不然后面会提示找不到目录:

l  步骤1:调用aapt(Android Asset Packaging Tool)命令,根据资源文件生成R.java文件。

参数说明:

       -f     强制覆盖已存在的文件。
       -m   在-J指定的位置下自动生成相应的包的目录。
       -J    指定R.java文件生成的目录。
       -S    指定资源目录。
       -M   指定清单文件。
       -I     引入类库。

l  步骤2:调用aidl(Android Interface Definition Language)命令,根据.aidl文件生成.java文件(若工程中没有.aidl文件,则该步骤可省略)。

注意:如果工程中有.aidl文件则必须调用aidl对其进行转换,否则ant编译的时候会报错。

l  步骤3:调用javac将java文件编译成java字节码(.class文件)。

l  步骤4:调用dx.bat将.class文件和调用到的第三方库文件编译成.dex文件。

apply标签可以见:https://Ant.apache.org/manual/Tasks/apply.html

我们着重讲解下以下三个参数:

Xms:是指设定程序启动时占用内存大小。一般来讲,大点,程序会启动的快一点,但是也可能会导致机器暂时间变慢。

Xmx:是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。

Xss:是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程大约需要占用多少内存,可能会有多少线程同时运行等。

问题:在编译到dex这一步骤时报如下错误,原因就在于Xmx的值超过了服务器内存大小或者超过了jdk所支持的内存最大值

       具体原因下面这两篇文章讲得非常清楚:

http://hi.baidu.com/jxqlovejava/item/6dcafd250fff6ec0a4275a24

http://blog.csdn.net/alen1985/article/details/8629501

自己测试一下,果然是Xms的值设置的过大引起的

将Xms的值设置为1024M,就ok了,见下图:

设置上述三个值后,就可以正常编译dex文件了~

l  步骤5:再次调用aapt工具来编译项目中的资源文件。

l  步骤6:调用apkbuilder工具将.dex文件和bin目录下的资源文件编译成APK。

apkbuilder在最新的Android-Sdk中被弃用了,所以需要自己到网上下载一个或者将旧版本中的apkbuilder拷贝过来,我的sdk就是最新版本的,是没有apkbuilder的,在网上下的很多apkbuilder.bat在编译过程中会报错,为节省大家时间,稍后我会在附件中上传一份可以正常运行的apkbuilder。

l  步骤7:调用jarsigner进行签名。

其实到第6步我们就完成了整个APK的编译,只是现在的APK还不能用,为什么?因为Android系统不允许安装任何没有经过签名的APK。签名机制是出于安全考虑,详细原因,可参考此文章:http://blog.csdn.net/wirelessqa/article/details/7651613

那么如何生成Android的数字证书和利用证书对应用程序进行签名。

数字证书生成是采用java官方的keytool(keytool默认在JDK的安装目录下)进行的,在命令行下面执行下面命令就可以生成数字证书,然后将该数字证书bmc.keystore拷贝到需要构建的工程目录下

keytool -genkey -keystore bmc.keystore -storepass bmckey -keypass bmckey -alias bmc_cert -keyalg RSA

各参数的含义:

-genkey:表示要生成证书这一操作

-keystore:表示要生成的证书仓库(这里有点意思,java的证书是可以有很多个的,统一在证书仓库里面保存着,所以证书仓库会有一个密钥,证书参数里面的每个证书也都有自己的密钥)

-storepass:就是证书仓库对应的密钥

-alias:这个就是对应的证书的别名

-keypass:alias指定的证书对应的密钥

-keyalg:采用什么证书加密算法,这里采用RSA

下面是利用刚刚生成的证书来对apk进行签名,调用的是java的官网签名工具jarsigner进行的,对应参数含义见:

http://www.aichengxu.com/article/Java/12603_2.html

其中

l  步骤8:调用zipalign对APK进行性能优化。

这样就完成了build.xml文件的编辑。

命令行cd到工程目录下,执行ant sign或ant zipalign就可以完成android工程的自动化构建,在bin目录下分别生成对应的apk文件。

3.1.2. 多工程手动实现ant自动化编译

学会了单工程的自动化构建过程,理解起多工程的自动化构建就比较容易了,这里转载了网上一篇非常详细的关于多工程ant自动化构建的文章:http://www.cnblogs.com/qianxudetianxia/archive/2012/07/04/2573687.html

大家可以仔细阅读下,这里就不重复解析了。

3.2.    方法二:使用Android Sdk自带的构建脚本,通过参数传递构建Android Apk

使用Android Sdk自带的构建脚本,通过传人参数来构建,这种方法比较简单,因为构建过程都是Android Sdk自带的build.xml定义好了,我们只需要传人参数,就可以了。

下面我们将使用方法二“通过参数传递方式“来分别完成单工程和多工程的自动化构建。

3.2.1.  单工程通过参数传递方式实现ant自动化构建

首先,Android Sdk自带的构建脚本位于你的sdk\tools\ant目录下,以我的sdk目录为例:E:\cocos2d\adt-bundle-windows-x86-20140321\sdk\tools\ant\build.xml

           假设单工程目录为:

           

               

         那么完成AIDLServicePort单工程的自动化构建,只需通过以下两步骤即可:

l  步骤1:在AIDLServicePort目录下使用android.bat工具生成build.xml构建脚本

使用anroid adt自带的android.bat对项目工程进行更新。android.bat路径在对应sdk\tools下,如我的在E:\cocos2d\adt-bundle-windows-x86-20140321\sdk\tools下。

在cmd窗口中敲入如下命令:android.bat update project --name AIDLServicePortProj -t 1 -p E:\tng_proj\trunk\client\tvbox\BMC\Android\AIDLServicePort.

参数说明:

--name 为项目名称

-t        android编译版本

-p        项目路径

上述命令将会在项目中自动创建相应所需的build.xml,project.properties,local.property

若在更新时候出现如下问题:

Error: Target id ‘**‘ is not valid. Use ‘android.bat list targets‘ to get the target ids.

则先输入如下代码来查询目前所支持的android编译版本id。

android.bat list targets

l  步骤2:设置主工程AIDLServicePort目录下的属性文件

① build.xml -- 构建脚本,主要是导入配置,传递参数给Sdk下的build.xml文件。

② project.properties -- 当前工程使用的AndroidSdk版本定义,以及Library Project引用定义。

③ local.properties -- Android SDK Home路径的定义(默认自动生成,不需要修改)。

④ ant.properties -- 签名证书及证书认证的设置(注意:该文件要自己创建)。

几个文件的内容介绍:

build.xml - 这个实际上也是基于模版生成的,内容非常简单,就简单的几句参数加载与脚本调用,自动生成,不需要自己修改。

project.properties文件

local.properties文件

这里是Android Sdk的Home路径。

ant.properties文件 (注意:该文件需要自己手动创建)

签名证书与认证信息设置

数字证书mcc.keystore的生成是采用java官方的keytool(keytool默认在JDK的安装目录下)进行的,在命令行下面执行下面命令就可以生成数字证书:

keytool -genkey -keystore bmc.keystore -storepass bmckey -keypass bmckey -alias bmc_cert -keyalg RSA

将生成的数字证书bmc.keystore拷贝到AIDLServicePort工程目录下。

以上完成后,构建脚本就可以run起来了。

构建完成后,执行如下命令:ant clean release

构建完成后,在AIDLServicePort下生成一个bin目录,Apk构建结果存储在bin目录下,如图:

3.2.2.  多工程通过参数传递方式实现ant自动化构建

单工程的自动化构建过程在3.2.1中已经介绍过了,这里我们接着介绍带有Android Library Project的多工程的构建。

首先,Android Sdk自带的构建脚本位于你的sdk\tools\ant目录下,以我的sdk目录为例:E:\cocos2d\adt-bundle-windows-x86-20140321\sdk\tools\ant\build.xml

    假设工程目录结构为:

       

       

这里MCC为主工程,也即要生成apk的工程,library是MCC引用的library project

l  步骤1:在MCC目录下使用android.bat工具生成build.xml构建脚本

使用anroid adt自带的android.bat对项目工程进行更新。android.bat路径在对应sdk\tools下,如我的在E:\cocos2d\adt-bundle-windows-x86-20140321\sdk\tools下。

在cmd窗口中敲入如下命令:android.bat update project --name MccProj -t 1 -p E:\tng_proj\trunk\client\phone\android\MCC

参数说明:

--name    为项目名称

-t            android编译版本

-p           项目路径

上述命令将会在项目中自动创建相应所需的build.xml等。

 l  步骤2:设置主工程MCC目录下的属性文件

⑤ build.xml -- 构建脚本,主要是导入配置,传递参数给SDK下的build.xml文件。

⑥ project.properties -- 当前工程使用的AndroidSDK版本定义,以及Library Project引用定义。

⑦ local.properties -- Android SDK Home路径的定义(默认自动生成,不需要修改)。

⑧ ant.properties -- 签名证书及证书认证的设置(该文件要自己创建)。

几个文件的内容介绍:

build.xml - 这个实际上也是基于模版生成的,内容非常简单,就简单的几句参数加载与脚本调用,自动生成,不需要自己修改。

project.properties文件

注意这里指定要引用的Library的相对路径。

local.properties文件

这里是Android SDK的Home路径。

ant.properties文件

签名证书与认证信息设置

数字证书mcc.keystore的生成是采用java官方的keytool(keytool默认在JDK的安装目录下)进行的,在命令行下面执行下面命令就可以生成数字证书:

keytool -genkey -keystore mcc.keystore -storepass tencent -keypass tencent -alias tencent -keyalg RSA

将生成的数字证书mcc.keystore拷贝到MCC工程目录下。

l  步骤3:设置library工程属性文件

把MCC下的步骤2列出的4个脚本(build.xml,project.properties,local.properties,ant.properties)拷贝到Library工程目录下。

注意,要根据Library Project的实际情况去修改project.properties的内容,主要是SDK版本,以及标示当前模块是Library project,如下:

以上完成后,构建脚本就可以run起来了。

构建完成后,执行如下命令:ant clean release

构建完成后,在MCC下生成一个bin目录,构建结果存储在bin目录下,如图:

至此,Ant的两种自动化构建方法就介绍完了。

       附件是apkbuilder.bat及手动编写的完整的build.xml文件,用的时候请大家替换为本地工具的路径就可以了,通过参数传递实现ant自动化构建的文件按照文中的步骤操作即可生成,在此就不上传了。

 


Ant自动化构建Andriod项目详解