在Android开发中使用Ant 三:批量打包
批量打包最常用到的地方是进行产品推广时,为每个渠道打一个包。上一篇随笔中,介绍了怎样进行一次完整的打包,批量打包只要在此基础上做一次循环即可。
在打包之前要做两个准备工作,一个是读取渠道,一个是修改存储渠道的文件。
在工程的assets中新建一个channel.cfg文件,专门用了保存渠道,保存方式是 channel=渠道号。
ant的基本库中没有提够循环,需要引入另一个库ant-contrib-1.0b3.jar,以下通过一个例子来了解ant的循环
<?xml version="1.0" encoding="UTF-8"?>
<project name="TestAnt" default="deploy">
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${ant.home}/exlib/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<target name="deploy">
<foreach list="aaa,bbb,ccc,ddd,eee" target="package" param="channel" delimiter=",">
</foreach>
</target>
<target name="package">
<echo>${channel}</echo>
</target>
</project>
输出结果:

在这个例子中aaa,bbb,ccc,ddd,eee以“,”为分隔符,依次取内容赋值给channel,做了五次循环。在target package中,用${channel}就可以取到渠道。
取到渠道后,通过正则表达式替换channel.cfg的内容
<target name="change.channel">
<replaceregexp flags="s" byline="true">
<regexp pattern="channel=(.*)" />
<substitution expression="channel=${channel}" />
<fileset dir="assets" includes="channel.cfg" />
</replaceregexp>
</target>
flags="s"表示文件是单行,byline="true"表示逐行查找,<regexp pattern="channel=(.*)" />指定匹配的正则表达式,<substitution expression="channel=${channel}" />为替换后的内容,<fileset dir="assets" includes="channel.cfg" />指定文件。
我们在工程的根目录新建一个channels.properties的文件,输入channels=aaa,bbb,ccc,ddd,eee完整的批量打包代码为:
<?xml version="1.0" encoding="UTF-8"?>
<project name="TestJni" default="package">
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${ant.home}/exlib/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<!-- 设置sdk,ndk路径,证书路径密码 -->
<loadproperties srcFile="local.properties" />
<loadproperties srcFile="project.properties" />
<!-- 所有的渠道 -->
<loadproperties srcFile="channels.properties" />
<fail message="sdk.dir is missing." unless="sdk.dir" />
<fail message="ndk.dir is missing." unless="sdk.dir" />
<!-- 编译native代码 -->
<target name="native" unless="native.libraries.are.uptodate">
<echo message="Building native libraries..." />
<exec executable="${ndk.dir}/ndk-build.cmd" failonerror="true" />
<echo message="DONE (Building native libraries)" />
</target>
<!-- 引入sdk中的build.xml -->
<import file="${sdk.dir}/tools/ant/build.xml" />
<!-- 修改保存渠道的文件 -->
<target name="change.channel">
<replaceregexp flags="s" byline="true">
<regexp pattern="channel=(.*)" />
<substitution expression="channel=${channel}" />
<fileset dir="assets" includes="channel.cfg" />
</replaceregexp>
</target>
<!-- 进行一次完整的打包 -->
<target name="package" depends="change.channel,native,release">
<!-- 将apk复制的制定的目录 -->
<copy tofile="sign/${ant.project.name}-${channel}.apk" file="bin/${ant.project.name}-release.apk" />
</target>
<!-- 执行批量打包 -->
<target name="deploy">
<foreach list="${channels}" target="package" param="channel" delimiter=",">
</foreach>
</target>
</project>
打开cmd,切换到工程根目录,执行ant deploy,批量打包完成后在制定目录生成了apk

安装apk到手机或模拟器进行测试

