相关文章列表:

当前描述多渠道批量打包是基于第3篇文章基础之上的打包方式。

批量按渠道打包要做几件事情:
1. 存储渠道号
2. 取出渠道号
3. 遍历渠道号执行4,5操作
4. 根据取出的渠道号修改AndroidManifest.xml文件并打包

1. 存储渠道号
我选择存在新建的build.properties中,这样可以和打包的分离,当然也可以放到ant.properties, project.properties, local.properties 等文件中。

2. 取出渠道号
从properties中读取信息,xml代码如下

<?xml version="1.0" encoding="UTF-8"?>
<project name="custom_rules" > <property file="build.properties"/> <echo>${market_channels}</echo> </project>

执行ant,结果如下:

D:\ProjectDemo>ant
Buildfile: D:\ProjectDemo\build.xml
[echo] 666666,88888888 BUILD SUCCESSFUL
Total time: 0 seconds

3. 遍历渠道号执行4,5操作

ant核心库本身不支持遍历功能,所以需要引入新库ant-contrib-1.0b3.jar,需要放到ant\lib目录下,我直接放到当前项目目录下。

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

如果出现如下错误,说明没有放置jar文件

Buildfile: D:\ProjectDemo\build.xml

  [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontri

b.properties. It could not be found.

遍历foreach的小例子,结合之前1,2遍历打印出渠道号

<?xml version="1.0" encoding="UTF-8"?>
<project name="custom_rules" > <property file="build.properties"/> <!-- 支持循环执行 -->
<taskdef resource="net/sf/antcontrib/antcontrib.properties" >
<classpath>
<!-- <pathelement location="lib/ant-contrib-1.0b3.jar" /> -->
<pathelement location="./ant-contrib-1.0b3.jar" />
</classpath>
</taskdef> <echo>Run ant-contrib OK</echo> <target name="deploy">
<foreach target="edit_and_build" list="${market_channels}" param="channel" delimiter=",">
</foreach>
</target> <target name="edit_and_build">
<echo>Run '${channel}' apk</echo>
</target> </project>

结果:

D:\ProjectDemo>ant deploy
Buildfile: D:\ProjectDemo\build.xml
[echo] Run ant-contrib OK deploy:
[echo] Run ant-contrib OK edit_and_build:
[echo] Run '666666' apk
[echo] Run ant-contrib OK edit_and_build:
[echo] Run '88888888' apk BUILD SUCCESSFUL
Total time: 0 seconds

4. 根据取出的渠道号修改AndroidManifest.xml文件并打包

* 正则替换 replaceregexp 标签

http://ant.apache.org/manual/Tasks/replaceregexp.html

** 先来看一个替换的例子,把当前文件夹下的AndroidManifest.xml指定的版本号修改为9

<?xml version="1.0" encoding="UTF-8"?>
<project name="custom_rules" >
<!-- flags="g" 指定全局替换,替换所有符合规则的字段
byline="false" 确认被替换的时候是一次替换一行还是多行
pattern 属性用来指明正则表达式 -->
<replaceregexp flags="g" byline="false">
<regexp pattern="uses-sdk android:minSdkVersion="(.*)"" />
<!-- substitution expression 中是替换的值,替换的值都定义在相对应的配置文件中 -->
<substitution expression="uses-sdk android:minSdkVersion="9"" />
<!-- fileset 属性中的 dir 用来指定被替换文件所在的目录
includes 用来指定要替换哪个文件。 -->
<fileset dir="" includes="AndroidManifest.xml" />
</replaceregexp> </project>

结果:

自己查看AndroidManifest.xml指定的版本号修是否改为9

以上已经实现了批量打包的功能,现在只需要打开build.xml加载最上面:

   <property file="build.properties"/>

    <!-- 支持循环执行 -->
<taskdef resource="net/sf/antcontrib/antcontrib.properties" >
<classpath>
<!-- <pathelement location="lib/ant-contrib-1.0b3.jar" /> -->
<pathelement location="./ant-contrib-1.0b3.jar" />
</classpath>
</taskdef> <echo>Run ant-contrib OK</echo> <target name="deploy">
<foreach target="edit_and_build" list="${market_channels}" param="channel" delimiter=",">
</foreach>
</target> <target name="edit_and_build">
<echo>Run '${channel}' apk</echo>
<!-- flags="g" 指定全局替换,替换所有符合规则的字段
byline="false" 确认被替换的时候是一次替换一行还是多行
pattern 属性用来指明正则表达式 -->
<replaceregexp flags="g" byline="false">
<regexp pattern="android:value="(.*)" android:name="CHANNEL""/>
<!-- substitution expression 中是替换的值,替换的值都定义在相对应的配置文件中 -->
<substitution expression="android:value="${channel}" android:name="CHANNEL"" />
<!-- fileset 属性中的 dir 用来指定被替换文件所在的目录
includes 用来指定要替换哪个文件。 -->
<fileset dir="" includes="AndroidManifest.xml" />
</replaceregexp>
<!-- <property name="out.release.file"
location="./${channel}.apk" />
<antcall target="release" /> -->
<!-- <property
name="out.final.file"
location="D:\ProjectDemo\${channel}.apk" /> -->
<property name="out.final.file"
location="D:\ProjectDemo\${channel}.apk" />
<antcall target="clean" />
<antcall target="release" />
</target>

例子下载地址http://download.csdn.net/detail/love_world_/6257753

出处:http://blog.csdn.net/androiddevelop/article/details/11619635

Android 自动编译、打包生成apk文件 4 - 多渠道批量打包的更多相关文章

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

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

  2. Android 自动编译、打包生成apk文件 3 - 使用SDK Ant方式

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

  3. Android 自动编译、打包生成apk文件 2 - 使用原生Ant方式

    from://http://blog.csdn.net/androiddevelop/article/details/11100109 相关文章列表: <Android 自动编译.打包生成apk ...

  4. 使用ant自动编译、打包生成apk文件

    上次使用命令行生成apk文件<Android 命令行编译.打包生成apk文件>,学习命令行生成的目的是为了编写ant打下基础. 一. ant环境 下载ant包,配置环境变量 二.ant编译 ...

  5. windows下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件

    原创文章,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4535459.html android 程序打包成apk,如果在是命令行方式,一般都要经过如下步骤: 1.用a ...

  6. 在eclipse中将android工程打包生成apk文件

    1.)生成keystore 按照下面的命令行 在C:\Program Files\Java\jdk1.6.0_10\bin>目录下,输入keytool -genkey -alias androi ...

  7. 用eclipse编写Android程序时怎样生成apk文件

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/16828449 APK是Android Package的缩写,即Android安装包.通过将 ...

  8. Android 命令行编译、打包生成apk文件

    一.搭建搭建环境 1. 安装JDK 和 Android SDK   2. 配置环境变量 D:\android-sdk-windows\tools C:\Program Files\Java\jdk1. ...

  9. HBuilder 云打包生成 .apk 文件所需的安卓证书如何获取以及文件打包前必须的设置

    在 HBuilder 云打包功能中,生在 .apk 文件虽然平台提供了免费的 安卓证书,但如果有其它需求,比如想发布,那么就需要自己去申请各种类型的证书了,这里介绍几个工具,方便在线生成证书并配置到打 ...

