由于我现在已经用更好的gradle了,所以关于ant我只是简单的讲一讲,如果想学gradle请到我的博客中查看

http://www.cnblogs.com/uncle2000

ant的配置请自行百度

下面有几个必要文件的配置

local.properties

sdk.dir=D:\\android\\SDK\\sdk

  

project.properties

target=android-19

  

ant.properties

//项目包名
application.package=com.ww.simpleframework
//工程名
ant.project.name=simpleframework
//不解释
classpath.location=D:\\android\\SDK\\sdk\\tools\\lib\\ant-contrib-1.0b3.jar
java.encoding=utf-8
//不解释
out.absolute.dir=c:/temp
gos.path=e:/temp
//不解释
key.store=e:/m.keystore
key.store.password=simple
//不解释
key.alias=android.keystore
key.alias.password=simple
//可有可无
app_version=1.0
//这个是要替换变量的值 待会在build.xml中会讲到
market_channels=100,1006001,1006002,1006003

上面基本是标配,只需要把我的所有文件的变量值换成你们自己的就可以了

下面是build.xml 最核心的代码

我先把build.xml分开讲,然后把build.xml打包上传,以后我上传一律要1分,要不然没人给我评论我了个去!

//标配
<?xml version="1.0" encoding="UTF-8"?>
//${ant.project.name}是一个变量 在ant.project文件中
<project name="${ant.project.name}" default="deploy">
//project域
//之前介绍的文件们
<property file="local.properties" />
<property file="ant.properties" />
<loadproperties srcFile="project.properties" />
<fail message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var" unless="sdk.dir" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${classpath.location}"/>
</classpath>
</taskdef>
<import file="${sdk.dir}/tools/ant/build.xml" />
//////
/**方法体 下面单独拿出来讲**/
//////
</project>

上面代码中有个default="deploy" 这个是默认执行deploy方法 方法在方法体中

<target name="deploy" >
//foreach是循环执行,这句话的意思是
//ant.properties文件中的market_channels变量是个长字符串,当每遍历一个字符时遇到”,“则分出来一节字符串到list中,list的长度+1,且每次执行一次modify_manifest方法 传递一个参数channel
<foreach delimiter="," list="${market_channels}" param="channel" target="modify_manifest" />
</target>

下面就是modify_manifest方法  切记 "AndroidManifest.xml"文件中的带有CHANNEL_CODE那行只能占一行!!!

 <target name="modify_manifest" >
//replaceregexp是替换
<replaceregexp byline="false" flags="g" >
//下面两句的意思就是 把"AndroidManifest.xml"文件中只要带有”CHANNEL_CODE“的那行中的”CHANNEL_CODE“替换成传过来的参数”channel“
<regexp pattern="android:name=&quot;CHANNEL_CODE&quot; android:value=&quot;(.*)&quot;" />
<substitution expression="android:name=&quot;CHANNEL_CODE&quot; android:value=&quot;${channel}&quot;" />
<fileset dir="" includes="AndroidManifest.xml" />
</replaceregexp>
//ant内部方法”release“就是打包
<antcall target="release" />
///////
/*switch case方法 下面讲*/
///////
</target>

下面是switch case 方法体  切记这个方法要下载一个包放到ant中来支持 否则你的ant打包不能用switch-case  这个包自行百度,但是包的包含是在上面的方法中的

关于 switch-case 我只少举几个例子 毕竟我这有40多个渠道 = =

//记得前面传来的 变量     channel么?就是ant.properties文件中的market_channels
<switch value="${channel}">
//当channel等于100
<case value="100" >
//执行setname方法 后面讲这个方法的作用
<antcall target="setname" >
//传递参数 和变量
<param
name="chouse"
value="xx1渠道" >
//再传递一个参数和变量
</param>
<param name="filepath" value="${channel}"/>
</antcall>
</case> <case value="1006001" > <antcall target="setname" > <param
name="chouse"
value="xx2空间" >
</param>
<param name="filepath" value="${channel}"/>
</antcall>
</case> <case value="1006002" > <antcall target="setname" > <param
name="chouse"
value="360市场" >
</param>
<param name="filepath" value="${channel}"/>
</antcall>
</case> <default>

<echo message="Please check the value of the switch.value, it can not match to anything." />
</default>
</switch>

</target>

然后就是每个case执行的 setname方法

 <target name="setname" >
//接到传来的两个参数 由于我们项目经理的特殊要求,第一个参数的目的是在"${gos.path}/下生成一个名字为传过来的渠道名的xxx.apk的文件,第二个参数的目的是在${gos.path}/下创建名字为传过来的变量filepath为名的文件夹,下面生成hh.apk的文件
<property name="chouse" value="default"/>
<property name="filepath" value="default"/>
<copy tofile="${gos.path}/${filepath}/hh.apk" >
<fileset
dir="${out.absolute.dir}/"
includes="${ant.project.name}-release.apk" />
</copy>
<copy tofile="${gos.path}/${chouse}.apk" >
<fileset
dir="${out.absolute.dir}/"
includes="{ant.project.name}-release.apk" />
</copy>
//删除中间文件
<delete includeEmptyDirs="true" >
<fileset
dir="${out.absolute.dir}"
includes="**/*" />
</delete>
//输出 循环结束
<echo message="===========================" />
</target>

