记录Tinker与R8的冲突与解决

简单记录一下上D8、R8之后的坑,之前业务上热修复一直用的是Tinker,因为大厂加成加上支持加固(至于为啥上加固就不说了,该懂的都懂,要么加固要么不能上架)。

我们其实一直是用tinker作为灰度发布工具的。在长达一年多的时间里一直很稳定,后面上了加固之后偶尔会出现异常,不过大多数情况其实是加固的自有升级导致的边缘case,然后在今年使用D8+R8之后,加固的失败率明星上升了。尤其是是在高版本的安卓设备上(7.0+)。跟了一下原因,主要是R8的过度优化导致的。R8会把整个项目中的所有代码,包括依赖库中的代码都进行全局优化,其优化程度堪称恐怖,这里就不细说了,有兴趣可以可以看下Jake Wharton大神的博客

其中一个导致问题的优化是全局公共方法抽出,R8会把全局中代码相似度非常高的代码抽出来,放到一个新生成的类里,从而减少方法数。然后这个方法可能会被放到别的dex里。于是当启用热修复patch之后会导致tinker里的一部分代码因为被优化到别的dex里,在新合成的dex里并不存在,从而导致ClassNotFoundException,然后用户就崩溃了。

分析问题,主要是Tinker的相关代码被优化处理了,并且这个优化并没有提供开关,keep也没用,keep并不能阻止R8的优化。于是有了一个邪道方案:
第一步,先keep tinker的全部相关代码。因为package name不同,自然就会被放到一个package里。
第二步,在一个独立的项目里放入tinker 并且不启动R8并且打包完成,然后把包拆开把相关的tinker代码捞出来备用。
第三步,在主项目每次编译完成后解开包,把主dex里的tinker代码删除掉再把独立项目里的备用没被r8处理过的代码提出来替换进去。
最后,打包回去,再签名加固,万事大吉。

似乎听起来没什么毛病,结果后面还是炸了。

再次跟进问题,还是R8的优化,tinker一个类的某个变量是私有的,有一个set方法,然而R8优化的时候把他换成public的了(估计还是为了节约方法数,当初的dex 65535的坑真的大)。然而我们替换回去的tinker还是私有的,于是,再次出现了方法不存在错误。

所有问题又绕回来了,归根结底还是要阻止R8对项目里tinker代码的优化。于是再上一个方案的基础上,把主项目里对tinker的引用换成 compileOnly 不存在你总不能优化了吧?再去查看了一下之前备用的tinker代码块方法数,大概2000以内,于是手动造2000个空方法并且keep到主dex里,再之前的第三步里,把插入的桩方法全部干掉,换成没被处理过的tinker的代码。最后打包回去。

到此R8跟tinker的冲突暂时告一段落,不知道后面会不会还有新的坑。至于为什么步换成proguard?我也想啊,但是现在主项目已经到了不上R8 主dex就一定会超出65535的地步了,这是另一个坑,这里就不说了。
相关代码就不贴了,毕竟涉及到公司项目。希望这个思路可以帮助遇到相关问题的人。

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

推荐阅读更多精彩内容