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 ...
随机推荐
- Google Guice结合模式
于Guice于,喷油器装配工作是一个对象图,当请求类型实例,喷油器根据推断对象如何映射到创建的实例.解决依赖.要确定如何解决的依赖就需要配置喷油器结合的方式. 要创建绑定(Binding)对象,能够继 ...
- 深入理解C指针之三:指针和函数
原文:深入理解C指针之三:指针和函数 理解函数和指针的结合使用,需要理解程序栈.大部分现代的块结构语言,比如C,都用到了程序栈来支持函数的运行.调用函数时,会创建函数的栈帧并将其推到程序栈上.函数返回 ...
- cocos2d 游戏开发实战
文章转自:http://uliweb.clkg.org/tutorial/read/40 6 cocos2d 游戏开发实战 6.1 创建cocos2d项目 6.2 cocos2d v3 & ...
- Facebook HHVM 和 Hack 手册----1.什么是Hack?
什么是Hack? Hack 是一种基于HHVM(HipHop VM 是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT编译器,同时具有产生快速代码和即时编译的优点)的新型编程语 ...
- 在 CentOS 上安装 Tomcat7
1. 下载 #可以直接在官网下载然后传到服务器上,也可以直接下载#下载地址:http://tomcat.apache.org/download-70.cgi 2. 安装 # tar -xzvf apa ...
- __declspec(novtable)keyword
__declspec (novtable )keyword,表示这个类不生成虚函数表.可是继承类不影响(无论基类是否使用了keyword). 不使用此keyword.类在生成对象时构造函数和析构函数多 ...
- js 实现复制粘贴文本过滤(保留文字和图片)
实现复制粘贴文本过滤(保留文字和图片) demo如下: <head> <meta http-equiv="Content-Type" content=" ...
- ssh常用用法小结
ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...
- 【转】Android的Merge讲解与实例
原文:http://blog.sina.com.cn/s/blog_62f987620100sf13.html 单独将<merge />标签做个介绍,是因为它在优化UI结构时起到很重要的作 ...
- Best jQuery Plugins of the Month – May 2014
1. jQuery referenceSection jQuery referenceSection by Scott Mascio ensures to help users in adding a ...