Android分渠道打包(Python 3.4 实现)
Android批量打包实现有很多方式你可以用Ant,Maven或者Gradle。在处理多个Library和NDK编译的时候配置有些麻烦,且每个渠道都编译一次效率较低。如果没有复杂的分渠道编译需求,我们可以换种简单的方式。因为apk中的assets是不会编译的,我们可以修改assets文件的值实现渠道修改,这样你的apk就可以通过读取修改过的文件区分各个渠道,用于数据统计。下面是我写的一个python脚本:
使用说明(Python 3.4):
1. 使用IDE工具导出未签名Apk,apk文件为WMShua.apk
2. 将APK放到脚本同级目录
3. 将签名文件放到同级目录下
4. 执行该脚本进行签名,可指定参数修改默认值
5. -h 查看帮助
#!/usr/bin/env python
# encoding: utf-8 import zipfile
import os
import shutil
import subprocess
import sys
keystore = <默认签名文件名 例如 "example.keystore">
storepass = <默认签名文件秘钥 例如 "example">
keypass = <默认秘钥 例如 "example">
alias = <默认签名文件别名 alias 例如 "www.example.com">
unsigned_apk_file = <默认未签名APK 例如 "example.apk">
apk_prefix = <默认签名APK名称前缀 例如 "_prefix">
apk_postfix = <默认签名APK名称后缀 例如 "_post">
base_extractPath = <默认临时导出目录 例如 "_output">
version_flag = <默认版本全称 例如 "_beta_1.0.1">
channel_file = <默认渠道文件相对路径 例如 "assets/channel_id">
channels = {
'': "官网",
'': "",
'': "百度",
'': "安卓",
'': "豌豆荚",
'': "应用宝",
'': "",
'': "应用汇",
'': "魅族",
'': "N多网",
'': "PP助手",
'': "淘宝",
'': "机锋网",
'': "金立",
'': "小米",
'': "华为",
'': "搜狗",
'': "安智",
'': "沃商店",
'': "itools",
'': "电信爱游戏",
'': "优亿市场",
'': "应用贝",
'': "googleplay",
'': "安粉网"
} def extract(zfile, path):
z = zipfile.ZipFile(zfile,'r')
for filename in z.namelist():
if not filename.endswith('/'):
f = os.path.join(path, filename)
dir = os.path.dirname(f)
if not os.path.exists(dir):
os.makedirs(dir)
singleFile = open(f, "wb")
singleFile.write(z.read(filename)) z.close() def modifyChannel(path, channel_id):
m_file = open(os.path.join(path, channel_file), "w")
m_file.write(channel_id)
m_file.flush()
m_file.close() print("---------modifyChannel-----------") def obtainFileListInfolder(path):
filelist = []
if os.path.isfile(path):
filelist.append(path)
else :
for root, dirs, files in os.walk(path):
for name in files:
filelist.append(os.path.join(root, name))
return filelist def reArchive(path, zipfilename): filelist = obtainFileListInfolder(path)
zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
for tar in filelist:
arcname = tar[len(path):]
#print arcname
zf.write(tar, arcname)
zf.close() def signApk(src, target):
signedCmd = "jarsigner -verbose -keystore " + keystore + " -storepass " + storepass +" -keypass "+ keypass +" -signedjar " + target + " " + src + " " + alias
print("---------signApk-----------" + signedCmd)
subprocess.call(signedCmd)
print("--------------------signedApk:" + target) def clearTmpFiles(paths):
for path in paths:
if os.path.exists(path):
if os.path.isfile(path):
os.remove(path)
else:
shutil.rmtree(path) def handleArgv(argv):
for i in range(1, len(argv)):
if len(argv) > i + 1 and '-h' != argv[i]:
if '-v' == argv[i] :
version_flag = argv[i + 1]
elif '-u' == argv[i] :
unsigned_apk_file = argv[i + 1]
elif '-K' == argv[i] :
keystore = argv[i + 1]
elif '-s' == argv[i] :
storepass = argv[i + 1]
elif '-k' == argv[i]:
keypass = argv[i + 1]
elif '-b' == argv[i]:
apk_prefix = argv[i + 1]
elif '-e' == argv[i]:
apk_postfix = argv[i + 1]
elif '-c' == argv[i]:
channel_file = argv[i + 1]
return False
elif '-h' == argv[i]:
helpstr = '''\n使用说明(Python 3.4):\n
1. 使用IDE工具导出未签名Apk,apk文件为WMShua.apk\n
2. 将APK放到脚本同级目录\n
3. 将签名文件放到同级目录下\n
4. 执行该脚本进行签名,可指定参数修改默认值,参数如下:\n''' helpstr += '''
-v version_flag 版本全称
-u unsigned_apk_file 未签名Apk
-K keystore 秘钥文件
-k keypass 秘钥
-s storepass 文件秘钥
-b apk_prefix 签名文件前缀
-e apk_postfix 签名文件后缀
-c channel_file 需要修改的渠道文件相对路径
-h help'''
print(helpstr)
return True
else:
print("参数未指定,使用默认参数!")
return False if __name__ == "__main__":
isJusthelp = False
if sys.argv and len(sys.argv) >= 2:
isJusthelp = handleArgv(sys.argv)
if not isJusthelp:
for channel_id in channels:
print('--------------------------------'+ channels[channel_id] + '('+ channel_id + ')'+'-----------------------------------')
channel_apk = channel_id +"_"+ channels[channel_id] + apk_prefix + ".apk"
signed_channel_apk = channel_id +"_"+ channels[channel_id] + apk_prefix + version_flag + apk_postfix
totalExtractPath = base_extractPath + channel_id
print("---------------开始解压缩:" + totalExtractPath)
extract(unsigned_apk_file, totalExtractPath) print("---------------修改渠道:" + channel_id)
modifyChannel(totalExtractPath, channel_id) print("---------------重新打包:" + channel_apk)
reArchive(totalExtractPath, channel_apk) print("---------------签名:" + signed_channel_apk)
signApk(channel_apk, signed_channel_apk) print("---------------清除临时文件...")
paths = [totalExtractPath, channel_apk]
### 清除临时文件
clearTmpFiles(paths)
print('------------------------分渠道打包完成-------------------------')
Android分渠道打包(Python 3.4 实现)的更多相关文章
- android分渠道打包,监测日活量统计(基于友盟SDK)
客服说要看App日活,让加个统计功能. (我们技术部已经混到客服部都能直接提需求的地步) 首先接入友盟统计的SDK,在项目外层的build.gradle中添加依赖'https://dl.bintray ...
- android渠道打包怎样实现最方便
我们都知道,Android 市场被分割成几十个应用商店渠道,程序员给渠道打包.更新是一件异常繁杂又不得不做的工作,但现在有一种快捷灵活的免费多渠道统计方式,能最大程度的提高打包效率和数据安全性. 首先 ...
- Android studio gradle 打包 那些事
总结了一下 目前觉得比较好用的gradle 和一些打包 经验.放在这里. 首先说下 渠道号 这个概念,我们经常会统计我们的api 访问来源 是来自于那个app store,这有利于 我们针对性的推广. ...
- Gradle Android客户端程序打包(基于gradle 2.10版本验证通过)
一.前言 目前正在准备从eclipse开发环境向AndroidStudio迁移,提前过去探探路,不出所料,原来gradle脚本果然报错,无法运行,想想索性把本地的gradle一起升级到最新版本,毕竟1 ...
- Gradle Android客户端程序打包(基于gradle 1.12版本验证通过)
一.前言 android客户端开发进入尾声,负责SEO同事突然发给我一个涉及45个发布渠道的噩耗,之前只发布自有渠道的工作方式(手动修改参数打包)已经不满足需求,所以引入最近比较流行的gradle打包 ...
- Android 新一代多渠道打包神器
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:李涛 ApkChannelPackage是一种快速多渠道打包工具,同时支持基于V1签名和V2签名进行多渠 ...
- 【腾讯Bugly干货分享】Android 新一代多渠道打包神器
关于作者: 李涛,腾讯Android工程师,14年加入腾讯SNG增值产品部,期间主要负责手Q动漫.企鹅电竞等项目的功能开发和技术优化.业务时间喜欢折腾新技术,写一些技术文章,个人技术博客:www.lt ...
- Android studio 自定义打包apk名
Android Studio打包应用默认生成的apk名称是:app-release.apk .如果我们要让生成的apk名跟我们版本包名有联系的话,那我们就要自定义生成的apk名了 需要在build.g ...
- [Android Studio] Android studio 多渠道打包(超简洁版)
[Android Studio] Android studio 多渠道打包(超简洁版) 转载:http://xuyazhou.com/archives/461 http://relex.me/usin ...
随机推荐
- file 上传文件后缀名 限制
比如: 要求只能上传Excel <input type="file" accept="application/vnd.ms-excel,application/vn ...
- 多线程编程 (2) -NSOperation
一.NSInvocationOperation 二.NSBlockOperation 三.NSOperation的其他用法 四.自定义NSOperation 1.上一讲简单介绍了NSThread的使用 ...
- java中string和int互相转化
1 怎样将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...
- sessionStorage、localStorage、cookie
sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,可以方便的在web请求之间保存数据.有了本地数据,就可以避免数据在浏览器和服务器间不必 ...
- Java设计模式偷跑系列(六)Singleton模式的建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39784403 单例模式(Singleton):是一种经常使用的设计模式. 在Java应用中 ...
- Java获取.properties配置文件某一项value根据key值
public static String getProperty(String key){ InputStream in = PropertiesUtils.class.getResourceAsSt ...
- 优秀个人免费私有云OwnCloud 8.0终于发布 - 亮眼新功能初探简介
OwnCloud是一个基于Linux的私有云开源项目,用户可以免费使用它来搭建自己的私有云来进行文件和多媒体等的分享. 本人有幸在大概一年多前因为项目需要而接触和使用到OwnCloud,但不幸的是当时 ...
- ASPX的Timer位置没放正确,导致整页刷新,而不是UpdatePanel里的内容刷新。
提示:Timer应该放在UpdatePanel的ContentTemplate标签里,才行.放在外面的话,会导致整页刷新.
- Cts分析框架(4)-添加任务
Debug watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRmb290YmFsbA==/font/5a6L5L2T/fontsize/400/fill/ ...
- Fedora20-Xfce音频视频解码器及解决无声音问题[已解决]
安装rpmfusion源 http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-20.noarch.rpm http:// ...