在程序内部已经读到渠道。
至此,只能够进行简单的批量打包任务,所用到的也是简单的ant命令,上面的的批量打包代码也有待改进,希望通过以后的学习,能加快打包的速度,实现更复杂的功能。
在Android开发中使用Ant 三:批量打包的更多相关文章
- 在Android开发中使用Ant 一:环境的搭建及入门
配置Ant环境 下载Ant:http://ant.apache.org/bindownload.cgi 在windows上应该选择zip压缩包,将zip压缩包解压到一个目录. 打开系统环境变量,在系统 ...
- 在Android开发中使用Ant 二:进行一次完整的打包
一次完整的Android打包要进行以下的几步:编译.代码混淆.打包apk.签名apk.apk优化. 为了能包涵使用NDK的情况,在这里使用一个有native代码的工程TestJni. 在工程根目录下新 ...
- Android 开发中三种多线程
在开发工程中线程可以帮助我们提高运行速度,Android开发中我知道的线程有四个一个是老生长谈的Thread,第二个是asyncTask,第三个:TimetTask,第四个是Looper,四个多线程各 ...
- Android 开发中,as或者idea对gradle的使用
原文:Android 开发中,as或者idea对gradle的使用 本文属于转载收藏,侵删,出处:私人博客 ---------------------------------------------- ...
- Android开发中的输入合法性检验
Why ? 合法性检查对于程序的健壮性具有重要作用.在Android开发中,良好的合法性检查设计机制可以使程序更加清晰,产生bug更少,交互更加友好. What ? 合法性检查的目的在于确定边界.对于 ...
- Android开发中的问题及相应解决(持续更新)
最近博客写的少了,以后还得经常更新才行. ------------------------------------------------------------ 1.特定业务需求下try cath ...
- Android开发中,那些让您觉得相见恨晚的方法、类或接口
Android开发中,那些让你觉得相见恨晚的方法.类或接口本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常 ...
- 如何在Android开发中让你的代码更有效率
最近看了Google IO 2012年的一个视频,名字叫做Doing More With Less: Being a Good Android Citizen,主要是讲如何用少少的几句代码来改善And ...
- Android开发中常见的设计模式
对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的 ...
随机推荐
- Log4Net 手册
首先感慨下,现在的程序员做的工作因为高级语言的生产力,系统框架模式的成熟,开源大牛的贡献,已经成越来越偏向 “面向配置编程”了...... 详细使用指南见文章:http://blog.csdn.net ...
- codeforces B. Design Tutorial: Learn from Life
题意:有一个电梯,每一个人都想乘电梯到达自己想要到达的楼层!从a层到b层的时间是|a-b|, 乘客上下电梯的时间忽略不计!问最少需要多少的时间.... 这是一道神题啊,自己的思路不知不觉的就按 ...
- UML系列05之 基本流程图
概要 软件的基本流程图是我们在学习编程时的必修课,它很简单,却很实用.需要说明的是,UML并不包括软件的基本流程图,但是为了方便我自己查阅,所以将基本软件流程图归纳到UML系列当中.读者切不要认为基本 ...
- [转载]SharePoint 2013搜索学习笔记之搜索构架简单概述
Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...
- Centos7 禁止firewalld并使用iptables 作默认防火墙
一.停止并禁用firewalld [root@test ~]# systemctl stop firewalld [root@test ~]# systemctl disable firewalld ...
- Win10 + VS2015 下编译 Qt5.6.0
近期由于另外一个项目需要用 vs2015 ,于是把 Qt 也升级到了 5.6.0 .由于项目需要兼容 Windows xp ,所以需要自己编译 Qt .这里大致整理一下编译的过程. 安装 Active ...
- Angular系列----AngularJS入门教程04:迭代器过滤(转载)
我们在上一步做了很多基础性的训练,所以现在我们可以来做一些简单的事情喽.我们要加入全文检索功能(没错,这个真的非常简单!).同时,我们也会写一个端到端测试,因为一个好的端到端测试可以帮上很大忙.它监视 ...
- 在windows下配置Eclipse + go环境
http://blog.csdn.net/hengyunabc/article/details/7371446 本文章地址:http://blog.csdn.net/hengyunabc/articl ...
- python输出excel能够识别的utf-8格式csv文件
http://blog.csdn.net/azhao_dn/article/details/16989777 可能大家都遇到过,python在输出的csv文件中如果有utf-8格式的中文,那么在使用e ...
- HTML页面导航栏页脚不动,变换中间部分
代码段一: <script> $(document).ready(function() { $("#teachingObjectives").click(functio ...