android 加固服务器,Python 脚本构建Android APK 自动加固、打渠道包并上传服务器
Python 脚本构建Android APK 自动加固、打渠道包并上传服务器
常规流程
打出原始apk
使用乐固工具加固并打出响应渠道包
将生成的渠道包上传对应服务器,生成推广链接
因为每一步都需要人工介入,尤其当渠道较多时,相当耗时,且有出错的可能,所以考虑以脚本替代人工执行步骤。
准备工作
qshell 用于上传七牛服务器的命令行工具
VasDolly多渠道打包工具,同时支持基于V1签名和V2签名进行多渠道打包
apksigner.jar 用于为apk进行签名,支持v1+v2签名,这里有个坑,一开始我选择使用的是java包内的jarsigner,后发现只支持v1签名。apksigner.jar位置在android sdk的libs中,可以考虑将其复制到当前工作目录下
脚本编写
初始化
# 初始化环境
def init():
command = './qshell account'
result = os.popen(command).read()
if ('error' in result):
command = './qshell account '
os.popen(command).read()
if not os.path.exists(ORIGIN_APK):
raise RuntimeError('找不到原始 apk 文件')
# 删除临时 apk 文件
if os.path.exists(TEMP_APK):
os.remove(TEMP_APK)
# 删除上传失败日志文件
if os.path.exists(QINIU_FAILED_LIST):
os.remove(QINIU_FAILED_LIST)
# 初始化清缓存文件
fp = open(REFRESH_CONFIG,'w')
fp.write(QINIU_URL+ORIGIN_APK)
fp.close()
os.makedirs(OUTPUT_PATH)
首先我们进行qshell的设置,设置当前用户的AccessKey, SecretKey和Name, Name是用户可以任意取的名字,表示当前在本地记录的账户的名称。
ORIGIN_APK是打包出来的原始apk
TEMP_APK、QINIU_FAILED_LIST、REFRESH_CONFIG 都是运行生成的结果,在下一次运行初期进行一次清理。
上传临时APK文件到七牛中
# 上传临时APK文件到七牛
def uploadApp():
command = './qshell rput --overwrite %s %s %s ' % (
QINIU_BUCKET, ORIGIN_APK, ORIGIN_APK)
uploadResult = os.popen(command).read()
if 'success' not in uploadResult:
raise RuntimeError('上传临时APK文件到七牛失败:'+uploadResult)
refresh()
# 刷新七牛缓存
def refresh():
command = './qshell cdnrefresh -i %s' % (REFRESH_CONFIG)
os.popen(command).read()
将临时文件上传七牛,这样我们能拿到改apk的链接,方便下一步的加固工作
QINIU_BUCKET:七牛空间名称,可以为公开空间或私有空间
使用乐固进行加固并签名
# 使用乐固加固
def legu():
cred = credential.Credential(TENCENT_KEY, TENCENT_SECRET)
httpProfile = HttpProfile()
httpProfile.endpoint = "ms.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = ms_client.MsClient(cred, "ap-shanghai", clientProfile)
req = models.CreateShieldInstanceRequest()
params = '''{
"AppInfo":{
"AppUrl":"%s",
"AppMd5":"%s"
},
"ServiceInfo":{
"ServiceEdition":"basic",
"SubmitSource":"api"
}
}''' % (QINIU_URL+ORIGIN_APK, md5_file(ORIGIN_APK))
req.from_json_string(params)
#调用腾讯 API乐固接口加固
resp = client.CreateShieldInstance(req)
itemId = resp.ItemId
if not itemId:
raise RuntimeError('创建乐固实例失败:'+resp)
req = models.DescribeShieldResultRequest()
params = '{"ItemId":"%s"}' % (itemId)
req.from_json_string(params)
#下载加固结果
for num in range(20):
time.sleep(120)
print("查看乐固加固结果,第%d次尝试中..." % num)
resp = client.DescribeShieldResult(req)
if resp.TaskStatus != 2:
break
else:
raise RuntimeError('加固超时')
downloadURL = resp.ShieldInfo.AppUrl
appMD5 = resp.ShieldInfo.ShieldMd5
if downloadURL:
urllib.urlretrieve(downloadURL, TEMP_APK)
if md5_file(TEMP_APK) != appMD5:
raise RuntimeError('下载加固结果失败')
# 签名
command = sign_command(TEMP_APK)
os.popen(command).read()
# 计算文件的 md5值
def md5_file(name):
m = md5()
a_file = open(name, 'rb') # 使用二进制格式读取文件内容
m.update(a_file.read())
a_file.close()
return m.hexdigest()
#使用apksigner进行签名
def sign_command(file):
return 'java -jar apksigner.jar sign --ks %s --ks-key-alias ALIAS --ks-pass pass:PASS --key-pass pass:PASS --out %s %s'% (SIGN_KEY, file,file)
使用乐固API接口进行加固,完成加固后下载至本地并进行md5的验证,确保包的一致性,而后在本地对其进行签名
TENCENT_KEY、TENCENT_SECRET 用于乐固的腾讯key&&secret
ALIAS别名 PASS密码 SIGN_KEY秘钥所在位置
打渠道包
# 打渠道包
def channel():
command = 'java -jar VasDolly.jar put -c %s %s %s' % (
CHANNEL_CONFIG, TEMP_APK, OUTPUT_PATH)
result = os.popen(command).read()
searchObj = re.search(r'total (\d+) channel apk', result, re.M | re.I)
total = int(searchObj.group(1))
channelCount = len(open(CHANNEL_CONFIG, 'rU').readlines())
if total != channelCount:
raise RuntimeError('生成渠道包数量异常:应生成%s,实际生成%s' % (channelCount, total))
rename()
# 重命名
def rename():
files = os.listdir(OUTPUT_PATH)
for file in files:
f = os.path.join(OUTPUT_PATH, file)
#os.popen(sign_command(f))
os.rename(f, f.replace('-'+TEMP_APK, '.apk'))
不同于以往先打渠道包而后进行签名的方式,VasDolly可以让我们在不破坏签名的情况下进行渠道打包。
这边也有个坑,因为原先采用的打渠道包方式是umeng,umeng会直接修改manifest的channel字段,所以我们在包内获取渠道名的方式都是直接读这个字段。VasDolly不会去修改这个字段,因而需要改变项目内所有获取渠道名的方式,这边可以参考VasDolly的说明进行修改。
这样我们的加固及打渠道都完成了,渠道包会输出在你指定的OUTPUT_PATH。
CHANNEL_CONFIG 包含所有渠道名称 换行分隔
上传到七牛
def deploy():
uploadCmd = './qshell qupload2 --overwrite --rescan-local --src-dir=%s --bucket=%s --failure-list %s --check-hash --thread-count 10' % (
QINIU_UPLOAD_PATH, QINIU_BUCKET, QINIU_FAILED_LIST)
os.popen(uploadCmd).read()
if os.path.getsize(QINIU_FAILED_LIST):
raise RuntimeError('上传到七牛失败,失败文件列表见:' + QINIU_FAILED_LIST)
#清缓存
fp = open(REFRESH_CONFIG,'w')
files = os.listdir(OUTPUT_PATH)
fp.writelines([QINIU_URL+QINIU_UPLOAD_SUBPATH+file+'\n' for file in files])
fp.close()
refresh()
# 刷新七牛缓存
def refresh():
command = './qshell cdnrefresh -i %s' % (REFRESH_CONFIG)
os.popen(command).read()
这样就完成了整个加固、打渠道包、上传服务器的过程。
android 加固服务器,Python 脚本构建Android APK 自动加固、打渠道包并上传服务器相关推荐
- HTML5调用本地摄像头画面,拍照,上传服务器
实现功能和适用业务 采集本地摄像头获取摄像头画面,拍照保存,上传服务器: 前端上传图片处理,展示,缩小,裁剪,上传服务器 实现步骤 调取本地摄像头(getUserMedia)/上传图片,将图片/视频显 ...
- Android编译及编译脚本、Android构建基础学习笔记
Android编译及编译脚本.Android构建基础学习笔记 Android编译及编译脚本 概述 Android.mk转换成Android.bp 例子(简单Android.mk文件转Android.b ...
- android运行python脚本,在android应用程序中运行python脚本
我想得到远程安装软件的列表电脑.为了我想在我的android中使用python脚本申请.现在,我有一个python脚本,它正在远程获取已安装软件的列表电脑.但是,我不知道如何在android中支持它. ...
- Android实时监听短信并上传服务器
短信监听 Android监听手机短信的方法有两种,分别为: 1.接受系统的短信广播:当手机收到新消息时,会发送一条广播,通过该广播就可以获取短信内容: 2.监听短信数据库:利用观察者模式监听短信数据库 ...
- 优化Recorder H5录音:可边录边转码上传服务器,支持微信提供Android IOS Hybrid App源码
文章目录 一.Recorder H5录音库的特性 (1)浏览器支持 (2)功能支持 二.使用预览截图 (1)移动端H5 (2)IOS Hybrid App (3)Android Hybrid App ...
- python登录交换机执行命令_利用Python脚本登录交换机实现自动配置备份的方法
主机参考:服务器测评参考推荐网,专注分享服务器优惠信息!如果您想在本站投放您的广告,点此直达!如果您不想付费,您也可以免费投稿您的产品信息,点此直达!联系我们 部分文章发布时间较久远,可能存在未知因素 ...
- Android图片压缩(质量压缩和尺寸压缩)Bitmap转成字符串上传
在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手 ...
- python脚本连接交换机,自动执行命令。
python脚本连接交换机,自动执行命令. python脚本连接交换机,自动执行命令,查询交换机端口的学习mac地址,自动写入txt中.设置定时器,每xx秒执行一次,自动对比上次返回结果,TXT中保存 ...
- pyaudio:基于pyaudio利用Python编程从电脑端录制音频保存到指定文件夹+将录音上传服务器+录音进行识别并转为文本保存
pyaudio:基于pyaudio利用Python编程从电脑端录制音频保存到指定文件夹+将录音上传服务器+录音进行识别并转为文本保存 目录 输出结果 代码实现 输出结果 代码实现 # -*- codi ...
最新文章
- OpenCV-Python 彩色图像均衡化与规定化
- linux服务器secureCRT RSA登录配置
- orm的理解_ORM仇恨者无法理解
- NuGet的使用、部署、搭建私有服务
- linux java jdk配置_Linux环境下安装JDK并配置环境变量
- xy的跨浏览器在线编辑器超级简易版
- Acrobat DC安装教程
- 基于Python的淘宝用户行为分析
- 【强化学习入门】人工智能、深度学习理论框架以及学习资料
- Bootstrap文字排版方面css实用类
- obs推流视频比特率_我如何使用OBS和WebSockets流视频
- 名帖116 文徵明 小楷《离骚经》
- 教你如何创建一个免费的网站
- 【C++】由于找不到xxx.dll,无法继续执行代码,重新安装程序可能会解决此问题。(解决办法)
- php去除首尾符号,PHP如何去除头尾字符
- 计算机通电后 不能正常启动,我的电脑通电后不能马上启动?为什么啊?怎么办
- numpy的文件存储 .npy .npz 文件
- 归并排序【算法解析,代码模板】
- 计算机专业培训策划案,电脑培训策划书
- android 动画制作小软件GifMaker
热门文章
- 关于WebView加载H5页面下载文件和下载完毕后自动打开文件
- Python之粒子群算法(含代码实例)
- Flutter 抽屉效果
- 淘宝自动回复机器人配置手册——售前模板配置(上)
- 树莓派 魔镜 magicmirror2
- 【ansys workbench】7.装配体分析基本思路讲解
- html格式图片可以转换成word文档,html网页转换成word文档,转换成功,并且可以保存图片,但是总是为web版式的格式,怎么改成“页面”格式,多谢...
- python解常微分方程
- java构建n阶魔方方阵
- Python matplotlib画坐标点并且以文本内容标记