Android分渠道多应用名打包方案

转载请注明出处
http://blog.csdn.net/u014513456/article/details/74783579
Author:[email protected]

背景
为优化APP在商店的应用排名,往往在不同的应用商店会有不同的AppName,需求方要求,某一个名字可能对应多个渠道。应为企业级应用会选择在上线的APP最后一步选择加密方案,所以修改App名称应该放在加密之前,由此有以下打包方案。


本文主要讲解多渠道打包方案,打包的准备工作不在此篇展开。
准备工作

  • 根据市场要求的AppName 的包
  • 对应包的加密工作
  • 产物目录如下规则存放
    ···package文件夹
    ·
    ······A文件夹
    ·
    ·····name1.apk 自定义文件名
    ·····该文件名对应的渠道配置信息

    ······B文件夹
    ·
    ·····name2.apk 自定义文件名
    ·····该文件名对应的渠道配置信息
    ····python脚本

以上文件目录详情如下图所示


根目录的python脚本如下
说明:主要是遍历每个文件夹中的apk包和对应的渠道信息生成对应的包放在根据文件名生成的文件夹中
最后将中间文件删除
注:本打包方案适用于signerVersion v1的签名方式

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

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

# 获取当前目录中所有的apk源包
src_apks = []

def eachFile2(filepath):
    print "我要读取的文件路径"+filepath
    eachFile3(filepath)

def eachFile(filepath):
    pathDir =  os.listdir(filepath)
    for allDir in pathDir:
        child = os.path.join('%s/%s/' % (filepath, allDir))
     #   print child
        if os.path.isdir(child):
             eachFile2(child)

def eachFile3(path):
    dirs = os.listdir(path)
    print 'eachFile3'
    for file in dirs:
        dirs_cook = path+'/'+file
        print os.path.isfile(dirs_cook)
        if os.path.isfile(dirs_cook):
            extension = os.path.splitext(file)[1][1:]
            if extension in 'apk':
                src_apks.append(file)
                print '执行正常'


# python3 : os.listdir()即可,这里使用兼容Python2的os.listdir('.')
#获取当前文件夹路径 
filePath = os.path.split(os.path.realpath(__file__))[0]
#执行方法
eachFile(filePath)


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]

    #分割版本号
    mylist = src_apk_name.split('-')
    version = mylist[1]

    # 创建生成目录,与文件名相关
    output_dir = 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()
        f = open(src_empty_file,'w') 
        f.write(target_channel)
        f.close()
        # 拼接对应渠道号的apk
        target_apk = output_dir + mylist[0] + "-" + target_channel + "-" + mylist[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"
        # 写入渠道信息
        #zipped.write(src_empty_file, empty_channel_file)
        print(target_channel)
        zipped.writestr(empty_channel_file, target_channel)
        # 关闭zip流
        zipped.close()

暂存后续文件目录补充。

猜你喜欢

转载自blog.csdn.net/u014513456/article/details/74783579