在Linux下的批量打包apk方法

在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
 
相关文章
相关标签/搜索