批量打包最常用到的地方是进行产品推广时,为每个渠道打一个包。上一篇随笔中,介绍了怎样进行一次完整的打包,批量打包只要在此基础上做一次循环即可。

在打包之前要做两个准备工作,一个是读取渠道,一个是修改存储渠道的文件。

在工程的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 三:批量打包的更多相关文章

  1. 在Android开发中使用Ant 一:环境的搭建及入门

    配置Ant环境 下载Ant:http://ant.apache.org/bindownload.cgi 在windows上应该选择zip压缩包,将zip压缩包解压到一个目录. 打开系统环境变量,在系统 ...

  2. 在Android开发中使用Ant 二:进行一次完整的打包

    一次完整的Android打包要进行以下的几步:编译.代码混淆.打包apk.签名apk.apk优化. 为了能包涵使用NDK的情况,在这里使用一个有native代码的工程TestJni. 在工程根目录下新 ...

  3. Android 开发中三种多线程

    在开发工程中线程可以帮助我们提高运行速度,Android开发中我知道的线程有四个一个是老生长谈的Thread,第二个是asyncTask,第三个:TimetTask,第四个是Looper,四个多线程各 ...

  4. Android 开发中,as或者idea对gradle的使用

    原文:Android 开发中,as或者idea对gradle的使用 本文属于转载收藏,侵删,出处:私人博客 ---------------------------------------------- ...

  5. Android开发中的输入合法性检验

    Why ? 合法性检查对于程序的健壮性具有重要作用.在Android开发中,良好的合法性检查设计机制可以使程序更加清晰,产生bug更少,交互更加友好. What ? 合法性检查的目的在于确定边界.对于 ...

  6. Android开发中的问题及相应解决(持续更新)

    最近博客写的少了,以后还得经常更新才行. ------------------------------------------------------------ 1.特定业务需求下try cath ...

  7. Android开发中,那些让您觉得相见恨晚的方法、类或接口

    Android开发中,那些让你觉得相见恨晚的方法.类或接口本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常 ...

  8. 如何在Android开发中让你的代码更有效率

    最近看了Google IO 2012年的一个视频,名字叫做Doing More With Less: Being a Good Android Citizen,主要是讲如何用少少的几句代码来改善And ...

  9. Android开发中常见的设计模式

    对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的 ...

随机推荐

  1. MyBatis知多少(19)MyBatis操作

    若要使用iBATIS执行的任何CRUD(创建,写入,更新和删除)操作,需要创建一个的POJO(普通Java对象)类对应的表.本课程介绍的对象,将“模式”的数据库表中的行. POJO类必须实现所有执行所 ...

  2. 哇塞,原来自己写 Google Chrome 浏览器扩展(插件)这么容易!

    1. 首先新建一个记事本,命名为 manifest.json,这是写 Google Chrome 浏览器扩展必须的文件 { "manifest_version": 2, " ...

  3. Java序列化中的serialVersionUID有什么用?

    如果一个实现了Serializable的类没有serialVersionUID属性,IDE(比如Eclipse)通常会报这样一个warning: The serializable class Foo ...

  4. Android OpenGL 基础入门

    Android 自从2.2 版本之后之后开始支持OpenGL,在没有支持OpenGL 的 GPU的情况下,也可以使用(通过软件来模拟).在Android上使用Opengl操作的对象是GLSurface ...

  5. IE下点击scrollbar会导致焦点移动到body

    现象 IE这货果然与众不同,当光标焦点在input时,点击同页面内其他区域的scrollbar,会导致焦点移动到body,从而触发绑定在input上的blur事件,如果input中的值与之前不同,甚至 ...

  6. angularJs自定义服务

    在AngularJS中,系统内置的服务都是以$开头,所以我们的自定义服务尽量避免以$开头.自定义服务的方式有如下几种: 使用Module的provider方法 使用Module的factory方法 使 ...

  7. ASP.NET Core学习零散记录

    赶着潮流听着歌,学着.net玩着Core 竹子学Core,目前主要看老A(http://www.cnblogs.com/artech/)和tom大叔的博客(http://www.cnblogs.com ...

  8. SCRUM:第一天任务实现情况

    我认领了我们团队“广商百货”应用平台的密码提示功能,任务暂时还在进行中.虽然建立了数据库,但是数据库里要存放什么数据,我们的小组还在讨论中.因为android的知识还在自学过程中,所以做起来比较慢,也 ...

  9. 常用vs快捷键

    Ctrl+E,D ----格式化全部代码 Ctrl+A+K+FCtrl+E,F ----格式化选中的代码 Ctrl+K+FCTRL + SHIFT + B生成解决方案 Alt+B+B 或 F6 生成当 ...

  10. 使用Windows PE的U盘安装win7

    前年刚去公司的时候用PE装过好多系统,最近又装一台华硕的,碰到了一个问题,一起记录了下. 华硕X45,Bios已经改为U盘启动了,但就是进不去,因为知道可能还有个选磁盘启动项的键,找了半天原来按Esc ...