Eclipse用起来尽管方便,可是编译打包android项目还是比較慢,尤其将应用打包公布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我们自己主动编译打包了。

1  Ant自己主动编译打包android项目

1.1   Ant安装

  ant的安装比較简单。下载ant压缩包  http://ant.apache.org  (最新的为1.9.3版本号),下载之后将其解压到某个文件夹(本人解压到E:\Program Files\apache-ant-1.9.3) ,然后配置环境变量(新建ANT_HOME环境变量,值为ant所在的文件夹。然后将ANT_HOME/bin加入到path中)。如图:

  打开命令行工具,输入 ant  -version ,假设出现例如以下结果,说明ant 成功安装。

  1.2   为Android项目生成Ant配置build.xml

  打开命令行工具,切换路径到项目所在的文件夹;输入命令

  android update project --name <project_name> --target <target_ID>--path <path_to_your_project>

  http://developer.android.com/tools/projects/projects-cmdline.html

  项目根文件夹下多了build.xml。以及local.properties两个文件。

  当中local.properties写明了我们的android SDK的文件夹(事实上是环境变量ANDROID_HOME的值,所以假设环境变量中没有这个的,请添加)。

  build.xml则是ant构建的最重要脚本,打开一看,发现里面事实上大部分都是写凝视,实用的没几行,这是由于生成的这个build.xml引用了android SDK自带的构建脚本,详细文件夹是{sdk文件夹}/tools/ant/build.xml 。

  这样,项目就支持ant编译打包了。可是,有人可能会说了,我的项目有引用第三方的jar包,并且还引用了其它的android library 项目,该怎么办呢?

1.3   android使用ant打包时。加入第三方jar包

1.3.1  libs 库中的第三方jar包

  假设项目仅仅是引用了第三方jar包。仅仅要将jar包放在libs目录下就ok了,ant会在编译打包过程中会自己主动将第三方jar加进去的。可是当我们的android 项目參考了其它library项目,这时候我们最初在输入android update 命令的时候应该多一个參数 --subprojects :

  你发现报错了,不要着急。这是由于那个library 还不支持ant自己主动编译。我们须要先让它也支持。

  进入到library项目所在的文件夹,输入命令 android update lib-project -p ./  (注意是 lib-project);

  再回到原项目,输入命令” android update project --name MenudrawSample -p ./ --subprojects "。这下就OK了。

1.3.2  user library库中第三方jar包

  在Android开发中,除了通常在Eclipse中的编译方法之外,有的时候为了进行持续集成,可能还须要用ant进行自己主动化编译。Android SDK本身已经提供了默认的ant编译脚本。就在每一个project下的build.xml中,当中引用了SDK的编译脚本${sdk_dir}/tools/ant/build.xml 。

  通常情况下,在project根文件夹下直接运行 ant debug 就可以进行一次正常的build。默认的classpath会包括libs文件夹下的全部jar文件。可是假设project中使用了USER LIBRARY,或者引用了外部的jar文件,那么在编译中就可能会遇到问题,由于USER LIBRARY等这些jar文件不会被自己主动包括在classpath中,这时就要扩展ant的path变量,把自己的jar文件增加到classpath中。

  通过察看sdk提供的build.xml编译脚本,能够发现javac使用的classpath定义例如以下:

<path id="project.javac.classpath">
<path refid="project.all.jars.path"></path>
<path refid="tested.project.classpath"></path>
</path>
<javac encoding="${java.encoding}"
source="${java.source}" target="${java.target}"
debug="true" extdirs="" includeantruntime="false"
destdir="${out.classes.absolute.dir}"
bootclasspathref="project.target.class.path"
verbose="${verbose}"
classpathref="project.javac.classpath"
fork="${need.javac.fork}">
<src path="${source.absolute.dir}"></src>
<src path="${gen.absolute.dir}"></src>
<compilerarg line="${java.compilerargs}"></compilerarg>
</javac>

  当中 project.all.jars.path 包括了全部的jar文件,我们能够通过在工程文件夹下的build.xml中又一次定义这个变量来引入其它的jar文件。

  比如在我的project中。引用了ormlite这个ORM库,为了可以在开发中使用“attach source”察看源代码,该jar文件不能放在libs文件夹中,由于Eclipse不同意对libs文件夹中的jar文件“attach source”。

  因此我将此文件放到了libs/ormlite文件夹中。为了可以将这两个jar文件增加到classpath中,就要又一次定义 project.all.jars.path 这个元素。

  基本思路是。又一次定义 -pre-compile这个target,在当中又一次定义 project.all.jars.path 的值。

  这段代码写在哪里呢?在每一个项目的build.xml中引用了当前文件夹下的custom_rules.xml,那么我们就在项目根文件夹下创建一个custom_rules.xml,内容例如以下:

