加载补丁dex Tinker采用的是下发差分包,然后在手机端合成全量的dex文件进行加载。 而在build.gradle配置中的tinkerPatch dex.loader = ["com.tencent.tinker.loader.*", "tinker.sample.android.app.SampleApplication 他们两个的区别是TinkerInstaller只有在Tinker.install过之后才能使用,否则会抛出异常。 tinker = Tinker.with(context); libname = libname.startsWith("lib") ? () && tinker.isTinkerLoaded()) { TinkerLoadResult loadResult = tinker.getTinkerLoadResultIfPresent
本系列 Tinker 源码解析基于 Tinker v1.9.12 自动生成TinkerApplication 接入 Tinker 第一步就是改造 Application 。 查看 Tinker 工程可以发现在 tinker-android-anno 下面有一个 AnnotationProcessor @Override public Set<String> { public %APPLICATION%() { super(%TINKER_FLAGS%, "%APPLICATION_LIFE_CYCLE%", "%TINKER_LOADER_CLASS () { super(7, "tinker.sample.android.app.SampleApplicationLike", "com.tencent.tinker.loader.TinkerLoader 那么 Tinker 是什么时候加载的呢?
热卖云产品年终特惠,2核2G轻量应用服务器7.33元/月起,更多上云必备产品助力您轻松上云
——维基百科 本文介绍了Tinker的接入方式,更加详细的内容可以查阅官方文档 介绍 Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新 当然,你也可以使用Tinker来更新你的插件。 Tinker所支持的功能如下 ? 来自官方Github Tinker热补丁方案·不仅支持类、So以及资源的替换,它还是2.X-7.X的全平台支持。 的其他库都无需再引用 provided("com.tencent.tinker:tinker-android-anno:1.7.7") compile("com.tinkerpatch.sdk 的其他库都无需再引用 provided("com.tencent.tinker:tinker-android-anno:1.7.7") compile("com.tinkerpatch.sdk 热修复 Tinker已知的问题: Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件; 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码
国际惯例先贴地址 Tinker开源地址:https://github.com/Tencent/tinker 玩过Dota的童鞋都知道 地精修补匠的大招,我们希望发版本可以像它一样做到无限刷新。 这里有个问题很关键,Tinker的亮点使用了QQ空间插桩的效果来规避Android的校验机制。NUWA分析里面有具体介绍。 /tree/dev/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader ? 2016-10-08 09:51:30屏幕截图.png 从类名可以知道Tinker处理了类的加载,资源的加载以及so库的加载.我们的关注点在类加载上,根据经验判断,TinkerLoader类是类加载模块的入口 由于微信发布的Android_N混合编译与对热补丁影响解析,所以在tinker中完全使用了新的Dex,那样既不出现Art地址错乱的问题,在Dalvik也无须插桩。
本系列 Tinker 源码解析基于 Tinker v1.9.12 前一篇讲到了利用反射执行的是 TinkerLoader.tryLoad 方法 tryLoad @Override public // 检查 tinker 是否开启 if (! 目录,检查目录是否存在 // tinker 获取 tinker 目录,/data/data/tinker.sample.android/tinker File patchDirectoryFile 注意,这里补丁文件的 tinker id 是当前补丁基准包的 tinker id ,也就是有 bug 的基准包 tinker id 。 另外一个 new tinker id 是补丁加载完成后的 tinker id ,就是 bug 修复后的 tinker id 。
基本步骤 1、注册Tinker账号并新建项目 2、配置gradle和代码 3、生成基准包 4、修复Bug 5、生成补丁包 6、发布补丁包 Tinker做了什么 1、1-2步是APP开发的基本步骤,完成1 -3步,那么你的APP就集成了Tinker。 集成Tinker后,Tinker会根据各个版本的配置信息去自动加载补丁。可配置强制更新,也可配置轮询更新。 2、第3步则是保留一个之前版本副本,用于后面生成补丁。为什么要这样做? 一、注册Tinker账号 这个就不说了,Tinker注册和新建项目都好简单,也没有什么需要注意的。 的其他库都无需再引用 annotationProcessor("com.tinkerpatch.tinker:tinker-android-anno:${TINKER_VERSION}")
,官网接入资料:Tinker接入指南 Tinker接入 目前,Tinker提供了两种接入方式,一种是基于命令行的方式,类似于AndFix的接入方式;一种就是gradle的方式。 ) //tinker的核心库 compile('com.tencent.tinker:tinker-android-lib:1.9.1') } ... ... :tinker-android-anno:1.9.1') //Tinker的核心库 compile('com.tencent.tinker:tinker-android-lib:1.9.1 Tinker使用 自定义Tinker封装 为了方便操作了管理,我们还需要自定义对Tinker进行一些简单的封装。 除此之外,Tinker还支持Tinker多渠道打包功能。 “` 附:源码
Tinker的现状 首先在回顾过去之前,我想先简单的介绍一下Tinker的现状。 开源的现状 Tinker的开源地址为:https://github.com/Tencent/tinker。 不仅如此,在应用宝Top 1000的应用中,有60多个应用已经使用了Tinker,使用第三方平台接入Tinker并持续使用的应用也超过1000个。 此外我们也看到有一些基于Tinker衍生的开源项目,例如tinker-dex-dump 、tinker-manager、TinkerPatch等。 五、Oppo/Vivo 异步dex2oat问题 这个问题在Tinker 1.7.6版本发现,并在Tinker 1.7.7版本解决。 微信Tinker的一切都在这里,包括源码(一) Tinker Dexdiff算法解析 ART下的方法内联策略及其对Android热修复方案的影响分析 Tinker MDCC会议 slide DexDiff
本系列 Tinker 源码解析基于 Tinker v1.9.12 前面讲到了 Tinker 安装补丁的流程,现在就详细地来看下 dex 合成的代码。 tryRecoverDexFiles protected static boolean tryRecoverDexFiles(Tinker manager, ShareSecurityCheck checker TinkerLog.w(TAG, "patch recover, extractDiffInternals fail"); return false; } // 把 tinker { directory.mkdirs(); } //I think it is better to extract the raw files from apk Tinker this.patchedDex.writeTo(out); } 而 DexPatchApplier 里面合流操作的代码是需要根据 Tinker 的 DexDiff 算法来的。
前言 Tinker简介 Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。 Tinker已知问题 1) Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件; 2) 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码 Tinker接入指南 2.1. :tinker-android-anno:1.7.7') //tinker的核心库 compile('com.tencent.tinker:tinker-android-lib:1.7.7 //apply tinker插件 apply plugin: 'com.tencent.tinker.patch' tinker参数配置 同样是在项目的app的gradle文件app/build.gradle
Tinker的现状 首先在回顾过去之前,我想先简单的介绍一下Tinker的现状。 开源的现状 Tinker的开源地址为:https://github.com/Tencent/tinker。 不仅如此,在应用宝Top 1000的应用中,有60多个应用已经使用了Tinker,使用第三方平台接入Tinker并持续使用的应用也超过1000个。 ? 此外我们也看到有一些基于Tinker衍生的开源项目,例如tinker-dex-dump 、tinker-manager、TinkerPatch等。 五、Oppo/Vivo 异步dex2oat问题 这个问题在Tinker 1.7.6版本发现,并在Tinker 1.7.7版本解决。 微信热补丁Tinker分享 微信Tinker的一切都在这里,包括源码(一) Tinker Dexdiff算法解析 ART下的方法内联策略及其对Android热修复方案的影响分析 Tinker MDCC
利用Tinker我们不仅可以用做 bugfix,甚至可以替代功能的发布。Tinker已运行在微信的数亿Android设备上。 Tinker原理图 1-2:原理图 Tinker流程图 1-3:Tinker 流程图 二、Tinker相关网站 微信Tinker Patch官网:Tinker Patch Github地址:tinker 三、接入Tinker步骤 基础步骤 注册Tinker账户、添加APP、记录AppKey,添加 APP 版本、 发布补丁。 配置Tinker版本信息 我们使用配置文件去配置Tinker版本信息,易于统一版本和后面更换版本,如图: 2-1 gradle.properties文件 代码如下: TINKER_VERSION=1.9.6 Tinker接入 一次集成使用Tinker热更新的体验 Tinker爬坑之路 Android实战——Tinker的集成和使用
本系列 Tinker 源码解析基于 Tinker v1.9.12 前面讲到了 Tinker 安装补丁的流程,现在就详细地来看下 dex 合成的代码。 tryRecoverDexFiles protected static boolean tryRecoverDexFiles(Tinker manager, ShareSecurityCheck checker TinkerLog.w(TAG, "patch recover, extractDiffInternals fail"); return false; } // 把 tinker this.patchedDex.writeTo(out); } 而 DexPatchApplier 里面合流操作的代码是需要根据 Tinker 的 DexDiff 算法来的。 另外,dodola 写了一篇 Tinker Dexdiff算法解析,有需要的同学可以看下。 那么 dex 合成的流程就到这吧。
看一下接下来的函数调用: public static void onReceiveUpgradePatch(Context context, String patchLocation) { Tinker.with void onHandleIntent(Intent intent) { final Context context = getApplicationContext(); Tinker tinker = Tinker.with(context); tinker.getPatchReporter().onPatchServiceStart(intent);//***** 中实现 public boolean tryPatch(Context context, String tempPatchPath, PatchResult patchResult) { Tinker manager = Tinker.with(context); final File patchFile = new File(tempPatchPath); /
Tinker简单接入 Tinker 是微信官方的 Android 热补丁解决方案,它支持动态下发代码、So 库以及资源,让应用能够在不需要重新安装的情况下实现更新。 添加Tinker插件和库 在root项目根目录的build.gradle下 classpath 'com.tencent.tinker:tinker-patch-gradle-plugin:1.9.1 :tinker-android-lib:1.9.1") { changing = true } annotationProcessor("com.tencent.tinker:tinker-android-anno :tinker-android-anno:1.9.1') compile('com.tencent.tinker:tinker-android-lib:1.9.1') } 2. , TINKER_ID_VALUE' 'NEW_TINKER_ID, NEW_TINKER_ID_VALUE' * package meta file gen. path is
本系列 Tinker 源码解析基于 Tinker v1.9.12 加载dex补丁流程 TinkerDexLoader.loadTinkerJars 判断一下 dexList 和 classLoader 文件都通过的话,加入到 legalFiles 集合中 legalFiles.add(file); } 如果是 art 虚拟机并且是 Android N 及以上的环境,会另外加上 tinker_classN.apk
walle的配置以及对应的结果 本文主要讲了Walle的多渠道打包,更多强大的功能出门左拐 ---- 续Tinker 还不知道什么是Tinker?怎么用? 请看【Android】热修复——Tinker(入门) 请看完以上内容 终于说到Tinker了。刚打完用来发布的渠道包,可是如果要打补丁包的话,好像还少了点什么。用来打补丁包的材料... 一个apk? tinker需要用到的包 有了基包后,就可以打补丁包了。接下来 ? 我要开始装...额...打补丁包了 打补丁包 接下来内容跟上一篇的差不多,就不详细讲了。 明细过程请看【Android】热修复——Tinker(入门) 配置基包 ? 配置基包路径 生成补丁包 ? 印象中,发布的时候应该是可以过滤渠道的,回头我再去看看Tinker的文档。
这么看来,如果选择开源方案,tinker目前是最佳的选择,tinker的介绍有这么一句: Tinker已运行在微信的数亿Android设备上,那么为什么你不使用Tinker呢? 好了,说了这么多,下面来看看tinker如何接入,以及tinker的大致的原理分析。希望通过本文可以实现帮助大家更好的接入tinker,以及去了解tinker的一个大致的原理。 //可选,用于生成application类 provided('com.tencent.tinker:tinker-android-anno:1.7.7') //tinker的核心库 compile 值得注意的是:该例仅展示了基本的接入,对于tinker的各种配置信息,还是需要去读tinker的文档(如果你确定要使用)tinker-wiki。 接下来我们大致看一下tinker的原理。 四、原理 ? 来源于:https://github.com/Tencent/tinker tinker贴了一张大致的原理图。
blocks|entityMap^^^$0|@]|1|@]]
一、多渠道打包 tinker官方文档推荐用walle或者packer-ng-plugin来辅助打渠道包。 发布补丁包 回到Tinker后台,选中我们开始新建的项目,补丁下发->添加APP版本。然后上传刚刚的patch_signed_7zip.apk。 当我们在正式环境需要混淆代码:设置 minifyEnabled true,添加混淆: -keep public class * implements com.tencent.tinker.loader.app.ApplicationLike ---- 到这里Tinker的多渠道集成成功。
扫码关注腾讯云开发者
领取腾讯云代金券