文档章节

在Linux下的批量打包apk方法

蜗牛TT
 蜗牛TT
发布于 2012/08/28 17:38
字数 759
阅读 4490
收藏 9

在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

 

 

 

© 著作权归作者所有

蜗牛TT
粉丝 56
博文 127
码字总数 34452
作品 0
海淀
高级程序员
私信 提问
加载中

评论(4)

小方哥很靠谱
小方哥很靠谱
我遇到一个问题
build.xml null returned 1
剪水秋童
我遇到一个问题
build.xml null returned
vincent1988
vincent1988

引用来自“ddatsh”的评论

用ant 一个sdk被我精简到6m
ddatsh
ddatsh
用ant 一个sdk被我精简到6m
Android批量打包-如何一秒内打完几百个apk渠道包

在国内Android常用渠道可能多达几十个,如: 谷歌市场、腾讯应用宝、百度手机助手、91手机商城、360应用平台、豌豆荚、安卓市场、小米、魅族商店、oppo手机、联想乐商、中兴汇天地、华为、安...

SuShine
2017/10/23
61
0
Android开发Gradle高级技巧、自定义Gradle Task、打包完成自动签名、执行Shell脚本

版权声明:本文出自阿钟的博客,转载请注明出处: https://blog.csdn.net/a_zhon/article/details/85065047 先说下为什么有这篇文章吧,最近在写一个应用需要进行系统签名;每次我都需要先将a...

Code-Porter
2018/12/18
0
0
SimpleNews 项目的重构之旅(5) - Android Gradle 打包&混淆应用

应用场景 之前一直没有做 Android APK 发包管理,所以这次重构把这打包这部分考虑进去,之后可能会发布到一些应用市场。 要实现的功能 混淆代码 实现签名 过滤无用资源 生成 release 版本 AP...

無名小子的杂货铺
2017/06/12
0
0
Android 4.4 静默安装(无需Root权限)

关于静默安装,发现百度上有很多的方法,都行不通,在摸索多次之后,终于找到这个可行的方法,特地记录下来与大家分享,亲测成功!!! 1.首先是代码的编写,也是使用pm命令来安装和卸载apk...

MrChen丶
2018/08/22
0
0
Android Rom修改制作工具软件集合

1.SIN2IMG 用于固件ftf中system.sin的解包 下载地址: SIN2IMG.rar 使用方法:将固件ftf文件用rar打开,解压出system.sin文件,将该文件于SIN2IMG.exe放在同一个文件夹里面,比如说X:\下,进入...

长平狐
2012/09/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

从0搭建自己的webpack开发环境(五)

往期回顾: 从0搭建自己的webpack开发环境(一) 从0搭建自己的webpack开发环境(二) 从0搭建自己的webpack开发环境(三) 从0搭建自己的webpack开发环境(四) 前四篇文章我们已经掌握了w...

前端优选
昨天
5
0
docker 构建php-fpm 7.2(swoole) 镜像

mkdir -p ~/mnt/docker/phpmkdir -p ~/mnt/docker/php#下载swoole-2.2.0.tgz安装包到software 下载地址:http://pecl.php.net/package/swoole/2.2.0#创建Dockerfilevim ~/docker/......

Jack088
昨天
5
0
简单工厂

定义:由一个工厂对象决定创建出哪一种产品类的实例 类型:创建型,但不属于GOF23种设计模式 工厂类负责创建的对象比较少 客户端(应用层)只知道传入工厂类的参数,对于如何创建对象,不关心...

东风破2019
昨天
4
0
SSH安全加强两步走

从 OpenSSH 6.2 开始已经支持 SSH 多因素认证,本文就来讲讲如何在 OpenSSH 下启用该特性。 OpenSSH 6.2 以后的版本多了一个配置项 AuthenticationMethods。该配置项可以让 OpenSSH 同时指定...

Linux就该这么学
昨天
7
0
聊聊nacos的TcpSuperSenseProcessor

序 本文主要研究一下nacos的TcpSuperSenseProcessor TcpSuperSenseProcessor nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/TcpSuperSenseProcessor.java @Compon......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部