<?

xml version="1.0" encoding="UTF-8"?

>
<project name="custom_rules" default="release">
<target name="-pre-compile">
<echo message="JARPATH=${toString:project.all.jars.path}"></echo>
<echo message="JARPATH=${jar.libs.dir}"></echo>
<property name="ormlite.dir" value="${jar.libs.dir}/ormlite"> </property>
<path id="ormlite.lib">
<path path="${toString:project.all.jars.path}"></path>
<pathelement location="${ormlite.dir}/ormlite-android-4.41.jar"></pathelement>
<pathelement location="${ormlite.dir}/ormlite-core-4.41.jar"></pathelement>
</path>
<path id="project.all.jars.path">
<path refid="ormlite.lib"></path>
</path>
<echo message="JARPATH=${toString:project.all.jars.path}"></echo>
</target>
</project>

  http://my.oschina.net/yunfound/blog/169288

1.4   编译打包项目

  ant debug: 生成一个測试版apk,默认使用 debug key 进行签名,生成的apk(your_project_name-debug.apk)在bin文件夹下。

  ant release: 生成一个未签名和未aligned的apk包, project_name-release-unsigned.ap和project_name-release-unaligned.apk 在bin文件夹下。


2   签名与渠道包

  基于ant自己主动编译打包现有的android项目。能够在ant打包应用的时候增加签名信息以及自己主动打包渠道包。

2.1  增加签名信息

  在项目的根文件夹下建一个ant.properties文件。输入例如以下内容。当中keystorepassword和aliaspassword能够不指定(防泄漏)。那么在命令运行的过程中会要求你输入。

#keystore的路径,必须使用正斜杠
key.store= "E:/wp_android_sample/me.key"
#keystore的密码
#key.store.password=*****
#alias名
key.alias=me
#alias密码
#key.alias.password=******

  在项目根文件夹下执行 ant release 命令就会帮你生成一个经过签名和aligned的apk,生成的apk(your_project_name-release.apk)在bin文件夹下

2.2   自己主动打包渠道包

  实现批量循环打包须要一个类似于for循环的功能。在Ant的核心包里没有相关的For循环的Task,即不支持for循环,可是ant支持第三方扩展包,以支持很多其它的其它功能。

  于是我们要下载对应的支持for循环的扩展包。

能够使用开源的Ant-contrib包。

下载地址:http://ant-contrib.sourceforge.net/ 。

  下载后的解压得到的jar文件放到ant的lib文件夹。

接下来我们就能够打包渠道包了,详细做法是:

  (1) 首先在ant.properties文件里添加属性 market_channels (渠道列表,以逗号切割),version(应用程序版本号名)

#渠道市场列表
market_channels=91,360,wandoujia,baidu
#版本
version=1.2.1

  (2)  在我们项目的build.xml中增加例如以下代码:

<!-- 渠道包打包脚本  ant deploy-->
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="lib/ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef> <target name="deploy">
<foreach target="modify_manifest" list="${market_channels}" param="channel" delimiter=",">
</foreach>
</target> <target name="modify_manifest">
<replaceregexp flags="g" byline="false">
<!-- 匹配的内容是 android:value="*****" android:name="UMENG_CHANNEL" -->
<regexp pattern='android:value="(.*)" android:name="UMENG_CHANNEL"' />
<!-- 匹配之后将其替换为 android:value="渠道名" android:name="UMENG_CHANNEL" -->
<substitution expression='android:value="${channel}" android:name="UMENG_CHANNEL"' />
<!-- 正則表達式须要匹配的文件为AndroidManifest.xml -->
<fileset dir="" includes="AndroidManifest.xml" />
</replaceregexp>
<property name="out.release.file" location="${out.absolute.dir}/${ant.project.name}_${channel}.apk" />
<!--包 -->
<antcall target="release" />
<!--输出渠道包到bin/out文件夹下 -->
<copy tofile="${out.absolute.dir}/out/${ant.project.name}v${version}-${channel}.apk" file="bin/${ant.project.name}-release.apk"/>
</target>

  在项目根文件夹下运行 ant deploy 命令就会帮你各个渠道的签名包了(为了全程能够自己主动运行,ant.properties文件里的keystore的password能够指定,这样在运行过程中就不须要手动输入password了)。在bin文件夹的out文件夹下。

