Use ComposeClassLoader
This commit is contained in:
parent
74144b8f1a
commit
fe10afb663
|
|
@ -22,7 +22,6 @@ import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
|||
import static com.elderdrivers.riru.edxp.config.InstallerChooser.INSTALLER_PACKAGE_NAME;
|
||||
import static com.elderdrivers.riru.edxp.hooker.SliceProviderFix.SYSTEMUI_PACKAGE_NAME;
|
||||
import static com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker.BLACK_LIST_PACKAGE_NAME;
|
||||
import static com.elderdrivers.riru.edxp.util.ClassLoaderUtils.replaceParentClassLoader;
|
||||
|
||||
// normal process initialization (for new Activity, Service, BroadcastReceiver etc.)
|
||||
public class HandleBindApp extends XC_MethodHook {
|
||||
|
|
@ -62,8 +61,6 @@ public class HandleBindApp extends XC_MethodHook {
|
|||
XposedInit.loadedPackagesInProcess.add(reportedPackageName);
|
||||
LoadedApk loadedApk = activityThread.getPackageInfoNoCheck(appInfo, compatInfo);
|
||||
|
||||
replaceParentClassLoader(loadedApk.getClassLoader());
|
||||
|
||||
XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
|
||||
lpparam.packageName = reportedPackageName;
|
||||
lpparam.processName = (String) XposedHelpers.getObjectField(bindData, "processName");
|
||||
|
|
|
|||
|
|
@ -13,8 +13,6 @@ import de.robv.android.xposed.XposedHelpers;
|
|||
import de.robv.android.xposed.XposedInit;
|
||||
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.util.ClassLoaderUtils.replaceParentClassLoader;
|
||||
|
||||
// when a package is loaded for an existing process, trigger the callbacks as well
|
||||
// ed: remove resources related hooking
|
||||
public class LoadedApkCstr extends XC_MethodHook {
|
||||
|
|
@ -60,8 +58,6 @@ public class LoadedApkCstr extends XC_MethodHook {
|
|||
return;
|
||||
}
|
||||
|
||||
replaceParentClassLoader(loadedApk.getClassLoader());
|
||||
|
||||
XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
|
||||
lpparam.packageName = packageName;
|
||||
lpparam.processName = AndroidAppHelper.currentProcessName();
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@ import de.robv.android.xposed.XposedHelpers;
|
|||
import de.robv.android.xposed.XposedInit;
|
||||
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.util.ClassLoaderUtils.replaceParentClassLoader;
|
||||
import static com.elderdrivers.riru.edxp.util.Utils.logD;
|
||||
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
|
||||
|
||||
|
|
@ -28,8 +27,6 @@ public class StartBootstrapServices extends XC_MethodHook {
|
|||
try {
|
||||
XposedInit.loadedPackagesInProcess.add("android");
|
||||
|
||||
replaceParentClassLoader(SystemMain.systemServerCL);
|
||||
|
||||
XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
|
||||
lpparam.packageName = "android";
|
||||
lpparam.processName = "android"; // it's actually system_server, but other functions return this as well
|
||||
|
|
|
|||
|
|
@ -7,10 +7,12 @@ import android.text.TextUtils;
|
|||
|
||||
import com.elderdrivers.riru.edxp._hooker.impl.HandleBindApp;
|
||||
import com.elderdrivers.riru.edxp._hooker.impl.LoadedApkCstr;
|
||||
import com.elderdrivers.riru.edxp._hooker.impl.OneplusWorkaround;
|
||||
import com.elderdrivers.riru.edxp._hooker.impl.StartBootstrapServices;
|
||||
import com.elderdrivers.riru.edxp._hooker.impl.SystemMain;
|
||||
import com.elderdrivers.riru.edxp._hooker.yahfa.HandleBindAppHooker;
|
||||
import com.elderdrivers.riru.edxp._hooker.yahfa.LoadedApkConstructorHooker;
|
||||
import com.elderdrivers.riru.edxp._hooker.yahfa.OnePlusWorkAroundHooker;
|
||||
import com.elderdrivers.riru.edxp._hooker.yahfa.StartBootstrapServicesHooker;
|
||||
import com.elderdrivers.riru.edxp._hooker.yahfa.SystemMainHooker;
|
||||
import com.elderdrivers.riru.edxp.core.yahfa.HookMain;
|
||||
|
|
@ -138,15 +140,15 @@ public abstract class BaseRouter implements Router {
|
|||
|
||||
public void startWorkAroundHook() {
|
||||
ClassLoader classLoader = BaseRouter.class.getClassLoader();
|
||||
// if (useXposedApi) {
|
||||
// XposedHelpers.findAndHookMethod(OnePlusWorkAroundHooker.className,
|
||||
// classLoader, OnePlusWorkAroundHooker.methodName,
|
||||
// int.class, String.class, new OneplusWorkaround());
|
||||
// } else {
|
||||
HookMain.doHookDefault(
|
||||
BaseRouter.class.getClassLoader(),
|
||||
classLoader,
|
||||
WorkAroundHookInfo.class.getName());
|
||||
// }
|
||||
if (useXposedApi) {
|
||||
XposedHelpers.findAndHookMethod(OnePlusWorkAroundHooker.className,
|
||||
classLoader, OnePlusWorkAroundHooker.methodName,
|
||||
int.class, String.class, new OneplusWorkaround());
|
||||
} else {
|
||||
HookMain.doHookDefault(
|
||||
BaseRouter.class.getClassLoader(),
|
||||
classLoader,
|
||||
WorkAroundHookInfo.class.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,9 @@ import java.util.ArrayList;
|
|||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
import dalvik.system.BaseDexClassLoader;
|
||||
import dalvik.system.PathClassLoader;
|
||||
import de.robv.android.xposed.XC_MethodHook;
|
||||
import de.robv.android.xposed.XposedBridge;
|
||||
import de.robv.android.xposed.XposedHelpers;
|
||||
|
||||
|
|
@ -62,6 +64,11 @@ public class ClassLoaderUtils {
|
|||
}
|
||||
}
|
||||
|
||||
public static ClassLoader createComposeClassLoader(ClassLoader appClassLoader) {
|
||||
ClassLoader current = ClassLoaderUtils.class.getClassLoader();
|
||||
return appClassLoader == null ? current : new ComposeClassLoader(appClassLoader, current);
|
||||
}
|
||||
|
||||
public static List<ClassLoader> getAppClassLoader() {
|
||||
List<ClassLoader> cacheLoaders = new ArrayList<>(0);
|
||||
try {
|
||||
|
|
@ -107,4 +114,42 @@ public class ClassLoaderUtils {
|
|||
return false;
|
||||
}
|
||||
|
||||
public static void hookClassLoading() {
|
||||
final ClassLoader currentCl = ClassLoaderUtils.class.getClassLoader();
|
||||
XposedHelpers.findAndHookMethod(Class.class,
|
||||
"forName", String.class, boolean.class, ClassLoader.class,
|
||||
new XC_MethodHook(Integer.MAX_VALUE) {
|
||||
@Override
|
||||
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
||||
if (param.args[2] == currentCl) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
param.setResult(Class.forName(
|
||||
(String) param.args[0], (boolean) param.args[1], currentCl));
|
||||
} catch (Throwable throwable) {
|
||||
// silently continue to call original
|
||||
}
|
||||
}
|
||||
});
|
||||
XC_MethodHook findClassHook = new XC_MethodHook(Integer.MAX_VALUE) {
|
||||
@Override
|
||||
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
||||
if (param.thisObject == currentCl) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
param.setResult(XposedHelpers.callMethod(currentCl,
|
||||
"findClass", param.args[0]));
|
||||
param.setThrowable(null);
|
||||
} catch (Throwable throwable) {
|
||||
// silently continue to return
|
||||
}
|
||||
}
|
||||
};
|
||||
XposedHelpers.findAndHookMethod(BaseDexClassLoader.class,
|
||||
"findClass", String.class, findClassHook);
|
||||
XposedHelpers.findAndHookMethod("java.lang.BootClassLoader", null,
|
||||
"findClass", String.class, findClassHook);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
package com.swift.sandhook.xposedcompat.classloaders;
|
||||
package com.elderdrivers.riru.edxp.util;
|
||||
|
||||
/**
|
||||
* Created by weishu on 17/11/30.
|
||||
|
|
@ -7,6 +7,7 @@ package com.swift.sandhook.xposedcompat.classloaders;
|
|||
public class ComposeClassLoader extends ClassLoader {
|
||||
|
||||
private final ClassLoader mAppClassLoader;
|
||||
|
||||
public ComposeClassLoader(ClassLoader parent, ClassLoader appClassLoader) {
|
||||
super(parent);
|
||||
mAppClassLoader = appClassLoader;
|
||||
|
|
@ -3,10 +3,10 @@ import org.gradle.internal.os.OperatingSystem
|
|||
|
||||
apply plugin: 'com.android.library'
|
||||
|
||||
version "v0.4.3.5_alpha"
|
||||
version "v0.4.3.6_alpha"
|
||||
|
||||
ext {
|
||||
versionCode = "4350"
|
||||
versionCode = "4360"
|
||||
module_name = "EdXposed"
|
||||
jar_dest_dir = "${projectDir}/template_override/system/framework/"
|
||||
is_windows = OperatingSystem.current().isWindows()
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <edxp_context.h>
|
||||
#include "base/object.h"
|
||||
|
||||
namespace art {
|
||||
|
|
@ -60,6 +61,9 @@ namespace art {
|
|||
HOOK_FUNC(IsInSamePackage,
|
||||
"_ZN3art6mirror5Class15IsInSamePackageENS_6ObjPtrIS1_EE", //8.0-
|
||||
"_ZN3art6mirror5Class15IsInSamePackageEPS1_"); //5.0-7.1
|
||||
|
||||
// HOOK_FUNC(ClassForName,
|
||||
// "_ZN3artL18Class_classForNameEP7_JNIEnvP7_jclassP8_jstringhP8_jobject");
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#!/system/bin/sh
|
||||
|
||||
EDXP_VERSION="0.4.3.5_alpha (4350)"
|
||||
EDXP_VERSION="0.4.3.6_alpha (4360)"
|
||||
ANDROID_SDK=`getprop ro.build.version.sdk`
|
||||
BUILD_DESC=`getprop ro.build.description`
|
||||
PRODUCT=`getprop ro.build.product`
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import android.text.TextUtils;
|
|||
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
import com.swift.sandhook.SandHook;
|
||||
import com.swift.sandhook.xposedcompat.classloaders.ComposeClassLoader;
|
||||
import com.elderdrivers.riru.edxp.util.ComposeClassLoader;
|
||||
import com.swift.sandhook.xposedcompat.methodgen.SandHookXposedBridge;
|
||||
import com.swift.sandhook.xposedcompat.utils.ApplicationUtils;
|
||||
import com.swift.sandhook.xposedcompat.utils.FileUtils;
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package com.swift.sandhook.xposedcompat.methodgen;
|
|||
import android.os.Process;
|
||||
import android.os.Trace;
|
||||
|
||||
import com.elderdrivers.riru.edxp.util.ClassLoaderUtils;
|
||||
import com.swift.sandhook.SandHook;
|
||||
import com.swift.sandhook.SandHookConfig;
|
||||
import com.swift.sandhook.blacklist.HookBlackList;
|
||||
|
|
@ -31,7 +32,7 @@ public final class SandHookXposedBridge {
|
|||
private static final AtomicBoolean dexPathInited = new AtomicBoolean(false);
|
||||
private static File dexDir;
|
||||
|
||||
public static Map<Member,HookMethodEntity> entityMap = new ConcurrentHashMap<>();
|
||||
public static Map<Member, HookMethodEntity> entityMap = new ConcurrentHashMap<>();
|
||||
|
||||
public static boolean hooked(Member member) {
|
||||
return hookedInfo.containsKey(member) || entityMap.containsKey(member);
|
||||
|
|
@ -76,7 +77,9 @@ public final class SandHookXposedBridge {
|
|||
hookMaker = defaultHookMaker;
|
||||
}
|
||||
hookMaker.start(hookMethod, additionalHookInfo,
|
||||
hookMethod.getDeclaringClass().getClassLoader(), dexDir == null ? null : dexDir.getAbsolutePath());
|
||||
ClassLoaderUtils.createComposeClassLoader(
|
||||
hookMethod.getDeclaringClass().getClassLoader()),
|
||||
dexDir == null ? null : dexDir.getAbsolutePath());
|
||||
hookedInfo.put(hookMethod, hookMaker.getCallBackupMethod());
|
||||
}
|
||||
DexLog.d("hook method <" + hookMethod.toString() + "> cost " + (System.currentTimeMillis() - timeStart) + " ms, by " + (stub != null ? "internal stub" : "dex maker"));
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import android.text.TextUtils;
|
|||
|
||||
import com.elderdrivers.riru.edxp.core.Yahfa;
|
||||
import com.elderdrivers.riru.edxp.core.yahfa.HookMain;
|
||||
import com.elderdrivers.riru.edxp.util.ComposeClassLoader;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Constructor;
|
||||
|
|
@ -177,9 +178,10 @@ public class HookerDexMaker {
|
|||
mDexDirPath = dexDirPath;
|
||||
if (appClassLoader == null
|
||||
|| appClassLoader.getClass().getName().equals("java.lang.BootClassLoader")) {
|
||||
mAppClassLoader = this.getClass().getClassLoader();
|
||||
mAppClassLoader = getClass().getClassLoader();
|
||||
} else {
|
||||
mAppClassLoader = appClassLoader;
|
||||
mAppClassLoader = new ComposeClassLoader(mAppClassLoader, getClass().getClassLoader());
|
||||
}
|
||||
doMake();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue