美文网首页
热更新,热修复

热更新,热修复

作者: zzyytt | 来源:发表于2017-03-19 22:43 被阅读0次

    鸿洋大神博客: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

    相关文章

      网友评论

          本文标题:热更新,热修复

          本文链接:https://www.haomeiwen.com/subject/sfgvnttx.html