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. STL慎重选择删除元素的

     一.要删除容器中有特定值的全部对象 1.假设容器是vector.string或deque.则使用erase-remove习惯使用方法.比如: vector<int> c; c.era ...

  2. 利用WebBrowser实现Web打印的分析

    原文:利用WebBrowser实现Web打印的分析 WebBrowser是IE内置的浏览器控件,无需用户下载.本文档所讨论的是有关IE6.0版本的WebBrowser控件技术内容.其他版本的IE应该也 ...

  3. BS导出csv文件的通用方法(.net)

    最近把以前项目里用的导出文件的功能提取成了dll,通过读取Attribute来得到要导出的表头(没有支持多语言),使用时只要组织好要导出的数据,调用方法就好了,希望对大家有用. 使用时只需引用下载包里 ...

  4. 网站静态化处理—web前端优化—上

    网站静态化处理—web前端优化—上(11) 网站静态化处理这个系列马上就要结束了,今天我要讲讲本系列最后一个重要的主题web前端优化.在开始谈论本主题之前,我想问大家一个问题,网站静态化处理技术到底是 ...

  5. 七牛云存储C#例用小例子 C#笔记

    最近有需求要把网站的图片传到云存储上去.于是就找到了七牛.看上面的SDK...看了才发现里面注释很少.当时看的头大.在网上搜一下,基本上没有好的例子.给初学者带来很大的不便!不过最后还是做出来了.在这 ...

  6. Linux httpd 跳转简单方法一

    直接在httpd.conf中添加以下代码即可: NameVirtualHost *:80 <VirtualHost *:80> ServerName localhost ##访问域名 Re ...

  7. Spring源深和六系列 CreateBean过程

    blog宗旨:用图说话. 这一章的图讲述了createBean的过程.到这里spring容器就能够完毕IOC的整个过程,拿到我们须要的对象. 下一章我们接着来看一看AOP完毕的过程. 附:文件夹 Sp ...

  8. Android 4.4堆叠结构的变化

    我们知道,activity 在 AMS 的形式是 ActivityRecord,task 在 AMS 的形式TaskRecord,流程 AMS 该管理形式 ProcessRecord. 我们先看下 4 ...

  9. Linux Kernel的Makefile与Kconfig文件的语法

    https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt Introduction ------------ The c ...

  10. leetcode第三题--Longest Substring Without Repeating Characters

    Problem:Given a string, find the length of the longest substring without repeating characters. For e ...