Tinker热更新与AndResGuard资源混淆的结合
Tinker的配置
目前公司项目中使用Tinker作为热更新方案,由于Bugly的热更新是基于Tinker,并且提供了补丁的自动下载、合成、应用的功能以及补丁管理后台,所以集成了Bugly的热更新修复,关于Bugly热更新的集成,可以参考我之前发布的一篇文章:
Android热更新初探,Bugly热更新的集成和使用(让你的应用轻松具备热更新能力)
Tinker的配置划分在tinker-support.gradle文件中,相关的配置在后面的demo中会给出。
AndResGuard的配置
关于AndResGuard的介绍和集成,可以参考我之前发布的一篇文章:
APP瘦身大法–AndResGuard的使用
AndResGuard的配置划分在and_res_guard.gradle文件中,相关的配置在后面的demo中会给出。
Tinker与AndResGuard的结合
由于现在Tinker和AndResGuard是分开配置,还没有进行结合。此时使用Tinker生成的基准包、打出来的补丁,资源并没有进行混淆;如果使用AndResGuard生成apk,资源是混淆过的,当出现bug时,使用Tinker生成补丁,由于补丁中的资源文件没有进行过混淆,所以合成补丁的时候会失败。
所以现在的思路是:
当使用resguardRelease打包后,将生成的混淆过的apk文件、mapping文件、R文件和resouce_mapping文件拷贝到"${buildDir}/bakApk/resguard-MM-dd-HH-mm-ss" 目录下;若是待上线的新版本,则该目录为基准包备份目录,需要将其保存,当需要打补丁的时候,该目录下的文件需要用到。
当使用tinkerPatchRelease生成补丁前,加入resguardTask任务,这样生成补丁时,使用到的新旧Apk都是资源混淆过的,生成的补丁的资源也是混淆过的,此时,合成补丁的时候,就可以成功了。
主要的配置:
def bakPath(){return file("${buildDir}/bakApk/")
}/*** 此处填写每次构建生成的基准包目录*/
def baseApkDir(){return "resguard-0119-11-29-43"
}def detailedBuildTime() {return new Date().format("MMdd-HH-mm-ss", TimeZone.getTimeZone("GMT+8"))
}def appName(){return "${project.getName()}"
}android {... //省略/*** bak apk and mapping*/android.applicationVariants.all { variant ->/*** task type, you want to bak*/def taskName = variant.nametasks.all {if (variant.buildType.name == 'release') {def andResDir = "${buildDir}/outputs/apk/${taskName}/AndResGuard_${project.getName()}-${taskName}";if ("tinkerPatch${taskName.capitalize()}".equalsIgnoreCase(it.name)) {// find resguard taskdef resguardTasktasks.all {if (it.name.startsWith("resguard${taskName.capitalize()}")) {resguardTask = it}}it.doFirst({// change build apk pathit.buildApkPath = "${andResDir}/${project.getName()}-${taskName}_aligned_signed.apk"})// change task dependence to resguard taskit.dependsOn resguardTask}if ("resguard${taskName.capitalize()}".equalsIgnoreCase(it.name)) {it.doLast {copy {def outDir = file("${bakPath()}/resguard-${detailedBuildTime()}")from "${andResDir}/${project.getName()}-${taskName}_aligned_signed.apk"into outDirrename { String fileName ->fileName.replace("${project.getName()}-${taskName}_aligned_signed.apk", "${appName()}.apk")}from "${buildDir}/outputs/mapping/${taskName}/mapping.txt"into outDirrename { String fileName ->fileName.replace("mapping.txt", "${appName()}-mapping.txt")}from "${buildDir}/intermediates/symbols/${taskName}/R.txt"into outDirrename { String fileName ->fileName.replace("R.txt", "${appName()}-R.txt")}from "${andResDir}/resource_mapping_${project.getName()}-release.txt"into outDirrename { String fileName ->fileName.replace("resource_mapping_${project.getName()}-release.txt", "${appName()}-resource_mapping.txt")}}}}}}}
}
主要是tasks.all { }中的代码,判断如果执行的是release类型的指令,则需要进行处理。
if (variant.buildType.name == 'release') {//是release指令,进行相关处理
}
如果是执行tinkerPatchRelease任务,即打补丁,在打补丁之前,需要先调用reguardTask,代码中有" it.dependsOn resguardTask",即该命令依赖于resguardTask,需要先执行resguardTask任务。
if (variant.buildType.name == 'release') {def andResDir = "${buildDir}/outputs/apk/${taskName}/AndResGuard_${project.getName()}-${taskName}";if ("tinkerPatch${taskName.capitalize()}".equalsIgnoreCase(it.name)) {// find resguard taskdef resguardTasktasks.all {if (it.name.startsWith("resguard${taskName.capitalize()}")) {resguardTask = it}}it.doFirst({// change build apk pathit.buildApkPath = "${andResDir}/${project.getName()}-${taskName}_aligned_signed.apk"})// change task dependence to resguard taskit.dependsOn resguardTask}
}
如果是执行reguardRelease任务,则需要执行备份操作,将混淆过的apk、mapping.txt、R.txt、resource_mapping.txt备份到app目录下的/build/bakApk/reguard-MMdd-HH-mm-ss/目录下:
if ("resguard${taskName.capitalize()}".equalsIgnoreCase(it.name)) {it.doLast {copy {def outDir = file("${bakPath()}/resguard-${detailedBuildTime()}")from "${andResDir}/${project.getName()}-${taskName}_aligned_signed.apk"into outDirrename { String fileName ->fileName.replace("${project.getName()}-${taskName}_aligned_signed.apk", "${appName()}.apk")}...}}}
即将下图四个文件复制:
存放在/bakApk/reguard-MMdd-HH-mm-ss/目录下
总结
一、打包
上线前,先执行reguardRelease任务,打出资源混淆过的Apk,生成在备份目录/bakApk/reguard-MM-dd-HH-mm-ss/目录中,同时,需要将该文件夹备份,作为下次热更新的基准包;
二、打补丁
上线后,若出现bug,需要打补丁:
1.在修复完bug的时候,先执行reguardRelease任务,生成新的进行过资源混淆的apk;
2.将备份好的基准包放置在app模块下的/build/bakApk/目录下,修改app模块下build.gradle中基准包目录,如下:
/*** 此处填写每次构建生成的基准包目录*/
def baseApkDir(){return "resguard-0119-11-29-43"
}
然后执行tinkerPatchRelease任务,生成补丁:
3.找到patch目录下的补丁包,登录bugly后台,上传补丁
到这里结合Tinker和AndResGuard的介绍就完了,依旧会提供我写的demo,如果有不清楚的地方可以参考下,如果遇到什么问题,可以在评论区留言:
https://github.com/chaychan/TinkerAndResGuardDemo
Tinker热更新与AndResGuard资源混淆的结合相关推荐
- 微信AndResGuard资源混淆知识点巩固
git: https://github.com/shwenzhang/AndResGuard 本来想自己研究资源混淆的工具的,开始看到美团的方案说修改aapt可以达到目的,可是问题来了,搞了很久aap ...
- Unity GameFramework-打包和热更新模块(Resources资源)
#Unity GameFrameWork框架- Resources模块 之前的文章可能都太老了,现在已经没有Update分支了,热更新相关逻辑已经合并到主干了,验证的逻辑均来自E大的StartForc ...
- 求助:Tinker热更新配置,平台识别失败(问题原因已找到,特此记录)
一.我的项目配置是这样的: 1.app的gradle配置: dependencies {implementation 'androidx.appcompat:appcompat:1.1.0'imple ...
- walle多渠道打包+Tinker(bugly)热更新集成+360加固(乐固)
这三个东东是干啥的相信大家都有所耳闻了,如果你没有听说过,请出门左拐,百度一下你就知道.这里不对这三个东东具体的集成方式做详细的介绍,因为官方文档已经写的很详细了,主要是对同时使用这三个东东时所需要注 ...
- Android热更新Tinker + 多渠道打包 + 加固的流程详解
一.Tinker热修复 关于热修复的作用,不用多说了,一句话概括就是通过让用户无感的方式来修复线上应用的bug.这里介绍的是微信Tinker. 下面的接入方式都是参考自Tinker官方文档来.我这里主 ...
- Bugly Android热更新总结篇
AndroidManifest文件 新增四大组件 关于Tinker的能力,大家可以移步看下Tinker Wiki. 开发者为什么这么热衷于热更新? 热更新解决了开发者的一个痛点就是程序逻辑出现bug了 ...
- Android热更新五:四大热修复方案对比分析
很早之前就想深入的研究和学习一下热修复,由于时间的原因一直拖着,现在才执笔弄起来. Android而更新系列: Android热更新一:JAVA的类加载机制 Android热更新二:理解Java反射 ...
- Lua------------------unity与lua的热更新
[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读 标签: 游戏开发游戏解决方案用户体验unity3d 2014-10-18 23:23 7680人阅读 ...
- flutter不支持热更新_Flutter 在安卓上可以实现热更新了
本文由 句号君 授权投稿 原文链接:https://blog.csdn.net/qizewei123/article/details/102963340 Flutter 官方在 GitHub 上声明是 ...
最新文章
- java 为什么需要常量池
- 通过微软的cors类库,让ASP.NET Web API 支持 CORS
- Asp.net中的web.config配置
- 为了杀蚊子,他用树莓派DIY了一把激光枪!
- scipy.signal.find_peaks(峰值检测)
- 转载! 一图读懂 SignalR
- python3 asyncio 不阻塞_Python中的并发处理之asyncio包使用的详解
- php转到qq并分享,php怎么实现qq分享
- 传智播客总裁黎活明“传智专修学院成立暨揭牌仪式”演讲实录
- 河狸家半年值10亿是因为重度垂直
- 信用卡债务属于共同债务吗
- 土旦:关于display:flex碰上white-space nowrap 影响布局的问题
- Asciinema - 终端日志记录神器,机器学习开发者的福音
- 智能数据构建与管理(Dataphin)-资产全景
- linux内核和发行版本的关系,简述Linux内核和Linux发行版的区别
- 4.murmur连接超时
- RL(Chapter 5): Blackjack (二十一点)
- 空间统计说历史:罗马七丘的空间分析(一)
- TSA-Net论文详解
- putty 串口暂停_win7系统中使用putty串口设置超级终端的方法
热门文章
- Ajax请求URL的写法
- flex布局小案例——制作骰子
- 中文转换为日文的几点注意事项
- 归一法的计算方法讲解_初三化学计算题中归一法,XY法,拆分法,分配法,K值法是怎样的,最好有具体的例子...
- 革新科技的TI+ST+XILINX嵌入式异构多核开发平台教育市场应用
- 传统弓上弦的几种方式
- zhengyang:全面了解风控决策引擎
- 联想计算机怎么添加打印机,电脑和联想打印机连接不上怎么办啊
- Greenplum查看表/库大小、进程、表膨胀处理(sql语句)
- 解决python利用openpyxl读取excel中公式结果值的问题