在Android项目需要发布的时候,经常需要发布多个渠道,这写渠道信息一般写在minifest.xml文件当中,这样的话,每次发布一个渠道的时候,需要去更改minifest.xml文件,这样显然不是一个程序员该做的事。所以为项目生成一个批量打包的脚本,应该是应用开发的常备利器啊。
本文介绍使用强大的python来批量打包apk包,以更改渠道信息为例子,来分析批量打包的过程。首先分析一下这个过程,应该是这样的:
1.更改minifest.xml的渠道信息
2.打包成apk包,这里使用ant来编译
3.循环1、2步,直到完成所有的渠道包
如果有更多的需求,可以去问问google大神python的语法,修改一下下面的脚本,就应该OK。如果如果其他的其中打包过程依赖于ant。如果不了解ant,可google一下,大致了解一下,ant也是一个强大的玩意,这个地方主要就是使用 ant release 命令来生成apk包。 对于 ant 编译android项目,可以看这里:http://my.oschina.net/u/559701/blog/75333
#!/usr/bin/python
import os
import sys
RELEASE_DIR = 'release'
manifest = 'AndroidManifest.xml'
manifest_bk = 'AndroidManifest.xml.bk'
#--通过命令输入的渠道文件名 取得渠道名称
channels = [i.strip() for i in open(sys.argv[-1]).read().split() if i.strip()]
# channels = ['goapk']
def backup():
os.system('cp %s %s' % (manifest, manifest_bk))
def restore():
os.system('rm %s' % manifest)
os.system('mv %s %s' % (manifest_bk, manifest))
def replace_channel(channel_name):
#--可以看出来python的语法很nb啊,这么两句就完成了manifest的xml解析
from xml.dom.minidom import parse
dom = parse(open(manifest))
#--替换我们想要替换的内容,这里我们替换我们的渠道信息
for i in dom.getElementsByTagName('meta-data'):
if i.getAttribute('android:name') == 'CHANNEL':
i.setAttribute('android:value', channel_name)
open(manifest, 'w').write(dom.toxml().encode('utf-8'))
def rename_apk(channel_name):
apk_file = 'bin/SexGirl-release.apk'
channel_apk_file = '%s/SexGirl-release-%s.apk' % (RELEASE_DIR, channel_name)
#--渠道内容变了,apk包名也需要更改与之对应起来
os.system('mv %s %s' % (apk_file, channel_apk_file))
def main():
#--创建apk的release目录
if not os.path.exists(RELEASE_DIR):
os.mkdir(RELEASE_DIR)
backup()
os.system('rm %s/*' % RELEASE_DIR)
#重点的编译的地方,循环编译apk。实际上,eclipse等IDE环境的编译在背后也是做的类似这样的操作。当然这里使用了ant来编译,所以执行本脚本的前提是安装了ant
for i in channels:
os.system('ant clean')
replace_channel(i)
os.system('ant release')
rename_apk(i)
restore()
if __name__ == '__main__':
if not sys.argv[-1].endswith('txt'):
print './release.py channels.txt'
exit(1)
main()
将这段脚本放在项目的跟目录下面,一执行(执行之前最好把中文删除掉,在命令行里中文很可能不支持),输入 ./release.py channels.txt (release.py为本脚本的名字,channels.txt 为渠道的信息,内容如下:
androidesk@-be-filled-by-O-E-M:~/workspace/misc-android-client$ cat channels.txt
goapk
hiapk
) 就完成了多渠道的批量apk打包。最后在release下面就生成了2个apk包:
androidesk@androidesk-To-be-filled-by-O-E-M:~/workspace/misc-android-client$ ls release
misc-release-goapk.apk misc-release-hiapk.apk
这里是一个testDemo,http://www.oschina.net/code/snippet_559701_13295, 解压后,执行
#如果不能执行,请修改权限
./update_project.sh
./release.py channels.txt
来源:oschina
链接:https://my.oschina.net/u/559701/blog/75237