android app使用友盟社会化组件,可以配置UMENG_CHANNEL。以下是自动配置UMENG_CHANNEL并批量打包的memo。
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.apkapktool b app
java -jar signapk.jar cert.pem pri.pk8 ./app/dist/app.apk ./app/dist/signed.apk
#!/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 --------------------'