增量升级,热更新/动态部署- 如微信 Tinker研究与集成(差分算法)
阅读原文时间:2021年04月20日阅读:1

  热更新、热修复、增量升级、热补丁等。
  动态部署的方案被提了出来,比如iOS下的JSPatch, waxPatch,Android下的Dexpose, AndFix, ClassLoader,都是比较成熟Hot Patch动态部署解决方案。这些方案的思路都是通过下载远程服务器的代码来动态更新本地的代码行为。
 React-Native则属于另一种动态部署的方案,其核心原理在于通过JavaScript来调用本地组件进行界面的渲染。
 HotPatch-EMC的架构主要目标在于解决移动APP的稳定性问题。通过RN与Native的主备,可以减少系统APP出错带来的失误。

iOS 动态更新方案 JSPatch 与 React Native 的对比:http://geek.csdn.net/news/detail/95458
差分算法和Patch包- https://github.com/hongyangAndroid/BsDiff_And_Patch
二进制比较工具开源- http://www.daemonology.net/bsdiff/ 
  由于java本身并没有提供相应的api,我们需要C去帮助实现,然后生成.so包进行调用。相对于生成差异包的bsdiff,也给提供了另一个bspatch。 差异包示例: https://github.com/JackCho/AndroidPatchUpdate

> 热更新方案
腾       讯:微信开源(Tinker),Bugly热更新SDK,QZone 的超级热补丁方案
大众点评:Nuwa  , 
阿里巴巴:淘宝的 Dexposed、支付宝的 AndFix
美       团:Robust
Google   :热补丁技术实现 Instant Run,分为 Hot Swap、Warm Swap 与 Cold Swap 三种方式;Multidex方案 .

-- Android APP增量升级的实现方式- http://www.2cto.com/kf/201402/276811.html
你的apk已经发布了3个版,1.0,2.0,3.0,这时候你要在后台发布4.0,在你上传时,就应该生成 :
 1.0——>4.0的差异包; 
 2.0——>4.0的差异包; 
 3.0——>4.0的差异包; 

> dex文件,类的加载,Class文件分析
一步步手动实现热修复(一)-dex文件的生成与加载- http://blog.csdn.net/sahadev_/article/details/53318251
一步步手动实现热修复(二)-类的加载机制简要介绍- http://blog.csdn.net/sahadev_/article/details/53334911
一步步手动实现热修复(三)-Class文件的替换- http://blog.csdn.net/sahadev_/article/details/53363052
 
> 增量升级、热补丁,Lua语言实现增量升级
Android7.0增量更新完整方案及踩坑之旅-https://mp.weixin.qq.com/s?__biz=MzI3OTU0MzI4MQ==&mid=100000851&idx=1&sn=00f1ac2039813d99006ace3f8d3c0852&chksm=6b4768cd5c30e1db32892756ed454b83faaec9bf66a357bf10d919b260bf807578cb78085264#rd?ref=myread
Android实现应用的增量更新\升级- http://blog.csdn.net/yyh352091626/article/details/50579859
漫谈Android 增量更新- http://blog.csdn.net/dd864140130/article/details/52928419
Android apk增量升级- http://blog.csdn.net/sbsujjbcy/article/details/46237637
Android实现应用的增量更新\升级-- http://blog.csdn.net/yyh352091626/article/details/50579859
增量更新IncrementallyUpdate-- https://github.com/smuyyh/IncrementallyUpdate
Android高级之十三讲-HotFix、热加载和增量更新- http://blog.csdn.net/reboot123/article/details/53641127
Android应用市场省流量更新(增量升级)原理解析- http://blog.csdn.net/jiangwei0910410003/article/details/53227940
Android应用增量更新 - Smart App Updates:https://github.com/cundong/SmartAppUpdates
浅析android应用增量升级- http://blog.csdn.net/hmg25/article/details/8100896
quick-cocos2d-x基于源码加密打包功能的更新策略(1)- http://my.oschina.net/SunLightJuly/blog/180639
最轻巧的跨平台插件化框架- github.com/wequick/Small/
Android应用市场省流量更新(增量升级)原理解析- http://blog.csdn.net/jiangwei0910410003/article/details/53227940
Android 增量更新完全解析 是增量不是热修复-- http://blog.csdn.net/lmj623565791/article/details/52761658

> 微信 Android Tinker热补丁- 集成与原理

 Tinker 是微信官方开源的 Android 热修复框架,支持在无需升级APK的前提下更新 dex, library and resources 文件。

微信 Tinker 负责人张绍文关于 Android 热修复直播分享记录-http://blog.csdn.net/offbye/article/details/52188937
微信 Android 热补丁实践演进之路: http://www.csdn.net/article/a/2016-06-30/15839140
Android 热修复 Tinker接入及源码浅析- https://blog.csdn.net/lmj623565791/article/details/54882693
Android 热修复 Tinker 源码分析之DexDiff/DexPatch- https://blog.csdn.net/lmj623565791/article/details/60874334
Tinker源码:https://github.com/Tencent/tinker
Tinker demo- https://github.com/Tencent/tinker/tree/master/tinker-sample-android

