Fix some missing onPackageLoad on Android U because of inline (#2802)
This commit is contained in:
parent
c5e1a544bf
commit
cbee741d55
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue