Whale: fix bootloop
This commit is contained in:
parent
661a675a09
commit
5cba146185
|
|
@ -2,6 +2,9 @@ package com.elderdrivers.riru.edxp.util;
|
|||
|
||||
import android.os.Build;
|
||||
|
||||
import java.lang.reflect.Member;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
import de.robv.android.xposed.XposedHelpers;
|
||||
|
||||
public class ClassUtils {
|
||||
|
|
@ -33,4 +36,13 @@ public class ClassUtils {
|
|||
}
|
||||
}
|
||||
|
||||
public static boolean shouldDelayHook(Member hookMethod) {
|
||||
if (hookMethod == null) {
|
||||
return false;
|
||||
}
|
||||
Class declaringClass = hookMethod.getDeclaringClass();
|
||||
return Modifier.isStatic(hookMethod.getModifiers())
|
||||
&& !ClassUtils.isInitialized(declaringClass);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#include <art/runtime/jni_env_ext.h>
|
||||
#include <art/runtime/mirror/class.h>
|
||||
#include <android-base/strings.h>
|
||||
#include <nativehelper/scoped_local_ref.h>
|
||||
#include "edxp_context.h"
|
||||
#include "config_manager.h"
|
||||
|
||||
|
|
@ -30,7 +31,15 @@ namespace edxp {
|
|||
return instance_;
|
||||
}
|
||||
|
||||
ALWAYS_INLINE inline jobject Context::GetCurrentClassLoader() const {
|
||||
ALWAYS_INLINE bool Context::IsInitialized() const {
|
||||
return initialized_;
|
||||
}
|
||||
|
||||
ALWAYS_INLINE Variant Context::GetVariant() const {
|
||||
return variant_;
|
||||
}
|
||||
|
||||
ALWAYS_INLINE jobject Context::GetCurrentClassLoader() const {
|
||||
return inject_class_loader_;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,10 @@ namespace edxp {
|
|||
jlong permitted_capabilities,
|
||||
jlong effective_capabilities);
|
||||
|
||||
bool IsInitialized() const;
|
||||
|
||||
Variant GetVariant() const;
|
||||
|
||||
private:
|
||||
static Context *instance_;
|
||||
bool initialized_ = false;
|
||||
|
|
@ -75,7 +79,6 @@ namespace edxp {
|
|||
void LoadDexAndInit(JNIEnv *env, const char *dex_path);
|
||||
|
||||
jclass FindClassFromLoader(JNIEnv *env, jobject class_loader, const char *class_name) const;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,5 +3,5 @@ package com.elderdrivers.riru.edxp.whale.config;
|
|||
import com.elderdrivers.riru.edxp.config.BaseEdxpConfig;
|
||||
|
||||
public class WhaleEdxpConfig extends BaseEdxpConfig {
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
package com.elderdrivers.riru.edxp.whale.config;
|
||||
|
||||
import com.elderdrivers.riru.edxp.art.ClassLinker;
|
||||
import com.elderdrivers.riru.edxp.art.Heap;
|
||||
import com.elderdrivers.riru.edxp.config.BaseHookProvider;
|
||||
import com.elderdrivers.riru.edxp.core.ResourcesHook;
|
||||
import com.elderdrivers.riru.edxp.core.Yahfa;
|
||||
import com.elderdrivers.riru.edxp.util.Utils;
|
||||
import com.lody.whale.WhaleRuntime;
|
||||
|
||||
import java.lang.reflect.Member;
|
||||
|
|
@ -13,6 +15,9 @@ import java.util.HashMap;
|
|||
import java.util.Map;
|
||||
|
||||
import de.robv.android.xposed.XposedBridge;
|
||||
import de.robv.android.xposed.XposedHelpers;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.util.ClassUtils.shouldDelayHook;
|
||||
|
||||
public class WhaleHookProvider extends BaseHookProvider {
|
||||
|
||||
|
|
@ -27,7 +32,7 @@ public class WhaleHookProvider extends BaseHookProvider {
|
|||
|
||||
@Override
|
||||
public void hookMethod(Member method, XposedBridge.AdditionalHookInfo additionalInfo) {
|
||||
resolveStaticMethod(method);
|
||||
// resolveStaticMethod(method);
|
||||
long slot = WhaleRuntime.hookMethodNative(method.getDeclaringClass(), method, additionalInfo);
|
||||
synchronized (sHookedMethodSlotMap) {
|
||||
sHookedMethodSlotMap.put(method, slot);
|
||||
|
|
@ -42,7 +47,7 @@ public class WhaleHookProvider extends BaseHookProvider {
|
|||
|
||||
@Override
|
||||
public Member findMethodNative(Member hookMethod) {
|
||||
return hookMethod;
|
||||
return shouldDelayHook(hookMethod) ? null : hookMethod;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import com.elderdrivers.riru.edxp.config.InstallerChooser;
|
|||
import com.elderdrivers.riru.edxp.core.BaseEdxpImpl;
|
||||
import com.elderdrivers.riru.edxp.core.EdxpImpl;
|
||||
import com.elderdrivers.riru.edxp.core.Main;
|
||||
import com.elderdrivers.riru.edxp.core.Proxy;
|
||||
import com.elderdrivers.riru.edxp.core.Yahfa;
|
||||
import com.elderdrivers.riru.edxp.core.yahfa.HookMethodResolver;
|
||||
import com.elderdrivers.riru.edxp.proxy.Router;
|
||||
|
|
@ -39,4 +40,5 @@ public class WhaleEdxpImpl extends BaseEdxpImpl {
|
|||
|
||||
setInitialized();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,21 @@
|
|||
package com.elderdrivers.riru.edxp.whale.core;
|
||||
|
||||
import android.app.ActivityThread;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.res.CompatibilityInfo;
|
||||
|
||||
import com.elderdrivers.riru.edxp._hooker.impl.HandleBindApp;
|
||||
import com.elderdrivers.riru.edxp._hooker.impl.LoadedApkCstr;
|
||||
import com.elderdrivers.riru.edxp._hooker.yahfa.HandleBindAppHooker;
|
||||
import com.elderdrivers.riru.edxp._hooker.yahfa.LoadedApkConstructorHooker;
|
||||
import com.elderdrivers.riru.edxp.config.EdXpConfigGlobal;
|
||||
import com.elderdrivers.riru.edxp.framework.Zygote;
|
||||
import com.elderdrivers.riru.edxp.proxy.BaseRouter;
|
||||
import com.elderdrivers.riru.edxp.whale.config.WhaleEdxpConfig;
|
||||
import com.elderdrivers.riru.edxp.whale.config.WhaleHookProvider;
|
||||
|
||||
import de.robv.android.xposed.XposedBridge;
|
||||
import de.robv.android.xposed.XposedHelpers;
|
||||
|
||||
public class WhaleRouter extends BaseRouter {
|
||||
|
||||
|
|
@ -14,9 +24,14 @@ public class WhaleRouter extends BaseRouter {
|
|||
}
|
||||
|
||||
public void injectConfig() {
|
||||
BaseRouter.useXposedApi = true;
|
||||
EdXpConfigGlobal.sConfig = new WhaleEdxpConfig();
|
||||
EdXpConfigGlobal.sHookProvider = new WhaleHookProvider();
|
||||
XposedBridge.log("using HookProvider: " + EdXpConfigGlobal.sHookProvider.getClass().getName());
|
||||
Zygote.allowFileAcrossFork("/system/lib/libwhale.edxp.so");
|
||||
Zygote.allowFileAcrossFork("/system/lib64/libwhale.edxp.so");
|
||||
Zygote.allowFileAcrossFork("/system/lib/libart.so");
|
||||
Zygote.allowFileAcrossFork("/system/lib64/libart.so");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,13 +4,14 @@ import com.elderdrivers.riru.edxp.art.ClassLinker;
|
|||
import com.elderdrivers.riru.edxp.config.BaseHookProvider;
|
||||
import com.elderdrivers.riru.edxp.core.ResourcesHook;
|
||||
import com.elderdrivers.riru.edxp.core.Yahfa;
|
||||
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DexMakerUtils;
|
||||
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DynamicBridge;
|
||||
|
||||
import java.lang.reflect.Member;
|
||||
|
||||
import de.robv.android.xposed.XposedBridge;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.util.ClassUtils.shouldDelayHook;
|
||||
|
||||
public class YahfaHookProvider extends BaseHookProvider {
|
||||
|
||||
@Override
|
||||
|
|
@ -25,7 +26,7 @@ public class YahfaHookProvider extends BaseHookProvider {
|
|||
|
||||
@Override
|
||||
public Member findMethodNative(Member hookMethod) {
|
||||
return DexMakerUtils.findMethodNative(hookMethod);
|
||||
return shouldDelayHook(hookMethod) ? null : hookMethod;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -5,11 +5,7 @@ import android.os.Build;
|
|||
import android.text.TextUtils;
|
||||
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
import com.elderdrivers.riru.edxp.util.ClassUtils;
|
||||
import com.elderdrivers.riru.edxp.util.Utils;
|
||||
|
||||
import java.lang.reflect.Member;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.security.MessageDigest;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
|
@ -246,21 +242,4 @@ public class DexMakerUtils {
|
|||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public static Member findMethodNative(Member hookMethod) {
|
||||
if (shouldDelayHook(hookMethod)) {
|
||||
Utils.logD("solo: " + hookMethod + " hooking delayed.");
|
||||
return null;
|
||||
}
|
||||
return hookMethod;
|
||||
}
|
||||
|
||||
private static boolean shouldDelayHook(Member hookMethod) {
|
||||
if (hookMethod == null) {
|
||||
return false;
|
||||
}
|
||||
Class declaringClass = hookMethod.getDeclaringClass();
|
||||
return Modifier.isStatic(hookMethod.getModifiers())
|
||||
&& !ClassUtils.isInitialized(declaringClass);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue