diff --git a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java index 8fd4c81e..6e46905c 100644 --- a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java +++ b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java @@ -22,14 +22,14 @@ package org.lsposed.lspd.hooker; import static org.lsposed.lspd.core.ApplicationServiceClient.serviceClient; +import android.annotation.SuppressLint; import android.app.ActivityThread; import android.app.AndroidAppHelper; import android.app.LoadedApk; import android.content.pm.ApplicationInfo; -import android.os.Bundle; +import android.os.Build; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import org.lsposed.lspd.impl.LSPosedContext; import org.lsposed.lspd.util.Hookers; @@ -38,6 +38,7 @@ import org.lsposed.lspd.util.Utils; import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; import java.util.Map; 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 io.github.libxposed.api.XposedModuleInterface; +@SuppressLint("BlockedPrivateApi") 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 Unhook unhook; @@ -111,6 +127,16 @@ public class LoadedApkGetCLHooker extends XC_MethodHook { return loadedApk.getApplicationInfo(); } + @NonNull + @Override + public ClassLoader getDefaultClassLoader() { + try { + return (ClassLoader) defaultClassLoaderField.get(loadedApk); + } catch (Throwable t) { + throw new IllegalStateException(t); + } + } + @NonNull @Override public ClassLoader getClassLoader() { diff --git a/hiddenapi/stubs/src/main/java/android/app/LoadedApk.java b/hiddenapi/stubs/src/main/java/android/app/LoadedApk.java index 5966bcca..32f294c1 100644 --- a/hiddenapi/stubs/src/main/java/android/app/LoadedApk.java +++ b/hiddenapi/stubs/src/main/java/android/app/LoadedApk.java @@ -3,6 +3,8 @@ package android.app; import android.content.pm.ApplicationInfo; public final class LoadedApk { + private ClassLoader mDefaultClassLoader; + public ApplicationInfo getApplicationInfo() { throw new UnsupportedOperationException("STUB"); }