ant 实现批量打包android应用

          很多的应用中需要加上应用推广的统计,如果一个一个的去生成不同渠道包的应用,效率低不说,还有可能不小心弄错了分发渠道,使用ant可以批量生成应用。

一、添加渠道包信息

       为了统计渠道信息,就不得不在程序的某个地方加入渠道的信息,然后针对不同的渠道打不同的包。一般可以在Manifest文件中加入渠道编号,而不直接写在代码中。这样做的好处是,可以针对不同渠道,自动化去修改Manifest文件中的渠道编号,然后自动为该渠道打包。

Manifest文件支持Meta Data标签,建议使用这种自定义标签。例如下面的文件片段。

 

 

 <meta-data android:value="000000" android:name="CHANNEL"/>

 

 

二、渠道包读取

public static String getChanel(Context ctx){String CHANNELID="000000";try {ApplicationInfo  ai = ctx.getPackageManager().getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA);Object value = ai.metaData.get("");if (value != null) {CHANNELID= value.toString();}} catch (Exception e) {//}return CHANNELID;}


 

三、自动打包实现

         Ant编译android程序        简单介绍了使用ant命令打包android程序,实现批量打包需要的加一个类似于for循环的功能即可,在Ant的核心包里没有相关的For循环的Task,要下载相应的扩展包。可以使用开源的Ant-contrib包。下载地址:http://ant-contrib.sourceforge.net/  。下载后的解压得到的jar文件放到ant的lib目录。

        在build.xml中增加如下代码就可以实现批量打包:

 

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"><regexp pattern="android:value="(.*)" android:name="CHANNEL"" /><substitution expression="android:value="${channel}" android:name="CHANNEL"" /><fileset dir="" includes="AndroidManifest.xml" /></replaceregexp><property name="out.release.file"location="${out.absolute.dir}/${ant.project.name}_${channel}_${app_version}.apk" /><antcall target="release" />
</target>

taskdef 声明需要放到较前位置,因为if condition也会用到此声明。

build.properties文件增加:

taskdef 声明需要放到较前位置,因为if condition也会用到此声明。

build.properties文件增加:

 

  market_channels=000000,012345 app_version=1.2.1

market名称用逗号分隔

执行ant deploy即可。

 

 /**
* @author 张兴业
* 邮箱:xy-zhang#163.com
* android开发进阶群:278401545
*
*/

 http://www.cnitblog.com/zouzheng/archive/2011/01/12/72638.html

转载于:https://www.cnblogs.com/xyzlmn/archive/2012/03/19/3168121.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Element Plus 正式版发布啦!

大家好&#xff0c;我是若川。祝大家新年快乐&#xff0c;开工大吉。公众号回复「红包」可以领取源码共读红包封面。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时…

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书&#xff0c;就应该有所收获&#xff0c;有所总结&#xff0c;最近把《大型网站技术架构》一书给看完了&#xff0c;给人的印象实在深刻&#xff0c;再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…

永不示弱_永不过时的网页设计:今天和2000年的在线投资组合

永不示弱重点 (Top highlight)Philippe Starck, a renowned industrial designer, once said:著名的工业设计师Philippe Starck曾经说过&#xff1a; “A designer has a duty to create timeless design. To be timeless you have to think really far into the future, not …

如何使用 React 创建一个作品集网站

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。今天&#xff0c;你…

博弈论入门 HDU 1850

Problem Description 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧陪妈妈逛一次菜场悄悄给爸爸买个小礼物主动地 强烈地 要求洗一次碗某一天早起 给爸妈用心地做回早餐如果愿意 你还可以和爸妈说咱们玩个小游戏吧 ACM课上学的呢&#xff5e;下…

新的一年,如何高效学习前端前沿知识~

今天强烈推荐一些互联网行业内优质技术公众号&#xff0c;互联网人大部分都关注了&#xff0c;包括目前主流的公司技术团队号&#xff0c;技术社区号&#xff0c;个人技术号&#xff0c;这些号行业深耕已久&#xff0c;会给你带来事半功倍的效果。公众号那么多&#xff0c;文章…

RabbitMQ学习总结(7)——Spring整合RabbitMQ实例

2019独角兽企业重金招聘Python工程师标准>>> 1.RabbitMQ简介 RabbitMQ是流行的开源消息队列系统&#xff0c;用erlang语言开发。RabbitMQ是AMQP&#xff08;高级消息队列协议&#xff09;的标准实现。 官网&#xff1a;http://www.rabbitmq.com/ 2.Spring集成Rabbi…

UIScrollView实现不全屏分页的小技巧

浏览一系列图片时&#xff0c;我们会经常使用UIScrollView来进行实现&#xff0c;因为其自带的pagingEnabled属性&#xff0c;可以非常方便的自动支持手势左右轻扫切换切换页面。pagingEnabled不过最近做的一个产品&#xff0c;设计的效果有所不同&#xff0c;希望每一页图片的…

谈谈对java中分层的理解_让我们谈谈网页设计中的卡片设计

谈谈对java中分层的理解“I want a card”, this is the first demand point that the customer said in the last issue when talking to me about demand. There is no doubt that the card type is excellent for both PC and mobile phones. From online shopping malls to…

1-jdk的安装与配置

1- Jvm、jdk、jre之间的关系 JVM&#xff1a;Java虚拟机&#xff0c;保证java程序跨平台。&#xff08;Java Virtual Machine&#xff09;JRE&#xff1a; Java运行环境&#xff0c;包含JVM和核心类库。如果只是想运行java程序&#xff0c;只要安装JRE即可。&#xff08;Java R…

来自未来,2022 年的前端人都在做什么?

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。来自上帝视角的总览…

模拟

状态压缩 uva 12368 - Candles 2011 - Dhaka 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<string> 5 #include<algorithm> 6 #include<math.h> 7 #include<map> 8 #include<queue> 9 using…

qt ui指针和本类对象_您需要了解的有关UI设计的形状和对象的所有信息

qt ui指针和本类对象重点 (Top highlight)第1部分 (Part 1) So you’re thinking about becoming a UX/UI designer, but are afraid to start? Don’t worry. It’s easier than you think. You only need a solid foundation and a lot of dedication. I can’t help you wi…

移动端h5页面复制粘贴(兼容到ios9安卓4.0.0)

项目使用jquery框架纯h5复制粘贴解决了iscroll4阻止所有默认事件&#xff0c;长按无法弹出复制菜单项目需要写一个上拉加载页面&#xff0c;页面中的物流信息需要可复制粘贴&#xff0c;同时需要兼容到ios9和安卓4.0.0, 经过大量搜索&#xff0c;最终使用clipboard。代码如下 &…

2021 大前端技术回顾及未来展望

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列2021 …

最近想读的书想做的事

越来越多了&#xff0c;但是总是还没开始&#xff0c;一天拿出一小时&#xff0c;周末拿出一上午。加油加油 2012/3/27 C标准库 C专家编程Expert C Programming Deep C Secrets CodeCraft编程匠艺&#xff1a;编写卓越的代码 代码之美 重看 编程珠玑 编程卓越之道 卷1 卷2 代码…

skysat重访周期_重访小恶梦

skysat重访周期You awaken with a start, the nightmare still fogging your mind with terror. Rain falls through cracks in the ceiling above you. The room is sparse, metallic, desolate. Searching the pockets of your yellow raincoat, you find only a cigarette l…

Python这些位运算的妙用,绝对让你大开眼界

位运算的性能大家想必是清楚的&#xff0c;效率绝对高。相信爱好源码的同学&#xff0c;在学习阅读源码的过程中会发现不少源码使用了位运算。但是为啥在实际编程过程中应用少呢&#xff1f;想必最大的原因&#xff0c;是较为难懂。不过&#xff0c;在面试的过程中&#xff0c;…

记一次 Vue2 迁移 Vue3 的实践总结

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列一、V…

改错3-38

#include<iostream.h>class time{private:int hour,minute,second;public:void settime(int h,int m,int s) { hour(h>0&&h<24)?h:0; minute(m>0&&m<60)?m:0; second(s>0&&s<60)?s:0; }void sh…