Android热更新开源项目Tinker源码解析系列之一:Dex热更新- http://www.cnblogs.com/yyangblog/p/6249715.html
Android热更新开源项目Tinker源码解析系列之二:资源文件热更新- http://www.cnblogs.com/yyangblog/p/6252490.html
Android热更新开源项目Tinker源码解析系列之三:so热更新- http://www.cnblogs.com/yyangblog/p/6252855.html
Android热更新开源项目Tinker集成实践总结- http://www.cnblogs.com/yyangblog/p/6268818.html

-- Tinker 常见问题- http://blog.csdn.net/tyk9999tyk/article/details/53391519
微信热修复 Tinker 的集成和使用(Tinker_id的问题)- http://blog.csdn.net/u010983881/article/details/53196574
  在运行过程中,我们需要验证基准apk包的tinkerId是否等于补丁包的tinkerId。这个是决定补丁包能运行在哪些基准包上面,一般来说我们可以使用Git版本号、versionName等等。
  想一下,在非强制升级的情况下,线上一般分布着各个版本的app。但是。你打patch肯定是对应某个版本,所以你要保证这个patch下发下去只影响对应的版本,不会对其他版本造成影响,所以你需要tinkerId与具体的版本相对应。

- Tinker存在的问题,由于原理与系统限制,Tinker有以下已知问题:
 1.Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件;
 2.由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
 3.在Android N上,补丁对应用启动时间有轻微的影响;
 4.不支持部分三星android-21机型,加载补丁时会主动抛出   "TinkerRuntimeException:checkDexInstall failed";
 5.由于各个厂商的加固实现并不一致,在1.7.6以及之后的版本,tinker不再支持加固的动态更新;
 6.对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。
 7.APP加载差异包时会杀死APP进程,需要手动重启

-- 热更新Tinker与Qzone的原理分析:优势和不足
  Qzone是直接将patch.dex插到数组的前面;
  而tinker是将patch.dex与app中的classes.dex合并后的全量dex插在数组的前面。tinker将old.apk和new.apk做了diff,拿到patch.dex,然后将patch.dex与本机中apk的classes.dex做了合并,生成新的classes.dex,运行时通过反射将合并后的dex文件放置在加载的dexElements数组的前面。
  tinker有个非常大的亮点就是自研发了一套dex diff、patch相关算法。(Dexdiff算法,关于diff算法,差分算法).

- Tinker优势:
 1.合成整包,不用在构造函数插入代码,防止verify,verify和opt在编译期间就已经完成,不会在运行期间进行
 2.性能提高。兼容性和稳定性比较高。
 3.开发者透明,不需要对包进行额外处理。

-- Tinker优势和不足
 Tinker支持dex热更新,res资源热更新,so热更新:
  1.ApkFilesVisitor的visitFile函数中,对于dex类型的文件,调用dexDecoder进行patch操作;
  2.对于so类型的文件,使用soDecoder进行patch操作;
  3.对于Res类型文件,使用resDecoder进行操作。
- Tinker不足:
 1.与QQ超级补丁技术一样,不支持即时生效,必须通过重启应用的方式才能生效。
 2.需要给应用开启新的进程才能进行合并,并且很容易因为内存消耗等原因合并失败。
 3.合并时占用额外磁盘空间,对于多DEX的应用来说,如果修改了多个DEX文件,就需要下发多个patch.dex与对应的classes.dex进行合并操作时这种情况会更严重,因此合并过程的失败率也会更高。

-- Tinker集成及步骤
Tinker开启instant run mode后 差异包可能会比较大些,Studio如何关闭instant run mode?
tinker接入指南:https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97

1.配置好Tinker的一些环境和参数。
  热修复框架Tinker的从0到集成之路- http://blog.csdn.net/lisdye2/article/details/54411727
2.Studio生成正式包:在Studio左下方的Build Variants中的面板中将debug改为release
3.生成正式包后,将app\build\bakApk目录下的文件名改为app Gradle中ext{}配置的文件名
4.如何生成补丁包:在Studio的右上方Gradle中,打开tinker,双击tinkerPatchRelease
  在app\build\outputs\tinkerPatch\release目录下找到相应的包
5.服务器管理和分发补丁包,Tinker加载补丁包
// 加载补丁包
 TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), "/sdcard/mdtinker.apk");
 将 app\build\outputs\tinkerPatch\release目录下的patch_signed_7zip.apk改为app_patch.apk,并将app_patch.apk包放到/sdcard/app_patch.apk目录下
6.打开App,App会重启,即可看到效果。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章