最近我的Android N手机上京东App偶现crash,通过log发现京东App使用了tinker热修复方案,这个crash和
ART下的方法内联策略及其对Android热修复方案的影响分析中描述的第二种crash相似:
oldDex里的typeid >= newDex的DexCache的长度 被SIGABORT干掉,Abort Message为数组下标越界
但是我对判断新旧DexCache时存在一些疑惑,已知条件:
f.sC内联了h.getExternalStorageDirectory
(12288+1292)/4 = 3395,对应compatible.util.h的typeid
(12288+1120) / 4 = 3352,对应compatible.d.p的typeid
按照我对文章的理解,因为3395对应的类为null或者没有初始化,然后跳转到0x036e40ea这个地方去执行,按照类的加载流程加载了新的类,并且形成了新的DexCache,继而3352作为索引的DexCache是新的DexCache。但是由于内联的原因,3352这个索引对应的是旧的DexCache,因此会出现问题。
我的疑惑就在于这一系列动作的触发条件,那就是只有3395对应的类为null或者没有初始化才会跳转去执行后面的流程。3395对应的是旧的DexCache,按照我的理解,它应该既不为NULL也应该初始化了才对,非常的不理解这点,盼望解答一下。
