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 自动加固、打渠道包并上传服务器相关推荐

  1. HTML5调用本地摄像头画面,拍照,上传服务器

    实现功能和适用业务 采集本地摄像头获取摄像头画面,拍照保存,上传服务器: 前端上传图片处理,展示,缩小,裁剪,上传服务器 实现步骤 调取本地摄像头(getUserMedia)/上传图片,将图片/视频显 ...

  2. Android编译及编译脚本、Android构建基础学习笔记

    Android编译及编译脚本.Android构建基础学习笔记 Android编译及编译脚本 概述 Android.mk转换成Android.bp 例子(简单Android.mk文件转Android.b ...

  3. android运行python脚本,在android应用程序中运行python脚本

    我想得到远程安装软件的列表电脑.为了我想在我的android中使用python脚本申请.现在,我有一个python脚本,它正在远程获取已安装软件的列表电脑.但是,我不知道如何在android中支持它. ...

  4. Android实时监听短信并上传服务器

    短信监听 Android监听手机短信的方法有两种,分别为: 1.接受系统的短信广播:当手机收到新消息时,会发送一条广播,通过该广播就可以获取短信内容: 2.监听短信数据库:利用观察者模式监听短信数据库 ...

  5. 优化Recorder H5录音:可边录边转码上传服务器,支持微信提供Android IOS Hybrid App源码

    文章目录 一.Recorder H5录音库的特性 (1)浏览器支持 (2)功能支持 二.使用预览截图 (1)移动端H5 (2)IOS Hybrid App (3)Android Hybrid App ...

  6. python登录交换机执行命令_利用Python脚本登录交换机实现自动配置备份的方法

    主机参考:服务器测评参考推荐网,专注分享服务器优惠信息!如果您想在本站投放您的广告,点此直达!如果您不想付费,您也可以免费投稿您的产品信息,点此直达!联系我们 部分文章发布时间较久远,可能存在未知因素 ...

  7. Android图片压缩(质量压缩和尺寸压缩)Bitmap转成字符串上传

    在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手 ...

  8. python脚本连接交换机,自动执行命令。

    python脚本连接交换机,自动执行命令. python脚本连接交换机,自动执行命令,查询交换机端口的学习mac地址,自动写入txt中.设置定时器,每xx秒执行一次,自动对比上次返回结果,TXT中保存 ...

  9. pyaudio:基于pyaudio利用Python编程从电脑端录制音频保存到指定文件夹+将录音上传服务器+录音进行识别并转为文本保存

    pyaudio:基于pyaudio利用Python编程从电脑端录制音频保存到指定文件夹+将录音上传服务器+录音进行识别并转为文本保存 目录 输出结果 代码实现 输出结果 代码实现 # -*- codi ...

最新文章

  1. OpenCV-Python 彩色图像均衡化与规定化
  2. linux服务器secureCRT RSA登录配置
  3. orm的理解_ORM仇恨者无法理解
  4. NuGet的使用、部署、搭建私有服务
  5. linux java jdk配置_Linux环境下安装JDK并配置环境变量
  6. xy的跨浏览器在线编辑器超级简易版
  7. Acrobat DC安装教程
  8. 基于Python的淘宝用户行为分析
  9. 【强化学习入门】人工智能、深度学习理论框架以及学习资料
  10. Bootstrap文字排版方面css实用类
  11. obs推流视频比特率_我如何使用OBS和WebSockets流视频
  12. 名帖116 文徵明 小楷《离骚经》
  13. 教你如何创建一个免费的网站
  14. 【C++】由于找不到xxx.dll,无法继续执行代码,重新安装程序可能会解决此问题。(解决办法)
  15. php去除首尾符号,PHP如何去除头尾字符
  16. 计算机通电后 不能正常启动,我的电脑通电后不能马上启动?为什么啊?怎么办
  17. numpy的文件存储 .npy .npz 文件
  18. 归并排序【算法解析,代码模板】
  19. 计算机专业培训策划案,电脑培训策划书
  20. android 动画制作小软件GifMaker

热门文章

  1. 关于WebView加载H5页面下载文件和下载完毕后自动打开文件
  2. Python之粒子群算法(含代码实例)
  3. Flutter 抽屉效果
  4. 淘宝自动回复机器人配置手册——售前模板配置(上)
  5. 树莓派 魔镜 magicmirror2
  6. 【ansys workbench】7.装配体分析基本思路讲解
  7. html格式图片可以转换成word文档,html网页转换成word文档,转换成功,并且可以保存图片,但是总是为web版式的格式,怎么改成“页面”格式,多谢...
  8. python解常微分方程
  9. java构建n阶魔方方阵
  10. Python matplotlib画坐标点并且以文本内容标记