好的我来总结一下上面的代码干了些什么

执行默认方法”deploy“---》循环做deploy中的动作(执行modify_manifest方法且传递参数)---》替换渠道号且打包且执行switch-case(负责放制生成文件到指定位置)传递渠道号参数---》根据渠道号参数传递不同的渠道中文名且再次传递渠道号参数---》每循环一次生成2个apk按规律放到不同的文件夹下且删除中间文件---》执行下一次循环或者结束

下载地址:

http://download.csdn.net/detail/w52155242/8459607

以前我都是0分可下,但是没人给我评论,没人评论我如何成长?以后我都要1分!

Ant多渠道批量打包的更多相关文章

  1. android ant 多渠道批量打包

    注:本文转载于:http://blog.csdn.net/zz7zz7zz/article/details/8915701 前言: 利用ant 可实现多渠道,批量打包. 正文: 思想:通过循环更改An ...

  2. 最新的Android Sdk 使用Ant多渠道批量打包

    实例工程.所需的文件都在最后的附件中.    今天花费了几个小时,参考网上的资料,期间遇到了好几个问题, 终于实现了使用Ant批量多渠道打包,现在,梳理一下思路,总结使用Ant批量多渠道打包的方法:1 ...

  3. Android 自动编译、打包生成apk文件 4 - 多渠道批量打包

    相关文章列表: < Android 自动编译.打包生成apk文件 1 - 命令行方式> < Android 自动编译.打包生成apk文件 2 - 使用原生Ant方式 > < ...

  4. 整理的Unity导出安卓工程利用ANT进行多渠道批量打包APK

    Unity导出的安卓工程利用ant进行多渠道循环批量打包 一:设置JAVA环境变量 做android开发的配置这个是基础. win7 下配置java环境变量,下面是链接 http://www.cnbl ...

  5. Android几种常见的多渠道(批量)打包方式介绍

    多渠道打包,主要是为了统计不同的渠道上包的下载数量,渠道越多,我们需要打的包数量越多,这个时候,我们没法去使用单纯的手动打包去一个一个的生成不同的渠道包,我们需要更高效的打包方式. 声明渠道方式一: ...

  6. Android中利用ant进行多渠道循环批量打包

    公司负责Android开发的小伙伴学习能力稍微偏弱,交代给他的自动化打包的任务,弄了好久依然没有成效.无奈只好亲自出手. 没有想到过程很顺利,我完全按照如下文章的步骤进行: 主要参考: Android ...

  7. Android批量打包提速 - 1分钟900个市场不是梦

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/4152323.html 黎明前的黑暗 使用Ant或者Gradl ...

  8. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件

    原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html  之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...

  9. Ant自动化打多渠道包,Android批量打包提速

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

随机推荐

  1. centos7重启网卡

    systemctl restart network

  2. 自动实时监控Windows2003服务器终端登录

    朋友一台Windows服务器被黑了,而且还被人恶意删除了一些数据备份,帮其做了下安全加固,考虑到服务器都是通过Windows 终端服务器来管理的,就想办法对其登录做个监控,找了个命令行下发邮件的小工具 ...

  3. rpc简介、原理、实例

    简介 RPC(Remote Procedure Call,远程过程调用)是建立在Socket之上的,出于一种类比的愿望,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序,就像LPC(本地过 ...

  4. [流水账]搜索与web-container版本匹配的jar包

    刚才发现自己的servlet-api.jar里面的javax.servlet.jsp为空的,但是我又需要做一些JSP tag-lib的编程,所以没办法,只好去下一个新的包 上网找了找,我用的tomca ...

  5. sqlserver 对多条数据分组

    在开发中,经常会遇到要吧一行行数据按照某一行进行分组 USE [OA] GO /****** Object: StoredProcedure [dbo].[usp_report_GatherDataM ...

  6. js中特殊转换字符为html标签

    function htmlEncode(text){ return text.replace(/&/g,'&amp').replace(/\"/g,'&quot'). ...

  7. python 调用函数 / 类型转换 / 切片/ 迭代

    调用函数 / 类型转换 /  切片/ 迭代 1. 调用函数:abs(),max(),min() 2. 数据类型转换:int(),float(),str(),tool(),a=abs, 3. 定义函数, ...

  8. 章鱼哥出品—VB.NET DataGridView绑定数据源 &quot;与货币管理器的位置关联的行不能设置为不可见&quot; 问题的解决

    DtaGridView绑定数据源后.假设想让数据条件显示的话,直接使用  My_Row.Visible = False就会出错.错误类型是 "与货币管理器的位置关联的行不能设置为不可见&qu ...

  9. Entity Framework4.3安装以及错误(基础连接已经关闭:未能为SSL/TLS……)问题解决!

    Entity Framework以下简称EF 安装EF4.3的步骤是首先安装VS扩展 NuGet,然后再使用NuGet安装EF程序包 安装完NuGet就可以安装EF了,有两种方式可以安装EF: 1.使 ...

  10. 【JS】通过JS实现超市小票打印功能——ActiveX控件

    应客户的需求= = ,要在网页端实现打印小票的功能 先来一张打印出的小票效果图(合计明显不对,因为有修改订单功能,请各位忽略) 用什么方法实现呢: 我想应该是有三种吧 1.用第三方的浏览器控件(这个好 ...