热更新,热修复

2017-03-19  本文已影响0人  zzyytt

鸿洋大神博客:http://blog.csdn.net/lmj623565791/article/list/1

(不止有热更新tinker,还有像ui卡顿、基于编译时注解等好文章)

热更新相关:

http://www.jianshu.com/p/c12063b41aa2

1、Bugly集成了Tinker

bugly官网

https://beta.bugly.qq.com/apps/a51b65d9d4/hotfix?pid=1

https://bugly.qq.com/v2/downloads

https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20170307182353

https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix-demo/

注意问题,

1、项目中引入bugly会与instant run冲突,处理方法

1、将之前MyApplication的内容全部移到MyApplicationLike中

2、平时进行开发、bug调试,可以gradle下的apply from: 'tinker-support.gradle'注释掉

这样就可以启用instant run功能

3、正式生成apk或者生成补丁patch时,把apply from: 'tinker-support.gradle',

同时关闭instant run功能

http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=2865

2、每次发布一个版本后一定要将基准包apk、maping.txt、R.txt保存下来

因为把gradle下的apply from: 'tinker-support.gradle'注释掉后,

tinker-support.gradle下编写的bakApka路径将会消失,里面的内容也会清空

所以一定要将基准包内容拷贝出来,最好把整个目录拷贝出来,bakApka\app-0313-11-35-21\...

当修复完bug后,需要生成补丁包,在把整个目录拷贝到build文件夹下

3、另外注意,第二级路径def baseApkDir = "app-0310-18-47-32",这个命名并没有起到作用

每次生成都是当前时间app-月日-时-分-秒,所以这个目录名也得保留下来,生成补丁时,直接

指定这个目录,比如

baseApk = "${bakPath}/app-0310-19-22-22/app-debug.apk"

baseApkProguardMapping = "${bakPath}/app-0310-19-02-02/patch_app-release-mapping.txt"(这个文件,有时候没有生成,不知为何)

baseApkResourceMapping = "${bakPath}/app-0310-19-22-22/app-debug-R.txt"

tinkerId = "patch1-1.0.1"

其他网址:

http://www.jianshu.com/p/c12063b41aa2

http://www.jianshu.com/p/5a31480286ab

http://www.jianshu.com/p/2dda80c2cdfe

2、Tinker(微信使用)

github官网:

https://github.com/Tencent/tinker

https://github.com/Tencent/tinker/wiki(wiki)

http://tinkerpatch.com/Docs/intro(文档)

http://blog.csdn.net/tyk9999tyk/article/details/53391519(常见问题)

原理、源码

1、基础概念

1、java基础概念

.java,  .class,  ClassLoader,  jvm

.java文件---编译---.class文件(字节码)---ClassLoader加载.class文件---jvm(解释并执行,实现跨平台)

http://www.jianshu.com/p/29efb9a9b008(里面有讲解了反射)

2、Android基础概念

.dex  BaseDexClassLoader等

.java文件---编译---.class文件(字节码)---合并、优化---一个或多个.dex文件(主要看有没有进行dex分包处理)

---BaseDexClassLoader(以及下方的DexClassLoader、PathClassLoader等)---原始的dex生成相应的优化后的odex文件

---ART或Dalvik虚拟机上运行

http://www.jianshu.com/p/a620e368389a

http://www.blogfshare.com/dex-format.html

http://www.jianshu.com/p/2d32f2343f8f

http://www.jianshu.com/p/86fba19d80c8

3、dex分包

http://www.jianshu.com/p/a67a560903fa

2、原理、源码

关键字:dex分包、dexElements、classes.dex和classes1.dex中有重复的类、old dex、new dex、diff算法、生成patch文件

https://github.com/Tencent/tinker(下方的图)

http://blog.csdn.net/lmj623565791/article/details/54882693(有对上面网址中的图作解释,原理整体流程)

http://blog.csdn.net/lmj623565791/article/details/60874334(diff算法、生成patch文件)

对改图的整体理解:

tinker将old.apk和new.apk做了diff,拿到patch.dex,然后将patch.dex与本机中apk的classes.dex做了合并,生成新的classes.dex,运行时通过反射将合并后的dex文件放置在加载的dexElements数组的前面。

运行时替代的原理,其实和Qzone的方案差不多,都是去反射修改dexElements。

两者的差异是:Qzone是直接将patch.dex插到数组的前面;而tinker是将patch.dex与app中的classes.dex合并后的全量dex插在数组的前面。

tinker这么做的目的还是因为Qzone方案中提到的CLASS_ISPREVERIFIED的解决方案存在问题;而tinker相当于换个思路解决了该问题。

以下是QQZone的解决方案,出现的CLASS_ISPREVERIFIED问题,tinker解决的这个问题采用了另外的方法,参考上面的网址

https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731290eef12ad0d17f39d4a&scene=1&srcid=1106Imu9ZgwybID13e7y2nEi#wechat_redirect

http://blog.csdn.net/lmj623565791/article/details/49883661

上一篇下一篇

猜你喜欢

热点阅读