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资源混淆的结合相关推荐

  1. 微信AndResGuard资源混淆知识点巩固

    git: https://github.com/shwenzhang/AndResGuard 本来想自己研究资源混淆的工具的,开始看到美团的方案说修改aapt可以达到目的,可是问题来了,搞了很久aap ...

  2. Unity GameFramework-打包和热更新模块(Resources资源)

    #Unity GameFrameWork框架- Resources模块 之前的文章可能都太老了,现在已经没有Update分支了,热更新相关逻辑已经合并到主干了,验证的逻辑均来自E大的StartForc ...

  3. 求助:Tinker热更新配置,平台识别失败(问题原因已找到,特此记录)

    一.我的项目配置是这样的: 1.app的gradle配置: dependencies {implementation 'androidx.appcompat:appcompat:1.1.0'imple ...

  4. walle多渠道打包+Tinker(bugly)热更新集成+360加固(乐固)

    这三个东东是干啥的相信大家都有所耳闻了,如果你没有听说过,请出门左拐,百度一下你就知道.这里不对这三个东东具体的集成方式做详细的介绍,因为官方文档已经写的很详细了,主要是对同时使用这三个东东时所需要注 ...

  5. Android热更新Tinker + 多渠道打包 + 加固的流程详解

    一.Tinker热修复 关于热修复的作用,不用多说了,一句话概括就是通过让用户无感的方式来修复线上应用的bug.这里介绍的是微信Tinker. 下面的接入方式都是参考自Tinker官方文档来.我这里主 ...

  6. Bugly Android热更新总结篇

    AndroidManifest文件 新增四大组件 关于Tinker的能力,大家可以移步看下Tinker Wiki. 开发者为什么这么热衷于热更新? 热更新解决了开发者的一个痛点就是程序逻辑出现bug了 ...

  7. Android热更新五:四大热修复方案对比分析

    很早之前就想深入的研究和学习一下热修复,由于时间的原因一直拖着,现在才执笔弄起来. Android而更新系列: Android热更新一:JAVA的类加载机制 Android热更新二:理解Java反射 ...

  8. Lua------------------unity与lua的热更新

    [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读 标签: 游戏开发游戏解决方案用户体验unity3d 2014-10-18 23:23 7680人阅读 ...

  9. flutter不支持热更新_Flutter 在安卓上可以实现热更新了

    本文由 句号君 授权投稿 原文链接:https://blog.csdn.net/qizewei123/article/details/102963340 Flutter 官方在 GitHub 上声明是 ...

最新文章

  1. java 为什么需要常量池
  2. 通过微软的cors类库,让ASP.NET Web API 支持 CORS
  3. Asp.net中的web.config配置
  4. 为了杀蚊子,他用树莓派DIY了一把激光枪!
  5. scipy.signal.find_peaks(峰值检测)
  6. 转载! 一图读懂 SignalR
  7. python3 asyncio 不阻塞_Python中的并发处理之asyncio包使用的详解
  8. php转到qq并分享,php怎么实现qq分享
  9. 传智播客总裁黎活明“传智专修学院成立暨揭牌仪式”演讲实录
  10. 河狸家半年值10亿是因为重度垂直
  11. 信用卡债务属于共同债务吗
  12. 土旦:关于display:flex碰上white-space nowrap 影响布局的问题
  13. Asciinema - 终端日志记录神器,机器学习开发者的福音
  14. 智能数据构建与管理(Dataphin)-资产全景
  15. linux内核和发行版本的关系,简述Linux内核和Linux发行版的区别
  16. 4.murmur连接超时
  17. RL(Chapter 5): Blackjack (二十一点)
  18. 空间统计说历史:罗马七丘的空间分析(一)
  19. TSA-Net论文详解
  20. putty 串口暂停_win7系统中使用putty串口设置超级终端的方法

热门文章

  1. Ajax请求URL的写法
  2. flex布局小案例——制作骰子
  3. 中文转换为日文的几点注意事项
  4. 归一法的计算方法讲解_初三化学计算题中归一法,XY法,拆分法,分配法,K值法是怎样的,最好有具体的例子...
  5. 革新科技的TI+ST+XILINX嵌入式异构多核开发平台教育市场应用
  6. 传统弓上弦的几种方式
  7. zhengyang:全面了解风控决策引擎
  8. 联想计算机怎么添加打印机,电脑和联想打印机连接不上怎么办啊
  9. Greenplum查看表/库大小、进程、表膨胀处理(sql语句)
  10. 解决python利用openpyxl读取excel中公式结果值的问题