From cbee741d55be758b3061c1ec6e79d1cfbcf37a76 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Wed, 11 Oct 2023 11:20:08 +0800 Subject: [PATCH] Fix some missing onPackageLoad on Android U because of inline (#2802) --- .../src/main/java/org/lsposed/lspd/core/Startup.java | 6 ++++-- ...GetCLHooker.java => LoadedApkCreateCLHooker.java} | 12 ++++++------ .../org/lsposed/lspd/hooker/LoadedApkCtorHooker.java | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) rename core/src/main/java/org/lsposed/lspd/hooker/{LoadedApkGetCLHooker.java => LoadedApkCreateCLHooker.java} (93%) diff --git a/core/src/main/java/org/lsposed/lspd/core/Startup.java b/core/src/main/java/org/lsposed/lspd/core/Startup.java index 2bd4ff7a..e4d08b96 100644 --- a/core/src/main/java/org/lsposed/lspd/core/Startup.java +++ b/core/src/main/java/org/lsposed/lspd/core/Startup.java @@ -32,13 +32,15 @@ import org.lsposed.lspd.hooker.AttachHooker; import org.lsposed.lspd.hooker.CrashDumpHooker; import org.lsposed.lspd.hooker.HandleSystemServerProcessHooker; import org.lsposed.lspd.hooker.LoadedApkCtorHooker; -import org.lsposed.lspd.hooker.LoadedApkGetCLHooker; +import org.lsposed.lspd.hooker.LoadedApkCreateCLHooker; import org.lsposed.lspd.hooker.OpenDexFileHooker; import org.lsposed.lspd.impl.LSPosedContext; import org.lsposed.lspd.impl.LSPosedHelper; import org.lsposed.lspd.service.ILSPApplicationService; import org.lsposed.lspd.util.Utils; +import java.util.List; + import dalvik.system.DexFile; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedInit; @@ -57,7 +59,7 @@ public class Startup { LSPosedHelper.hookConstructor(LoadedApkCtorHooker.class, LoadedApk.class, ActivityThread.class, ApplicationInfo.class, CompatibilityInfo.class, ClassLoader.class, boolean.class, boolean.class, boolean.class); - LSPosedHelper.hookMethod(LoadedApkGetCLHooker.class, LoadedApk.class, "getClassLoader"); + LSPosedHelper.hookMethod(LoadedApkCreateCLHooker.class, LoadedApk.class, "createOrUpdateClassLoaderLocked", List.class); LSPosedHelper.hookAllMethods(AttachHooker.class, ActivityThread.class, "attach"); } diff --git a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkCreateCLHooker.java similarity index 93% rename from core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java rename to core/src/main/java/org/lsposed/lspd/hooker/LoadedApkCreateCLHooker.java index 48b60491..161c730e 100644 --- a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java +++ b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkCreateCLHooker.java @@ -56,7 +56,7 @@ import io.github.libxposed.api.annotations.XposedHooker; @SuppressLint("BlockedPrivateApi") @XposedHooker -public class LoadedApkGetCLHooker implements XposedInterface.Hooker { +public class LoadedApkCreateCLHooker implements XposedInterface.Hooker { private final static Field defaultClassLoaderField; private final static Set loadedApks = ConcurrentHashMap.newKeySet(); @@ -81,12 +81,12 @@ public class LoadedApkGetCLHooker implements XposedInterface.Hooker { public static void afterHookedMethod(XposedInterface.AfterHookCallback callback) { LoadedApk loadedApk = (LoadedApk) callback.getThisObject(); - if (!loadedApks.contains(loadedApk)) { + if (callback.getArgs()[0] != null || !loadedApks.contains(loadedApk)) { return; } try { - Hookers.logD("LoadedApk#getClassLoader starts"); + Hookers.logD("LoadedApk#createClassLoader starts"); String packageName = ActivityThread.currentPackageName(); String processName = ActivityThread.currentProcessName(); @@ -99,8 +99,8 @@ public class LoadedApkGetCLHooker implements XposedInterface.Hooker { } Object mAppDir = XposedHelpers.getObjectField(loadedApk, "mAppDir"); - ClassLoader classLoader = (ClassLoader) callback.getResult(); - Hookers.logD("LoadedApk#getClassLoader ends: " + mAppDir + " -> " + classLoader); + ClassLoader classLoader = (ClassLoader) XposedHelpers.getObjectField(loadedApk, "mClassLoader"); + Hookers.logD("LoadedApk#createClassLoader ends: " + mAppDir + " -> " + classLoader); if (classLoader == null) { return; @@ -165,7 +165,7 @@ public class LoadedApkGetCLHooker implements XposedInterface.Hooker { } }); } catch (Throwable t) { - Hookers.logE("error when hooking LoadedApk#getClassLoader", t); + Hookers.logE("error when hooking LoadedApk#createClassLoader", t); } finally { loadedApks.remove(loadedApk); } diff --git a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkCtorHooker.java b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkCtorHooker.java index 00f1f7ce..2ddbff32 100644 --- a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkCtorHooker.java +++ b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkCtorHooker.java @@ -72,7 +72,7 @@ public class LoadedApkCtorHooker implements XposedInterface.Hooker { return; } - LoadedApkGetCLHooker.addLoadedApk(loadedApk); + LoadedApkCreateCLHooker.addLoadedApk(loadedApk); } catch (Throwable t) { Hookers.logE("error when hooking LoadedApk.", t); }