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 android.os.Build;
|
||||||
|
|
||||||
|
import java.lang.reflect.Member;
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
|
|
||||||
import de.robv.android.xposed.XposedHelpers;
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
|
|
||||||
public class ClassUtils {
|
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/jni_env_ext.h>
|
||||||
#include <art/runtime/mirror/class.h>
|
#include <art/runtime/mirror/class.h>
|
||||||
#include <android-base/strings.h>
|
#include <android-base/strings.h>
|
||||||
|
#include <nativehelper/scoped_local_ref.h>
|
||||||
#include "edxp_context.h"
|
#include "edxp_context.h"
|
||||||
#include "config_manager.h"
|
#include "config_manager.h"
|
||||||
|
|
||||||
|
|
@ -30,7 +31,15 @@ namespace edxp {
|
||||||
return instance_;
|
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_;
|
return inject_class_loader_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,10 @@ namespace edxp {
|
||||||
jlong permitted_capabilities,
|
jlong permitted_capabilities,
|
||||||
jlong effective_capabilities);
|
jlong effective_capabilities);
|
||||||
|
|
||||||
|
bool IsInitialized() const;
|
||||||
|
|
||||||
|
Variant GetVariant() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static Context *instance_;
|
static Context *instance_;
|
||||||
bool initialized_ = false;
|
bool initialized_ = false;
|
||||||
|
|
@ -75,7 +79,6 @@ namespace edxp {
|
||||||
void LoadDexAndInit(JNIEnv *env, const char *dex_path);
|
void LoadDexAndInit(JNIEnv *env, const char *dex_path);
|
||||||
|
|
||||||
jclass FindClassFromLoader(JNIEnv *env, jobject class_loader, const char *class_name) const;
|
jclass FindClassFromLoader(JNIEnv *env, jobject class_loader, const char *class_name) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
package com.elderdrivers.riru.edxp.whale.config;
|
package com.elderdrivers.riru.edxp.whale.config;
|
||||||
|
|
||||||
import com.elderdrivers.riru.edxp.art.ClassLinker;
|
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.config.BaseHookProvider;
|
||||||
import com.elderdrivers.riru.edxp.core.ResourcesHook;
|
import com.elderdrivers.riru.edxp.core.ResourcesHook;
|
||||||
import com.elderdrivers.riru.edxp.core.Yahfa;
|
import com.elderdrivers.riru.edxp.core.Yahfa;
|
||||||
|
import com.elderdrivers.riru.edxp.util.Utils;
|
||||||
import com.lody.whale.WhaleRuntime;
|
import com.lody.whale.WhaleRuntime;
|
||||||
|
|
||||||
import java.lang.reflect.Member;
|
import java.lang.reflect.Member;
|
||||||
|
|
@ -13,6 +15,9 @@ import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import de.robv.android.xposed.XposedBridge;
|
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 {
|
public class WhaleHookProvider extends BaseHookProvider {
|
||||||
|
|
||||||
|
|
@ -27,7 +32,7 @@ public class WhaleHookProvider extends BaseHookProvider {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hookMethod(Member method, XposedBridge.AdditionalHookInfo additionalInfo) {
|
public void hookMethod(Member method, XposedBridge.AdditionalHookInfo additionalInfo) {
|
||||||
resolveStaticMethod(method);
|
// resolveStaticMethod(method);
|
||||||
long slot = WhaleRuntime.hookMethodNative(method.getDeclaringClass(), method, additionalInfo);
|
long slot = WhaleRuntime.hookMethodNative(method.getDeclaringClass(), method, additionalInfo);
|
||||||
synchronized (sHookedMethodSlotMap) {
|
synchronized (sHookedMethodSlotMap) {
|
||||||
sHookedMethodSlotMap.put(method, slot);
|
sHookedMethodSlotMap.put(method, slot);
|
||||||
|
|
@ -42,7 +47,7 @@ public class WhaleHookProvider extends BaseHookProvider {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Member findMethodNative(Member hookMethod) {
|
public Member findMethodNative(Member hookMethod) {
|
||||||
return hookMethod;
|
return shouldDelayHook(hookMethod) ? null : hookMethod;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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.BaseEdxpImpl;
|
||||||
import com.elderdrivers.riru.edxp.core.EdxpImpl;
|
import com.elderdrivers.riru.edxp.core.EdxpImpl;
|
||||||
import com.elderdrivers.riru.edxp.core.Main;
|
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;
|
||||||
import com.elderdrivers.riru.edxp.core.yahfa.HookMethodResolver;
|
import com.elderdrivers.riru.edxp.core.yahfa.HookMethodResolver;
|
||||||
import com.elderdrivers.riru.edxp.proxy.Router;
|
import com.elderdrivers.riru.edxp.proxy.Router;
|
||||||
|
|
@ -39,4 +40,5 @@ public class WhaleEdxpImpl extends BaseEdxpImpl {
|
||||||
|
|
||||||
setInitialized();
|
setInitialized();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,21 @@
|
||||||
package com.elderdrivers.riru.edxp.whale.core;
|
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.config.EdXpConfigGlobal;
|
||||||
|
import com.elderdrivers.riru.edxp.framework.Zygote;
|
||||||
import com.elderdrivers.riru.edxp.proxy.BaseRouter;
|
import com.elderdrivers.riru.edxp.proxy.BaseRouter;
|
||||||
import com.elderdrivers.riru.edxp.whale.config.WhaleEdxpConfig;
|
import com.elderdrivers.riru.edxp.whale.config.WhaleEdxpConfig;
|
||||||
import com.elderdrivers.riru.edxp.whale.config.WhaleHookProvider;
|
import com.elderdrivers.riru.edxp.whale.config.WhaleHookProvider;
|
||||||
|
|
||||||
import de.robv.android.xposed.XposedBridge;
|
import de.robv.android.xposed.XposedBridge;
|
||||||
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
|
|
||||||
public class WhaleRouter extends BaseRouter {
|
public class WhaleRouter extends BaseRouter {
|
||||||
|
|
||||||
|
|
@ -14,9 +24,14 @@ public class WhaleRouter extends BaseRouter {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void injectConfig() {
|
public void injectConfig() {
|
||||||
|
BaseRouter.useXposedApi = true;
|
||||||
EdXpConfigGlobal.sConfig = new WhaleEdxpConfig();
|
EdXpConfigGlobal.sConfig = new WhaleEdxpConfig();
|
||||||
EdXpConfigGlobal.sHookProvider = new WhaleHookProvider();
|
EdXpConfigGlobal.sHookProvider = new WhaleHookProvider();
|
||||||
XposedBridge.log("using HookProvider: " + EdXpConfigGlobal.sHookProvider.getClass().getName());
|
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.config.BaseHookProvider;
|
||||||
import com.elderdrivers.riru.edxp.core.ResourcesHook;
|
import com.elderdrivers.riru.edxp.core.ResourcesHook;
|
||||||
import com.elderdrivers.riru.edxp.core.Yahfa;
|
import com.elderdrivers.riru.edxp.core.Yahfa;
|
||||||
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DexMakerUtils;
|
|
||||||
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DynamicBridge;
|
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DynamicBridge;
|
||||||
|
|
||||||
import java.lang.reflect.Member;
|
import java.lang.reflect.Member;
|
||||||
|
|
||||||
import de.robv.android.xposed.XposedBridge;
|
import de.robv.android.xposed.XposedBridge;
|
||||||
|
|
||||||
|
import static com.elderdrivers.riru.edxp.util.ClassUtils.shouldDelayHook;
|
||||||
|
|
||||||
public class YahfaHookProvider extends BaseHookProvider {
|
public class YahfaHookProvider extends BaseHookProvider {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -25,7 +26,7 @@ public class YahfaHookProvider extends BaseHookProvider {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Member findMethodNative(Member hookMethod) {
|
public Member findMethodNative(Member hookMethod) {
|
||||||
return DexMakerUtils.findMethodNative(hookMethod);
|
return shouldDelayHook(hookMethod) ? null : hookMethod;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,7 @@ import android.os.Build;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
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.security.MessageDigest;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
@ -246,21 +242,4 @@ public class DexMakerUtils {
|
||||||
}
|
}
|
||||||
return "";
|
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