在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