From 7112bb5a91db3eac96614ec17ae18259a70b8770 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Mon, 6 Mar 2023 20:50:48 +0800 Subject: [PATCH] Fix `isFirstPackage` (#2424) --- .../de/robv/android/xposed/XposedInit.java | 2 ++ .../lspd/hooker/LoadedApkCtorHooker.java | 6 +----- .../lspd/hooker/LoadedApkGetCLHooker.java | 20 +++++++++++++------ gradle.properties | 2 -- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/de/robv/android/xposed/XposedInit.java b/core/src/main/java/de/robv/android/xposed/XposedInit.java index 629bca4a..defee355 100644 --- a/core/src/main/java/de/robv/android/xposed/XposedInit.java +++ b/core/src/main/java/de/robv/android/xposed/XposedInit.java @@ -38,6 +38,7 @@ import android.content.res.XResources; import android.os.Build; import android.os.IBinder; import android.os.Process; +import android.util.ArrayMap; import android.util.Log; import org.lsposed.lspd.impl.LSPosedContext; @@ -241,6 +242,7 @@ public final class XposedInit { if (!LSPosedContext.loadModule(at, module)) { loadedModules.remove(module.packageName); } + ((ArrayMap) XposedHelpers.getObjectField(ActivityThread.currentActivityThread(), "mPackages")).clear(); }); } 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 7355a79f..3bde9d23 100644 --- a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkCtorHooker.java +++ b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkCtorHooker.java @@ -43,10 +43,6 @@ public class LoadedApkCtorHooker extends XC_MethodHook { try { LoadedApk loadedApk = (LoadedApk) param.thisObject; String packageName = loadedApk.getPackageName(); - boolean isFirstPackage = packageName != null && ActivityThread.currentProcessName() != null && packageName.equals(ActivityThread.currentPackageName()); - if (!isFirstPackage && !XposedInit.getLoadedModules().getOrDefault(packageName, Optional.of("")).isPresent()) { - return; - } Object mAppDir = XposedHelpers.getObjectField(loadedApk, "mAppDir"); Hookers.logD("LoadedApk# ends: " + mAppDir); @@ -81,7 +77,7 @@ public class LoadedApkCtorHooker extends XC_MethodHook { return; } - new LoadedApkGetCLHooker(loadedApk, isFirstPackage); + new LoadedApkGetCLHooker(loadedApk); } catch (Throwable t) { Hookers.logE("error when hooking LoadedApk.", t); } 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 d44521bc..27933e21 100644 --- a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java +++ b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java @@ -69,11 +69,8 @@ public class LoadedApkGetCLHooker extends XC_MethodHook { private final LoadedApk loadedApk; private final Unhook unhook; - private final boolean isFirstPackage; - - public LoadedApkGetCLHooker(LoadedApk loadedApk, boolean isFirstPackage) { + public LoadedApkGetCLHooker(LoadedApk loadedApk) { this.loadedApk = loadedApk; - this.isFirstPackage = isFirstPackage; unhook = XposedHelpers.findAndHookMethod(LoadedApk.class, "getClassLoader", this); } @@ -88,8 +85,15 @@ public class LoadedApkGetCLHooker extends XC_MethodHook { try { Hookers.logD("LoadedApk#getClassLoader starts"); - final String processName = ActivityThread.currentProcessName(); - final String packageName = isFirstPackage && "android".equals(ActivityThread.currentPackageName()) ? "system" : loadedApk.getPackageName(); + String packageName = ActivityThread.currentPackageName(); + String processName = ActivityThread.currentProcessName(); + boolean isFirstPackage = packageName != null && processName != null && packageName.equals(loadedApk.getPackageName()); + if (!isFirstPackage) { + packageName = loadedApk.getPackageName(); + processName = AndroidAppHelper.currentProcessName(); + } else if (packageName.equals("android")) { + packageName = "system"; + } Object mAppDir = XposedHelpers.getObjectField(loadedApk, "mAppDir"); ClassLoader classLoader = (ClassLoader) param.getResult(); @@ -99,6 +103,10 @@ public class LoadedApkGetCLHooker extends XC_MethodHook { return; } + if (!isFirstPackage && !XposedInit.getLoadedModules().getOrDefault(packageName, Optional.of("")).isPresent()) { + return; + } + XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam( XposedBridge.sLoadedPackageCallbacks); lpparam.packageName = packageName; diff --git a/gradle.properties b/gradle.properties index 72a2d379..69af2471 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,5 +17,3 @@ android.enableAppCompileTimeRClass=true android.nonTransitiveRClass=true android.enableR8.fullMode=true android.useAndroidX=true - -org.gradle.unsafe.configuration-cache=true