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 实现)的更多相关文章

  1. android分渠道打包,监测日活量统计(基于友盟SDK)

    客服说要看App日活,让加个统计功能. (我们技术部已经混到客服部都能直接提需求的地步) 首先接入友盟统计的SDK,在项目外层的build.gradle中添加依赖'https://dl.bintray ...

  2. android渠道打包怎样实现最方便

    我们都知道,Android 市场被分割成几十个应用商店渠道,程序员给渠道打包.更新是一件异常繁杂又不得不做的工作,但现在有一种快捷灵活的免费多渠道统计方式,能最大程度的提高打包效率和数据安全性. 首先 ...

  3. Android studio gradle 打包 那些事

    总结了一下 目前觉得比较好用的gradle 和一些打包 经验.放在这里. 首先说下 渠道号 这个概念,我们经常会统计我们的api 访问来源 是来自于那个app store,这有利于 我们针对性的推广. ...

  4. Gradle Android客户端程序打包(基于gradle 2.10版本验证通过)

    一.前言 目前正在准备从eclipse开发环境向AndroidStudio迁移,提前过去探探路,不出所料,原来gradle脚本果然报错,无法运行,想想索性把本地的gradle一起升级到最新版本,毕竟1 ...

  5. Gradle Android客户端程序打包(基于gradle 1.12版本验证通过)

    一.前言 android客户端开发进入尾声,负责SEO同事突然发给我一个涉及45个发布渠道的噩耗,之前只发布自有渠道的工作方式(手动修改参数打包)已经不满足需求,所以引入最近比较流行的gradle打包 ...

  6. Android 新一代多渠道打包神器

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:李涛 ApkChannelPackage是一种快速多渠道打包工具,同时支持基于V1签名和V2签名进行多渠 ...

  7. 【腾讯Bugly干货分享】Android 新一代多渠道打包神器

    关于作者: 李涛,腾讯Android工程师,14年加入腾讯SNG增值产品部,期间主要负责手Q动漫.企鹅电竞等项目的功能开发和技术优化.业务时间喜欢折腾新技术,写一些技术文章,个人技术博客:www.lt ...

  8. Android studio 自定义打包apk名

    Android Studio打包应用默认生成的apk名称是:app-release.apk .如果我们要让生成的apk名跟我们版本包名有联系的话,那我们就要自定义生成的apk名了 需要在build.g ...

  9. [Android Studio] Android studio 多渠道打包(超简洁版)

    [Android Studio] Android studio 多渠道打包(超简洁版) 转载:http://xuyazhou.com/archives/461 http://relex.me/usin ...

随机推荐

  1. Android_开发人员经常使用的颜色

    Android开发中经常要用一些个性化的颜色,然而茫茫的RBG颜色对比表,往往给人眼花缭乱的感觉,更别说从中轻易选出一两种比較惬意的颜色,以下我就总结一下开发中经常使用到的比較绚丽的颜色. 以下是经常 ...

  2. DevExpress asp.net 导出Excel 自动开启迅雷问题,默认保存为aspx页面

    目前采取曲线救国策略: 利用MVC ..... <dx:ASPxGridView ID="ASPxGridView1" runat="server" Au ...

  3. hdu1047 Integer Inquiry 多次大数相加

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1047 Problem ...

  4. outlook自动备份

    在 这里 下载 http://support.microsoft.com/kb/238782

  5. UVA 11525 Permutation(树状数组)

    题目意思是说  给你一个数k  然后有k个si   问你1--k 的第n个全排列是多少   注意是 1 2 3...k的全排列 不是si的 N=   由观察得知(k-i)!就是k-i个数字的全排列种数 ...

  6. 创建GitHub技术博客

    创建GitHub技术博客全攻略 githubio技术博客网站生成 说明: 首先,你需要注册一个 github 账号,最好取一个有意义的名字,比如姓名全拼,昵称全拼,如果被占用,可以加上有意义的数字.本 ...

  7. hdu - 3049 - Data Processing(乘法逆元)

    题意:N(N<=40000)个数n1, n2, ..., nN (ni<=N),求(2 ^ n1 + 2 ^ n2 + ... + 2 ^nN) / N % 1000003. 题目链接:h ...

  8. 优秀个人免费私有云OwnCloud 8.0终于发布 - 亮眼新功能初探简介

    OwnCloud是一个基于Linux的私有云开源项目,用户可以免费使用它来搭建自己的私有云来进行文件和多媒体等的分享. 本人有幸在大概一年多前因为项目需要而接触和使用到OwnCloud,但不幸的是当时 ...

  9. JAVA 代码生成。SimpleCaptcha

    去官方网站下载Jar包: http://simplecaptcha.sourceforge.net/ Javadocs: http://simplecaptcha.sourceforge.net/ja ...

  10. 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&amp;混合操作编译

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨)  ...