Use ComposeClassLoader

This commit is contained in:
solohsu 2019-06-06 11:39:28 +08:00
parent 74144b8f1a
commit fe10afb663
12 changed files with 75 additions and 28 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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