Fix some missing onPackageLoad on Android U because of inline (#2802)

This commit is contained in:
LoveSy 2023-10-11 11:20:08 +08:00 committed by GitHub
parent c5e1a544bf
commit cbee741d55
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 9 deletions

View File

@ -32,13 +32,15 @@ import org.lsposed.lspd.hooker.AttachHooker;
import org.lsposed.lspd.hooker.CrashDumpHooker; import org.lsposed.lspd.hooker.CrashDumpHooker;
import org.lsposed.lspd.hooker.HandleSystemServerProcessHooker; import org.lsposed.lspd.hooker.HandleSystemServerProcessHooker;
import org.lsposed.lspd.hooker.LoadedApkCtorHooker; 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.hooker.OpenDexFileHooker;
import org.lsposed.lspd.impl.LSPosedContext; import org.lsposed.lspd.impl.LSPosedContext;
import org.lsposed.lspd.impl.LSPosedHelper; import org.lsposed.lspd.impl.LSPosedHelper;
import org.lsposed.lspd.service.ILSPApplicationService; import org.lsposed.lspd.service.ILSPApplicationService;
import org.lsposed.lspd.util.Utils; import org.lsposed.lspd.util.Utils;
import java.util.List;
import dalvik.system.DexFile; import dalvik.system.DexFile;
import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedInit; import de.robv.android.xposed.XposedInit;
@ -57,7 +59,7 @@ public class Startup {
LSPosedHelper.hookConstructor(LoadedApkCtorHooker.class, LoadedApk.class, LSPosedHelper.hookConstructor(LoadedApkCtorHooker.class, LoadedApk.class,
ActivityThread.class, ApplicationInfo.class, CompatibilityInfo.class, ActivityThread.class, ApplicationInfo.class, CompatibilityInfo.class,
ClassLoader.class, boolean.class, boolean.class, boolean.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"); LSPosedHelper.hookAllMethods(AttachHooker.class, ActivityThread.class, "attach");
} }

View File

@ -56,7 +56,7 @@ import io.github.libxposed.api.annotations.XposedHooker;
@SuppressLint("BlockedPrivateApi") @SuppressLint("BlockedPrivateApi")
@XposedHooker @XposedHooker
public class LoadedApkGetCLHooker implements XposedInterface.Hooker { public class LoadedApkCreateCLHooker implements XposedInterface.Hooker {
private final static Field defaultClassLoaderField; private final static Field defaultClassLoaderField;
private final static Set<LoadedApk> loadedApks = ConcurrentHashMap.newKeySet(); private final static Set<LoadedApk> loadedApks = ConcurrentHashMap.newKeySet();
@ -81,12 +81,12 @@ public class LoadedApkGetCLHooker implements XposedInterface.Hooker {
public static void afterHookedMethod(XposedInterface.AfterHookCallback callback) { public static void afterHookedMethod(XposedInterface.AfterHookCallback callback) {
LoadedApk loadedApk = (LoadedApk) callback.getThisObject(); LoadedApk loadedApk = (LoadedApk) callback.getThisObject();
if (!loadedApks.contains(loadedApk)) { if (callback.getArgs()[0] != null || !loadedApks.contains(loadedApk)) {
return; return;
} }
try { try {
Hookers.logD("LoadedApk#getClassLoader starts"); Hookers.logD("LoadedApk#createClassLoader starts");
String packageName = ActivityThread.currentPackageName(); String packageName = ActivityThread.currentPackageName();
String processName = ActivityThread.currentProcessName(); String processName = ActivityThread.currentProcessName();
@ -99,8 +99,8 @@ public class LoadedApkGetCLHooker implements XposedInterface.Hooker {
} }
Object mAppDir = XposedHelpers.getObjectField(loadedApk, "mAppDir"); Object mAppDir = XposedHelpers.getObjectField(loadedApk, "mAppDir");
ClassLoader classLoader = (ClassLoader) callback.getResult(); ClassLoader classLoader = (ClassLoader) XposedHelpers.getObjectField(loadedApk, "mClassLoader");
Hookers.logD("LoadedApk#getClassLoader ends: " + mAppDir + " -> " + classLoader); Hookers.logD("LoadedApk#createClassLoader ends: " + mAppDir + " -> " + classLoader);
if (classLoader == null) { if (classLoader == null) {
return; return;
@ -165,7 +165,7 @@ public class LoadedApkGetCLHooker implements XposedInterface.Hooker {
} }
}); });
} catch (Throwable t) { } catch (Throwable t) {
Hookers.logE("error when hooking LoadedApk#getClassLoader", t); Hookers.logE("error when hooking LoadedApk#createClassLoader", t);
} finally { } finally {
loadedApks.remove(loadedApk); loadedApks.remove(loadedApk);
} }

View File

@ -72,7 +72,7 @@ public class LoadedApkCtorHooker implements XposedInterface.Hooker {
return; return;
} }
LoadedApkGetCLHooker.addLoadedApk(loadedApk); LoadedApkCreateCLHooker.addLoadedApk(loadedApk);
} catch (Throwable t) { } catch (Throwable t) {
Hookers.logE("error when hooking LoadedApk.<init>", t); Hookers.logE("error when hooking LoadedApk.<init>", t);
} }