在Linux下的批量打包apk方法

三世轮回 提交于 2019-11-29 20:12:22

在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

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!