Ant自己主动编译打包&amp;公布 android项目的更多相关文章

  1. 用gradle编译任意结构的Android项目

    ## 需求 * 继续用`Eclipse`项目的结构,但是使用`gradle`编译,或者说任意的项目结构进行编译. ## 解决方案 1. Android studio的项目结构 1. Android S ...

  2. 基于命令行编译打包phonegap for android应用 分类: Android Phonegap 2015-05-10 10:33 73人阅读 评论(0) 收藏

    也许你习惯了使用Eclipse编译和打包Android应用.不过,对于使用html5+js开发的phonegap应用,本文建议你抛弃Eclipse,改为使用命令行模式,绝对的快速和方便. 一直以来,E ...

  3. 使用NDK编译含JNI的Android项目常见问题解决方案

    有时候,自己下载的或者拷贝过来的JNI项目出现莫名错误,通常是找不到头文件,可能解决方案如下: Removing the C nature: The only way I could find to ...

  4. Ant自动编译打包&发布 android项目

    Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其将应用打包发布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我们自动编译打包了. ...

  5. Andorid进阶7—— Ant自动编译打包&发布 android项目

    http://www.cnblogs.com/tt_mc/p/3891546.html Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其将应用打包发布到各个渠道时,用Ecl ...

  6. Ant自动编译打包android项目(转载)

      1.1   Ant安装 ant的安装比较简单,下载ant压缩包  http://ant.apache.org  (最新的为1.9.3版本),下载之后将其解压到某个目录(本人解压到E:\Progra ...

  7. (转载)Ant自动编译打包android项目

    1  Ant自动编译打包android项目 1.1   Ant安装 ant的安装比较简单,下载ant压缩包  http://ant.apache.org  (最新的为1.9.3版本),下载之后将其解压 ...

  8. Android-Ant自动编译打包android项目 -- 2 ----签名与渠道包

    上篇介绍了怎么使用ant自动编译打包现有的android项目,这篇将继续介绍如果如何在ant打包应用的时候加入签名信息以及自动打包渠道包. 1. 加入签名信息: 在项目的根目录下建一个ant.prop ...

  9. 通过ant脚本编译打包android工程

    通过ant脚本,编译打包android工程 1.Android程序编译.打包.签名.发布的三种方式:  方式一:命令行手动编译打包  方式二:使用ant自动编译打包  方式三:使用eclipse+AD ...

随机推荐

  1. How to create an IPA (Xcode 5)

    This tutorial will walk you through the easiest way to generate an IPA using Xcode 5. We will be usi ...

  2. 手动删除SVCH0ST.EXE的方法

        最近几天在办公室的计算机上又发现了一种病毒,在进程管理器中多出了两个进程:SVCH0ST.EXE.IEXPLORE.EXE,经一番查看揭开了它们的真面目,现将清除这种病毒的方法总结如下: 病毒 ...

  3. ylbtech-WelfareSystem(福利发放管理系统)-数据库设计

    ylbtech-DatabaseDesgin:ylbtech-WelfareSystem(福利发放管理系统)-数据库设计 1.A,数据库关系图(Database Diagram) 1.B,数据库设计脚 ...

  4. elasticsearch升级步骤

    ES从1.2.1升级到1.4.0 升级步骤,基本上是按照官网的叙述来完成的,链接是:http://www.elasticsearch.org/guide/en/elasticsearch/refere ...

  5. idea 去掉never used 提示

  6. 如何让mysql的自动递增的字段重新从1开始呢?(

    数据库表自动递增字段在用过一段时间后清空,还是继续从清空后的自动编号开始.如何才能让这个字段自动从1开始自动递增呢? 下面两个方法偶都试过,很好用: 1 清空所有数据,将自增去掉,存盘,在加上自增,存 ...

  7. MySQL几个性能指标

    近期参加了一个DBA MySQL的分享,主要从MySQL的性能指标分析.同步及运维三个方面分享一些经验,其中,一些经验值还是值得记录下来的: 对于一个MySQL实例,CRUD上限经验值如下: Quer ...

  8. unsigned int与int相加问题

    作者 : 卿笃军 一道unsigned int与int类型的相加题目.引发了我对这个问题的思考. 首先要明确两个问题: 问题一. unsigned int 和 int究竟哪个能表达出来的数上限大呢? ...

  9. Java注解基本介绍

    注解(Annotation),又称元数据(MetaData),提供了一种在代码中添加信息的形式化的方法,将元数据和源代码结合在一起. 1. 外部配置文件如XML存在的问题: 代码复杂度较高,需要编写很 ...

  10. msyql5.5修改配置文件开启慢查询日志

    修改/etc/my.cnf文件 在[mysqld]下面修改或添加配置(在别处不起作用) slow_query_log = on slow_query_log_file = /usr/local/mys ...