热修复(一)

原理

java文件打包成apk后其实就是apk里的一个个dex文件。
当一个apk出现多个dex文件后,需要把dex文件塞入到app的classloader之中。如果class.dex和class1.dex中有一个类是重复的,系统其实并不会报异常,依然正常运行。那系统会选择加载哪个类呢?它会选择排在前面dex的类。
让我们来看看类加载的代码:

image.png
image.png

当找类的时候,会按顺序遍历dex文件,然后从当前遍历的dex文件中找类,如果找到类则返回,如果找不到从下一个dex文件继续查找。
在此基础上,构想了热修复的方案:把有问题的类打包到一个dex(patch.dex)中去,然后把该dex插入到Element的最前面。
如下图:

image.png

但是存在一个问题:当我们修改某个类,然后打包成dex,插入到classloader,当加载类的时候,出现了异常。
为什么出现异常?
ModuleManager引用了QzoneActivityManager,但是发现这这两个类所在的dex不在一起,其中:

  1. ModuleManager在classes.dex中
  2. QzoneActivityManager在patch.dex中
    结果发生了错误。
    那么如何让不在同一个dex中的两个类,即使存在引用关系,也不崩溃呢?
    不进行dex校验~
    怎么才会不做dex校验呢?就是不要被打上CLASS_ISPREVERIFIED标志。
    具体实现:就是在所有类的构造函数中插入一段代码,具体如下
    if (ClassVerifier.PREVENT_VERIFY) {
    System.out.println(AntilazyLoad.class);
    }
image.png

只要类A没有被打上CLASS_ISPREVERIFIED标志,那么即使Antilazyload这个类在不同的dex中,也不会出现问题。

在虚拟机启动的时候,当verify选项被打开的时候,如果static方法、private方法、构造函数等,其中的直接引用(第一层关系)到的类都在同一个dex文件中,那么该类就会被打上CLASS_ISPREVERIFIED标志。
那么,我们要做的就是,阻止该类打上CLASS_ISPREVERIFIED的标志。
注意下,是阻止引用者的类,也就是说,假设你的app里面有个类叫做LoadBugClass,再其内部引用了BugClass。发布过程中发现BugClass有编写错误,那么想要发布一个新的BugClass类,那么你就要阻止LoadBugClass这个类打上CLASS_ISPREVERIFIED的标志。

让LoadBugClass在构造方法中,去引用别的dex文件,比如:hack.dex中的某个类即可。

Application作为应用的入口不能插入这段代码(构造函数)。
因为hack.dex是在onCreate中执行的,如果插入上述代码,会出现找不到Antilazyload。

QQ空间使用的是字节码插入代码的方式,并不是源代码插入,借助了库javaassist进行字节码插入。

QQ空间如何打补丁包

1.当正式版本发布之后,会生成一个缓存文件,缓存文件中有所有class的md5以及mapping混淆文件
2.在后续版本使用了apply-mapping选项,正式版本的mapping文件,md5文件和上个版本进行比较,这样就可以把不同的class打包成dex了。

插件化是什么

插件化一般就是提供一个apk(插件)文件,然后在程序中load该apk,那么如何加载apk中的类呢?其实就是通过这个DexClassLoader

总结一句话

看了很多,发现兼容性并不太好。所以转战了~~~~重新看Tinker

参考文章
http://blog.csdn.net/lmj623565791/article/details/49883661
https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731290eef12ad0d17f39d4a&scene=1&srcid=1106Imu9ZgwybID13e7y2nEi#wechat_redirect
http://www.cnblogs.com/chenxibobo/p/6076459.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容