Android快速多渠道打包方法

1.首先需要的是Python开发环境

去python官网https://www.python.org/downloads/下载最新版python3 双击安装,配置path环境变量,把python安装的目录添加进去。

2.需要使用的文件

必备文件:info文件夹\channel.txt和MultiChannelBuildTool.py

其余文件:其余文件有些是在打包的过程中会自动生成,如info文件夹/ temp.txt和包含有多渠道的app集合文件夹MutilChannel_*,这些文件在打包之前都要删除,附赠一个还有MD5校验工具。

注意:info文件夹和channel.txt如果没有可以自己新建起来,全部都是小写。
打包之前需要把MutilChannel_*文件夹和temp.txt都删除。
MultiChannelBuildTool.py的MD5为7A07C15C9B26881276CEC99C7D19DB34
每次打包之前都应该用MD5校验工具查看下,防止被人修改。

3.使用方法

编写渠道文件:打开info文件夹下的channel.txt文件,输入格式如下:
渠道ID–渠道名字–渠道描述,例如:

-1--Default--默认测试渠道
0--Official_Channel--官网
1--AppStore_Channel--App Store
2--_360_Channel--360
3--WanDouJia_Channel--豌豆荚
4--Tencent_Channel--腾讯应用宝
5--Baidu_Channel--百度应用市场
6--_91_Channel--91
7--Xiaomi_Channel--小米

第一个是渠道ID,第二个是渠道名,第三个是渠道描述,中间用两个减号隔开
格式要求严格,不要写多余的东西;不管是渠道ID、渠道名或者渠道描述,都绝不能包含两个相连的减号(可以有下划线和一个减号),渠道ID和渠道名字必须要写,渠道描述还没实际用到,预留,可以不写。

开始打包:将需要打包的app放入MultiChannelBuild文件夹中,
(和MultiChannelBuildTool.py同级),在Python环境配置成功的前提下,点击经过校验的MultiChannelBuildTool.py,过2秒后既可以生成所需要的不同渠道app。

其中的Python文件MultiChannelBuildTool.py代码为:

#!/usr/bin/python
# coding=utf-8
import zipfile
import shutil
import os

# 空文件 便于写入此空文件到apk包中作为channel文件
src_empty_file = 'info/temp.txt'
# 创建一个空文件(不存在则创建)
f = open(src_empty_file, 'w') 
f.close()

# 获取当前目录中所有的apk源包
src_apks = []
# python3 : os.listdir()即可,这里使用兼容Python2的os.listdir('.')
for file in os.listdir('.'):
    if os.path.isfile(file):
        extension = os.path.splitext(file)[1][1:]
        if extension in 'apk':
            src_apks.append(file)

# 获取渠道列表
channel_file = 'info/channel.txt'
f = open(channel_file)
lines = f.readlines()
f.close()

for src_apk in src_apks:
    # file name (with extension)
    src_apk_file_name = os.path.basename(src_apk)
    # 分割文件名与后缀
    temp_list = os.path.splitext(src_apk_file_name)
    # name without extension
    src_apk_name = temp_list[0]
    # 后缀名,包含.   例如: ".apk "
    src_apk_extension = temp_list[1]

    # 创建生成目录,与文件名相关
    output_dir = 'MutilChannel_' + src_apk_name + '/'
    # 目录不存在则创建
    if not os.path.exists(output_dir):
        os.mkdir(output_dir)

    # 遍历渠道号并创建对应渠道号的apk文件
    for line in lines:
        # 获取当前渠道号,因为从渠道文件中获得带有\n,所有strip一下
        target_channel = line.strip()
        if target_channel == '':
            continue
        channel_parts=target_channel.split('--')
        # 拼接对应渠道号的apk
        target_apk = output_dir + src_apk_name + "-" + channel_parts[1] + src_apk_extension
        # 拷贝建立新apk
        shutil.copy(src_apk,  target_apk)
        # zip获取新建立的apk文件
        zipped = zipfile.ZipFile(target_apk, 'a', zipfile.ZIP_DEFLATED)
        # 初始化渠道信息
        empty_channel_file = "META-INF/--{channel}".format(channel = target_channel)
        # 写入渠道信息
        zipped.write(src_empty_file, empty_channel_file)
        # 关闭zip流
        zipped.close()