Android脚本打包

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

利用脚本打包的原理就是把项目中的配置文件给覆盖,然后再次编译的时候,就是你要的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
上面的是ant的配置文件,下面是项目中使用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不久,写的很啰嗦,望各位看官见谅。

下面是一些截图。








posted @ 2014-01-06 23:57  鬼脚八  阅读(463)  评论(0编辑  收藏  举报