bool xposedOnVmCreated(JNIEnv* env, const char* className) { if (!keepLoadingXposed) return false; startClassName = className; xposedInitMemberOffsets(); // disable some access checks patchReturnTrue((void*) &dvmCheckClassAccess); patchReturnTrue((void*) &dvmCheckFieldAccess); patchReturnTrue((void*) &dvmInSamePackage); if (access(XPOSED_DIR "do_not_hook_dvmCheckMethodAccess", F_OK) != 0) patchReturnTrue((void*) &dvmCheckMethodAccess); xposedClass = env->FindClass(XPOSED_CLASS); xposedClass = reinterpret_cast<jclass>(env->NewGlobalRef(xposedClass)); if (xposedClass == NULL) { ALOGE("Error while loading Xposed class '%s':\n", XPOSED_CLASS); dvmLogExceptionStackTrace(); env->ExceptionClear(); return false; } ALOGI("Found Xposed class '%s', now initializing\n", XPOSED_CLASS); register_de_robv_android_xposed_XposedBridge(env); register_android_content_res_XResources(env); return true; }
bool xposedOnVmCreated(JNIEnv* env, const char* className) { startClassName = className; keepLoadingXposed = keepLoadingXposed && xposedInitMemberOffsets(env); if (!keepLoadingXposed) return false; jclass miuiResourcesClass = env->FindClass(MIUI_RESOURCES_CLASS); if (miuiResourcesClass != NULL) { ClassObject* clazz = (ClassObject*)dvmDecodeIndirectRef(dvmThreadSelf(), miuiResourcesClass); if (dvmIsFinalClass(clazz)) { ALOGD("Removing final flag for class '%s'", MIUI_RESOURCES_CLASS); clazz->accessFlags &= ~ACC_FINAL; } } env->ExceptionClear(); jclass xTypedArrayClass = env->FindClass(XTYPEDARRAY_CLASS); if (xTypedArrayClass == NULL) { ALOGE("Error while loading XTypedArray class '%s':\n", XTYPEDARRAY_CLASS); dvmLogExceptionStackTrace(); env->ExceptionClear(); return false; } xposedPrepareSubclassReplacement(xTypedArrayClass); xposedClass = env->FindClass(XPOSED_CLASS); xposedClass = reinterpret_cast<jclass>(env->NewGlobalRef(xposedClass)); if (xposedClass == NULL) { ALOGE("Error while loading Xposed class '%s':\n", XPOSED_CLASS); dvmLogExceptionStackTrace(); env->ExceptionClear(); return false; } ALOGI("Found Xposed class '%s', now initializing\n", XPOSED_CLASS); if (register_de_robv_android_xposed_XposedBridge(env) != JNI_OK) { ALOGE("Could not register natives for '%s'\n", XPOSED_CLASS); env->ExceptionClear(); return false; } return true; }
bool xposedOnVmCreated(JNIEnv* env, const char* className) { startClassName = className; keepLoadingXposed = keepLoadingXposed && xposedInitMemberOffsets(env); if (!keepLoadingXposed) return false; // disable some access checks patchReturnTrue((uintptr_t) & dvmCheckClassAccess); patchReturnTrue((uintptr_t) & dvmCheckFieldAccess); patchReturnTrue((uintptr_t) & dvmInSamePackage); if (access(XPOSED_DIR "conf/do_not_hook_dvmCheckMethodAccess", F_OK) != 0) patchReturnTrue((uintptr_t) & dvmCheckMethodAccess); jclass miuiResourcesClass = env->FindClass(MIUI_RESOURCES_CLASS); if (miuiResourcesClass != NULL) { ClassObject* clazz = (ClassObject*) dvmDecodeIndirectRef( dvmThreadSelf(), miuiResourcesClass); if (dvmIsFinalClass(clazz)) { ALOGD("Removing final flag for class '%s'", MIUI_RESOURCES_CLASS); clazz->accessFlags &= ~ACC_FINAL; } } env->ExceptionClear(); xposedClass = env->FindClass(XPOSED_CLASS); xposedClass = reinterpret_cast<jclass>(env->NewGlobalRef(xposedClass)); if (xposedClass == NULL) { ALOGE("Error while loading Xposed class '%s':\n", XPOSED_CLASS); dvmLogExceptionStackTrace(); env->ExceptionClear(); return false; } ALOGI("Found Xposed class '%s', now initializing\n", XPOSED_CLASS); if (register_de_robv_android_xposed_XposedBridge(env) != JNI_OK) { ALOGE("Could not register natives for '%s'\n", XPOSED_CLASS); return false; } return true; }