在Android项目须要发布的时候,常常须要发布多个渠道,这写渠道信息通常写在minifest.xml文件当中,这样的话,每次发布一个渠道的时候,须要去更改minifest.xml文件,这样显然不是一个程序员该作的事。因此为项目生成一个批量打包的脚本,应该是应用开发的常备利器啊。python
本文介绍使用强大的python来批量打包apk包,以更改渠道信息为例子,来分析批量打包的过程。首先分析一下这个过程,应该是这样的:android
1.更改minifest.xml的渠道信息程序员
2.打包成apk包,这里使用ant来编译shell
3.循环一、2步,直到完成全部的渠道包dom
若是有更多的需求,能够去问问google大神python的语法,修改一下下面的脚本,就应该OK。若是若是其余的其中打包过程依赖于ant。若是不了解ant,可google一下,大体了解一下,ant也是一个强大的玩意,这个地方主要就是使用 ant release 命令来生成apk包。 对于 ant 编译android项目,能够看这里:http://my.oschina.net/u/559701/blog/75333eclipse
#!/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 为渠道的信息,内容以下:ide
androidesk@-be-filled-by-O-E-M:~/workspace/misc-android-client$ cat channels.txt goapk hiapk
) 就完成了多渠道的批量apk打包。最后在release下面就生成了2个apk包:google
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, 解压后,执行spa
#若是不能执行,请修改权限 ./update_project.sh ./release.py channels.txt