Python - 借鉴美团多渠道打包方案,我写了这样一个工具

众所周知,多渠道打包这个问题一直很麻烦,因为Gradle太吃电脑内存,总是感觉吃不消。但是,美团给我们提供了一个好的方案啊!查看原文 => 美团多渠道打包方案

这种方案,极大的节省了我们的打包时间,Very Nice~~~

因此,借鉴于美团的方案,制作了如下的一个脚本程序,Git地址

QQ截图20170413165849.png

PS: 针对Android N中V2签名后,渠道打包后安装失败,我们需要在signed配置中禁用V2签名

。。。
android {
    signingConfigs {
        released {
            keyAlias 'xxxx'
            storeFile file('xxxxx')
            keyPassword 'xxxx'
            storePassword 'xxxx'
            v2SigningEnabled false  //禁用v2签名方式
        }
        debug {
            keyAlias 'xxxx'
            keyPassword 'xxxxx'
            storeFile file('xxxxx')
            storePassword 'xxxxx'
            v2SigningEnabled false  //禁用v2签名方式
        }
    }
    。。。
}

现在贴一贴基本的代码,

import os
import re
import zipfile
import fileinput


# 文件拷贝函数
# srcfile 源文件
# targetfile 目标文件
def copy_apkfile(srcfile, targetfile):
    ''' 复制APK文件
        :param srcfile 源文件
        :param targetfile 目标文件 '''
    # print("文件目录:%s" % folder)
    if os.path.exists(targetfile):  # 如果目标文件存在,则删除目标文件
        os.remove(targetfile)
    open(targetfile, "wb").write(open(srcfile, "rb").read())


# 读取渠道配置文件
# config_file 配置文件名
def read_channelconfig(config_file):
    channels = dict()
    fileinput.hook_encoded("utf-8")
    file = open(config_file, mode='r', encoding='utf-8')
    while True:
        line = file.readline().lstrip().rstrip('\n')
        if line is None or line == '':
            break
        if not line.startswith("#"):
            regex = re.compile('\[([^\]]*)\]\s*([A-Za-z0-9_]+)')
            match = regex.match(line)
            if match:
                channelname = match.group(1)
                channelvalue = match.group(2)
                channel_key = channelname if not (channelname == '' or channelname is None) else channelvalue
                channels["{channelName}".format(channelName=channel_key)] = channelvalue
            del match
            del regex
    return channels


# 写入渠道数据
# standard_apkfile 标准APK文件
# channel_name 渠道名称
# prefix_name 文件前缀名
def write_channelconfig(standard_apkfile, channel_name, prefix_name):
    zf = zipfile.ZipFile(standard_apkfile, 'a', zipfile.ZIP_DEFLATED)
    empty_file = 'META-INF/{prefix_name}channel_{channel}'.format(prefix_name=prefix_name, channel=channel_name)
    zf.write('../config/empty_channel.chl', empty_file)


# 递归清空目录
#  folder_name 目录
def clear_folder(folder_name):
    folder = os.path.dirname(folder_name)
    if not os.path.exists(folder):  # 如果文件夹不存在,则创建文件夹
        os.makedirs(folder)
    for file in os.listdir(folder_name):
        filename = "%s%s" % (folder_name, file)
        if os.path.isfile(filename):
            if file == 'ReadMe.txt':  # 不删除说明文件
                continue
            # print("\t\t正在删除APK缓存文件 ------> %s\n" % filename)
            os.remove(filename)  # 删除缓存文件
        elif os.path.isdir(filename):
            clear_folder(filename)
            # os.removedirs(filename)
        else:
            print("\t\tunknown file!")


# 主程序函数执行代码
# (1).应该写入多个原生态Apk,数量由渠道数量确定
# (2).读取渠道名称,并写入渠道空文件
# (3).根据渠道名称重命名文件,并附上文件名称
# standard_apkfile 标准文件名
# outfolder 输出文件目录
# channel_prefix 渠道前缀名
# is_clear_outputdir 是否清空输出文件夹,默认为True
def exec_write_channel(standard_apkfile, outfolder, channel_prefix, is_clear_outputdir=True):
    if not os.path.exists(standard_apkfile):  # 检测文件是否找到
        print("\t\t错误,文件: %s  未找到" % standard_apkfile)
        exit(-1)
    config_channels = read_channelconfig("../config/channel.config")
    if is_clear_outputdir:  # 如果需要清空输出目录,则清理输出目录
        clear_folder(outfolder)
    print()  # 换行而已
    if config_channels is not None:  # 判断渠道数据是否存在
        print("\t\t【进行中】美团团队分渠道打包流程进行中:")
        for channel_key in config_channels:
            channel = config_channels[channel_key]  # 获取当前的渠道值
            print()
            print("\t\t【{channel_key}】-【{channel}】".format(channel_key=channel_key, channel=channel))
            print("--------------------------------------------------------")
            print("\t\t正在获取渠道名称,准备复制Apk文件 >>>> {channel}".format(channel=channel_key))  # 输出Apk渠道打包信息
            targetfilename = "{out_folder}/【{channel_name}】{standard_apkfile}"\
                .format(out_folder=outfolder,
                        channel_name=channel_key,
                        standard_apkfile=standard_apkfile.split("/")[-1])  # 目标文件名
            copy_apkfile(standard_apkfile, targetfilename)  # 复制APK文件
            print("\t\tApk文件已复制,正在处理渠道打包 >>> {channel_key}".format(channel_key=channel_key))
            write_channelconfig(targetfilename, channel, channel_prefix)  # 写入渠道空文件
            print("\t\t渠道打包已完成 >>> {channel_key}".format(channel_key=channel_key))
        print("\n\t\t【结果】:渠道打包都已完成")
    else:
        print("\t\t【结果】:未配置渠道数据,程序已结束")
    del config_channels  # 释放对象
    exit(0)

注释写得很完美,哈哈。再看看启动程序:

from src.ApkWriter import *


# 目标Apk文件
TARGET_APK = "../standard_apk/{filename}".format(filename="MeGuo_v3.0.2_10_standard__.apk")


# 输出APK的目录
OUTPUT_DIR = "../output_apk/"


# 渠道前缀名,完全名是,例如前缀是:baidu ,则为 baiduchannel@channelName
PREFIX_NAME = "meguo"


# 执行的主函数
if __name__ == "__main__":
    exec_write_channel(TARGET_APK, OUTPUT_DIR, PREFIX_NAME)
else:
    print("\t\tNone To Execute!")

<b>PS:</b> 这里填一个坑,你们可要小心了。经测定,在360加固应用后,这种方式就失效了。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容