文档章节

Android使用Ant多渠道打包

军歌
 军歌
发布于 2014/02/18 11:44
字数 1119
阅读 304
收藏 2


最近项目中需要添加应用渠道,我使用的是友盟统计,对于不同渠道需要编译不同版本,对于开发者说编译一次,手动操作还是可以接受的,但是项目发布版本频率较高,而且渠道很多,这就是一个体力活,而且手动打包还比较容易出错,所以就想到了用脚本打包。

利用脚本打包的原理就是把项目中的配置文件给覆盖,然后再次编译的时候,就是你要的apk了。

对于eclipse中项目,可以使用ant来编译,android的sdk中自带一个ant的build.xml文件,所以直接使用就可以了,在使用之前需要配置一下。

首先定义一个ant的配置文件,放在eclipse的项目目录中。


ant.properites

out.path=./build/out
out.absolute.dir=./build/compile
out.config.path=./build_config

# sdk的目录,注意是“/”不是“\”
sdk.dir=E:/tool/android-sdk_r22.2.1-windows/android-sdk-windows

# 项目的package
application.package=com.example.test
# 项目名称
ant.project.name=test
java.encoding=utf-8

# 签名的信息
key.store=***
key.store.password=***
key.alias=***
key.alias.password=***

# 应用的版本,和渠道
app_version=1.0
channel=wandoujia

build.xml


<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="deploy">

	<property file="ant.properties" />
	<loadproperties srcFile="project.properties" />

	<import file="${sdk.dir}/tools/ant/build.xml" />
	<tstamp prefix="time">
		<format property="time" pattern="yyyyMMddHHmmss" />
	</tstamp>
	<target name="deploy">

		<antcall target="release" />

		<copy tofile="${out.path}/${ant.project.name}_${channel}_${time.time}.apk">
			<fileset dir="${out.absolute.dir}/" includes="${ant.project.name}-release.apk" />
		</copy>

		<delete includeEmptyDirs="true">
			<fileset dir="${out.absolute.dir}" includes="**/*" />
		</delete>
	</target>
</project>



上面的xml定义大概意思就是,找到sdk中{sdk}/tools/ant/build.xml文件,然后编译,最后签名,然后拷贝到目标目录下面,同时重命名apk,apk还有编译时候的时间戳。

只要运行deploy的任务就可以完成编译。
上面的配置文件中的渠道只有豌豆荚一个,那么怎么使用多个渠道呢?开发人员很容易就想到了,我们可以顶一个渠道数组,然后遍历数组,分别编译打包。虽然耗时比较长但是不容易出错,相对于手动编译还是比较好的。

在实际项目中我问了下年长的同事,说ant中可以使用for循环不,但是需要添加额外的jar包(ant-contrib-1.0b3.jar)来支持,我就觉的比较麻烦,然后自己就写了一个python的脚步来自动替换ant的配置文件,这样我又多了几个文件。如果想了解ant的for标签使用可以百度一下,这里不多做介绍。其实我也不懂,偷笑

python_build.cfg



#market_channels
default
hiapk
baidu
360
tencent
nduo
91
wandoujia



上面配置文件里面是我要打包的渠道,每行一个渠道,#表示注释。

下面是python的脚步build.py。

configname = "python_build.cfg";
antconfigname = "ant.properties";
channels = [];

def loadChannels():
    global channels;
    configfile = file(configname);
    while True:
        line = configfile.readline();
        if len(line) == 0:
            break;
        line = line.strip();
        if line.startswith('#'):
            pass;
        else:
            channels.append(line);
        
    configfile.close();


def replaceChannel(channel):
    input = open(antconfigname);
    lines = input.readlines();
    input.close();
    
    output = open(antconfigname,"w");
    for line in lines:
        if not line:
            break;
        if line.startswith('channel='):
            temp = 'channel='+channel;
            output.write(temp);
        else:
            output.write(line);
            
    output.close();
        
#==============main begin =========================
import os;

loadChannels();

for channel in channels:
    replaceChannel(channel);
    os.system("ant");
    print ('channel '+channel+' is build success......');



python是一个比较流行的脚步,入手还是比较简单的,我也只是周末的时候,看了几个小时,敲了几次代码就写了上面的脚本,当然可能还有不足的地方,希望有大神看到不要喷我,我这边使用的是python2.7,使用前需要安装python才行。

上面分别定义了2个函数,=======下面的就是开始运行脚本,python里面是没有main的概念,同时还不支持{},百度来的,好像是发明这个脚本的人,希望强制使用缩进来控制代码块,对一个习惯了用ide来写代码的的人还是比较痛苦滴,抓狂。不过我再网上找到了一个比较好的python的ide,叫UliPad。有兴趣的童鞋可以去使用下。

首先是替换渠道名称,当首先需要读取配置文件,使用的是python中文件模块,每次读取一行,如果开始时“#”则认为是注释,不使用,否则加入到一个数组里面,最后遍历数组,每次执行的时候,都替换ant里面的channel一行,然后调用cmd命了,来执行ant。最后完成了渠道打包的功能。


使用cmd,进入到eclipse的项目目录下面,执行python build.py就可以了。


小弟也是开发android不久,写的很啰嗦,望各位看官见谅。



下面是一些截图。





本文转载自:

共有 人打赏支持
军歌
粉丝 9
博文 86
码字总数 43501
作品 0
深圳
程序员
私信 提问
基于Jenkins + Tomcat 的安卓客户端可持续化构建及发布下载(loltube.cn)

一. Jenkins 可持续化构建环境请参考 文章 http://my.oschina.net/long0419/blog/183299 二. 基于搭好可持续构建环境完成基础上 ,使用Ant 来编写安卓持续化构建环境 (未使用gradle 原理一样...

long0419
2015/04/02
0
0
Android ANT多渠道打包

在没用AndroidStudio的Gradle构建项目之前,多渠道打包一般都是基于ANT构建,所以在此记录一下,以供查阅! 一、文件准备 1、首先要去官网下载ANT代码。 ANT官网下载地址 2、下载ANT循环打包...

军歌
2014/11/20
0
3
在Linux下的批量打包apk方法

在Android项目需要发布的时候,经常需要发布多个渠道,这写渠道信息一般写在minifest.xml文件当中,这样的话,每次发布一个渠道的时候,需要去更改minifest.xml文件,这样显然不是一个程序员...

蜗牛TT
2012/08/28
0
4
Android Ant 批量多渠道打包实例

Android Ant 批量多渠道打包实例 关于批量打包,无需多言,这是每个国内Android开发者必须面对的一个问题。 下面,我就以开源项目「知乎小报」为例,详细说明如何使用ANT实现批量打渠道包。 ...

Cundong
2014/10/17
0
7
使用Ant 实现批量打包Android应用

由于公司运维需要以及应用中需要加上应用推广的统计,往往要对应二三十个渠道,按照正常方法一个一个的去生成不同渠道包的应用,不仅浪费了时间,而且大大降低了效率. 上一篇讲到使用Ant进行...

Easince
2012/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 看见这花臂了么?赶紧叫大佬!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享周华健的单曲《有没有一首歌会让你想起我》 《有没有一首歌会让你想起我》- 周华健 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
78
4
Confluence 6 升级中的一些常见问题

升级的时候遇到了问题了吗? 如果你想尝试重新进行升级的话,你需要首先重新恢复老的备份。不要尝试再次对 Confluence 进行升级或者在升级失败后重新启动老的 Confluence。 在升级过程中的一...

honeymoose
今天
2
0
C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
今天
3
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
18
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部