随机推荐

  1. Linux 内核的编译系统

    Linux  的编译使用 GNU make 工具来检查整个系统的文件和调用 gcc 工具以及脚本完毕编译源码生成 image 等操作.要了解整个编译系统,我们首先要了解 Linux 内核的 Makef ...

  2. jQuery 1.9+ ajaxStart事件无效,无法被触发的原因。

    AJAX 事件需要绑定到document 在jQuery 1.9中, 全局的AJAX事件(ajaxStart, ajaxStop, ajaxSend, ajaxComplete, ajaxError, ...

  3. 运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库

    运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 运 ...

  4. hdoj 2222

    http://acm.hdu.edu.cn/showproblem.php?pid=2222 第一道 AC自动机.....trie树的建立 和 AC自动机的查询,,可作模版... 解题思路:AC的应用 ...

  5. Linux系统目录(转载)

    /         (这就是著名的根)├── bin         (你在终端运行的大多数程序,比如cp.mv...)├── boot         (内核放在这里,这个目录也经常被作为某个独立分 ...

  6. 深入浅出—JAVA(10)

    10.数字与静态 静态变量是共享的.同一类所有的实例共享一份静态变量. 实例变量:每个实例一个.静态变量:每个类一个. 数字的格式化 唯一必填的项目是类型 package xiao;class Sta ...

  7. (IOS)签名Demo

    思路是将每一次按下屏幕的touch move时的点存到一个数组里,即一个数组相当于一个笔画:再将该代表笔画的数组保存到一个大数组中,每组每次touch的移动都历遍大数组和笔画数组,将点于点之间连接起来 ...

  8. cocos2dx进阶学习之CCTMXTiledMap

    继承关系 CCTMXTiledMap -> CCNode 它由CCNode派生,我们已经知道CCNode是cocos2dx的舞台对象的公共父类,所以CCTMXTiledMap也是个舞台对象 成员 ...

  9. &lt;深入理解C指针&gt;学习笔记和总结 第四章 指针和数组

    数组是一个什么玩意: 数组和指针我的理解,有同样之处也有不同之处.因有同样之处,因此一些资料上说,数组和指针本质是同样的.因有不同之处,因此也有一些资料上说,数组和指针是不一样的. 同样之处: 数组名 ...

  10. NYoj-街区最短路径问题

    街区最短路径问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 一个街区有非常多住户,街区的街道仅仅能为东西.南北两种方向. 住户仅仅能够沿着街道行走. 各个街道之 ...