Implement getDefaultClassLoader

This commit is contained in:
LoveSy 2023-02-22 16:18:26 +08:00 committed by LoveSy
parent e18d0b684d
commit 3b8dadc526
2 changed files with 30 additions and 2 deletions

View File

@ -22,14 +22,14 @@ package org.lsposed.lspd.hooker;
import static org.lsposed.lspd.core.ApplicationServiceClient.serviceClient; import static org.lsposed.lspd.core.ApplicationServiceClient.serviceClient;
import android.annotation.SuppressLint;
import android.app.ActivityThread; import android.app.ActivityThread;
import android.app.AndroidAppHelper; import android.app.AndroidAppHelper;
import android.app.LoadedApk; import android.app.LoadedApk;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.os.Bundle; import android.os.Build;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.lsposed.lspd.impl.LSPosedContext; import org.lsposed.lspd.impl.LSPosedContext;
import org.lsposed.lspd.util.Hookers; import org.lsposed.lspd.util.Hookers;
@ -38,6 +38,7 @@ import org.lsposed.lspd.util.Utils;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Map; import java.util.Map;
import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodHook;
@ -47,7 +48,22 @@ import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage; import de.robv.android.xposed.callbacks.XC_LoadPackage;
import io.github.libxposed.api.XposedModuleInterface; import io.github.libxposed.api.XposedModuleInterface;
@SuppressLint("BlockedPrivateApi")
public class LoadedApkGetCLHooker extends XC_MethodHook { public class LoadedApkGetCLHooker extends XC_MethodHook {
private final static Field defaultClassLoaderField;
static {
Field field = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
try {
field = LoadedApk.class.getDeclaredField("mDefaultClassLoader");
field.setAccessible(true);
} catch (Throwable ignored) {
}
}
defaultClassLoaderField = field;
}
private final LoadedApk loadedApk; private final LoadedApk loadedApk;
private final Unhook unhook; private final Unhook unhook;
@ -111,6 +127,16 @@ public class LoadedApkGetCLHooker extends XC_MethodHook {
return loadedApk.getApplicationInfo(); return loadedApk.getApplicationInfo();
} }
@NonNull
@Override
public ClassLoader getDefaultClassLoader() {
try {
return (ClassLoader) defaultClassLoaderField.get(loadedApk);
} catch (Throwable t) {
throw new IllegalStateException(t);
}
}
@NonNull @NonNull
@Override @Override
public ClassLoader getClassLoader() { public ClassLoader getClassLoader() {

View File

@ -3,6 +3,8 @@ package android.app;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
public final class LoadedApk { public final class LoadedApk {
private ClassLoader mDefaultClassLoader;
public ApplicationInfo getApplicationInfo() { public ApplicationInfo getApplicationInfo() {
throw new UnsupportedOperationException("STUB"); throw new UnsupportedOperationException("STUB");
} }