热更新,热修复
鸿洋大神博客: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