最近项目中需要添加应用渠道,我使用的是友盟统计,对于不同渠道需要编译不同版本,对于开发者说编译一次,手动操作还是可以接受的,但是项目发布版本频率较高,而且渠道很多,这就是一个体力活,而且手动打包还比较容易出错,所以就想到了用脚本打包。
利用脚本打包的原理就是把项目中的配置文件给覆盖,然后再次编译的时候,就是你要的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不久,写的很啰嗦,望各位看官见谅。
下面是一些截图。