apk多渠道批量打包memo

android app使用友盟社会化组件,可以配置UMENG_CHANNEL。以下是自动配置UMENG_CHANNEL并批量打包的memo。


1 友盟的渠道打包工具
http://www.pc6.com/softview/SoftView_99963.html
看介绍是一个非常满足需求的工具,可惜实际使用有问题,似乎友盟只维护到2013-07-09,
里面的apktool.jar版本已经out了,不认drawable-xxhdpi这样的资源目录。

而且从其他问题报告来看,完全没法用。。


2 ant build脚本

这个交给别人去试了,后来python的ok了就停了。这个方案需要源码。但是不需要反编译,理论上更可靠些。


3 python: android批量多渠道打包

http://blog.csdn.net/luck_apple/article/details/8634572
这个 兄弟的文章看起来非常不错,图文并茂,一目了然。
临时装了个python,发现得是python2版本。嗯,还需要是java7。
然后运行起来仍然是发现报错,不过看起来代码也不多,原理也简单,打算改改用。
首先找最新的apktool,从官网看到最新的是2.0.0了,可恶的是官网下不来。。
一通找,发现在一个号称最强悍,最犀利的APKDB里面有2.0.0的apktool,就抠出来用。
然后发现签名后还说签名错误,这个也奇怪,查到说有jarsigner和signapk两种签名方式。

那就改用signapk试试。为此还需要用openssl从kestore导出公钥私钥。验证ok。

基本就是反编译、修改UMENG_CHANNEL、打包、签名等如下几步。

apktool d app.apk
apktool b app

java -jar signapk.jar cert.pem pri.pk8 ./app/dist/app.apk ./app/dist/signed.apk

apk多渠道批量打包memo_第1张图片

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

def readChannelfile(filename):
    f = file(filename)
    while True:
        line = f.readline().strip('\n')
        if len(line) == 0:
            break
        else:
            channelList.append(line);
    f.close()

def backUpManifest():
    if os.path.exists('./AndroidManifest.xml'):
        os.remove('./AndroidManifest.xml')
    manifestPath = './temp/AndroidManifest.xml'
    shutil.copyfile(manifestPath, './AndroidManifest.xml')

def modifyChannel(value):
    tempXML = ''
    f = file('./AndroidManifest.xml')
    for line in f:
        if line.find('Channel123') > 0:
            line = line.replace('Channel123', value)
        tempXML += line
    f.close()

    output = open('./temp/AndroidManifest.xml', 'w')
    output.write(tempXML)
    output.close()
    
    unsignApk = r'./bin/%s_%s_unsigned.apk'% (easyName, value)
    cmdPack = r'java -jar apktool.jar b temp -o %s'% (unsignApk)
    os.system(cmdPack)
    
    signedjar = r'./bin/%s_%s_signed.apk'% (easyName, value)
    unsignedjar = r'./bin/%s_%s_unsigned.apk'% (easyName, value)
    cmd_sign = r'java -jar signapk.jar cert.pem pri.pk8 %s %s'% (unsignedjar, signedjar)
    os.system(cmd_sign)
    os.remove(unsignedjar);
    

channelList = []
apkName = 'app.apk'
easyName = apkName.split('.apk')[0]

output_apk_dir="./bin"
if os.path.exists(output_apk_dir):
    shutil.rmtree(output_apk_dir)

readChannelfile('./channels')
print '-------------------- your channel values --------------------'
print 'channel list: ', channelList
cmdExtract = r'java -jar apktool.jar d -o temp %s'% (apkName)
os.system(cmdExtract)

backUpManifest()
for channel in channelList:
    modifyChannel(channel)

if os.path.exists('./temp'):
    shutil.rmtree('./temp')
if os.path.exists('./AndroidManifest.xml'):
    os.remove('./AndroidManifest.xml')
print '-------------------- Done --------------------'


你可能感兴趣的:(android,python,技术)