💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
八、Davlik Class resolved by unexpected DEX: 限制和处理方式 [Davlik 类加载处理源码 ](https://android.googlesource.com/platform/dalvik.git/+/51801371a9b0f829303d326a2300518177dde3e8/vm/oo/Resolve.cpp) [手Q 的方案 ]() ``` if (!fromUnverifiedConstant && // 条件3 IS_CLASS_FLAG_SET(referrer, CLASS_ISPREVERIFIED)) // 条件1 { ClassObject* resClassCheck = resClass; if (dvmIsArrayClass(resClassCheck)) resClassCheck = resClassCheck->elementClass; if (referrer->pDvmDex != resClassCheck->pDvmDex && resClassCheck->classLoader != NULL) // 条件2 { ALOGW("Class resolved by unexpected DEX:" " %s(%p):%p ref [%s] %s(%p):%p", referrer->descriptor, referrer->classLoader, referrer->pDvmDex, resClass->descriptor, resClassCheck->descriptor, resClassCheck->classLoader, resClassCheck->pDvmDex); ALOGW("(%s had used a different %s during pre-verification) ", referrer->descriptor, resClass->descriptor); dvmThrowIllegalAccessError( "Class ref in pre-verified class resolved to unexpecte d " "implementation"); return NULL; } } ``` 三个条件: CLASS_ISPREVERIFIED 这个标记被打上的原理是,只要一个类里面和这个类的依赖都在一个dex 中,那么这些类就被打上PREVERIFIED 的标记; 单独有个[特殊的.dex]这个dex 里面只有一个类,且其他的dex 中的类都引用一下这个单独dex 里面的类,那么,项目中所有的类,就不会被打上CLASS_ISPREVERIFIED 这个标记 ``` dex 数组: [ 1.dex, 2.dex, 3.dex, 特殊的.dex(插桩类)] ``` `referrer->pDvmDex != resClassCheck->pDvmDex` 补丁类和引用类应该在同一个dex 里面; fromUnverifiedConstant hook 使用native 方式