首页 > 代码库 > 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项目详解