Whale: fix bootloop

This commit is contained in:
solohsu 2019-06-17 22:45:01 +08:00
parent 661a675a09
commit 5cba146185
9 changed files with 54 additions and 28 deletions

View File

@ -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);
}
} }

View File

@ -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_;
} }

View File

@ -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;
}; };
} }

View File

@ -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

View File

@ -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();
} }
} }

View File

@ -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");
} }
} }

View File

@ -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

View File

@ -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);
}
} }