Delay the loaded package callbacks
util LoadedApk#getClassLoader is called
This commit is contained in:
parent
a26990ec99
commit
9256898503
|
|
@ -1,4 +1,4 @@
|
||||||
version: '0.4.5.4_beta({build})'
|
version: '0.4.5.5_beta({build})'
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
ANDROID_HOME: C:\android-sdk-windows
|
ANDROID_HOME: C:\android-sdk-windows
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,7 @@ import android.content.res.CompatibilityInfo;
|
||||||
import android.content.res.XResources;
|
import android.content.res.XResources;
|
||||||
|
|
||||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||||
import com.elderdrivers.riru.edxp.hooker.SliceProviderFix;
|
|
||||||
import com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker;
|
import com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker;
|
||||||
import com.elderdrivers.riru.edxp.hooker.XposedInstallerHooker;
|
|
||||||
import com.elderdrivers.riru.edxp.util.Hookers;
|
import com.elderdrivers.riru.edxp.util.Hookers;
|
||||||
import com.elderdrivers.riru.edxp.util.Utils;
|
import com.elderdrivers.riru.edxp.util.Utils;
|
||||||
|
|
||||||
|
|
@ -18,11 +16,6 @@ import de.robv.android.xposed.XC_MethodHook;
|
||||||
import de.robv.android.xposed.XposedBridge;
|
import de.robv.android.xposed.XposedBridge;
|
||||||
import de.robv.android.xposed.XposedHelpers;
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
import de.robv.android.xposed.XposedInit;
|
import de.robv.android.xposed.XposedInit;
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
|
||||||
|
|
||||||
import static com.elderdrivers.riru.edxp.config.InstallerChooser.INSTALLER_PACKAGE_NAME;
|
|
||||||
import static com.elderdrivers.riru.edxp.hooker.SliceProviderFix.SYSTEMUI_PACKAGE_NAME;
|
|
||||||
import static com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker.BLACK_LIST_PACKAGE_NAME;
|
|
||||||
|
|
||||||
// normal process initialization (for new Activity, Service, BroadcastReceiver etc.)
|
// normal process initialization (for new Activity, Service, BroadcastReceiver etc.)
|
||||||
public class HandleBindApp extends XC_MethodHook {
|
public class HandleBindApp extends XC_MethodHook {
|
||||||
|
|
@ -64,23 +57,13 @@ public class HandleBindApp extends XC_MethodHook {
|
||||||
|
|
||||||
XResources.setPackageNameForResDir(appInfo.packageName, loadedApk.getResDir());
|
XResources.setPackageNameForResDir(appInfo.packageName, loadedApk.getResDir());
|
||||||
|
|
||||||
XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
|
String processName = (String) XposedHelpers.getObjectField(bindData, "processName");
|
||||||
lpparam.packageName = reportedPackageName;
|
|
||||||
lpparam.processName = (String) XposedHelpers.getObjectField(bindData, "processName");
|
LoadedApkGetCL hook = new LoadedApkGetCL(loadedApk, reportedPackageName,
|
||||||
lpparam.classLoader = loadedApk.getClassLoader();
|
processName, true);
|
||||||
lpparam.appInfo = appInfo;
|
hook.setUnhook(XposedHelpers.findAndHookMethod(
|
||||||
lpparam.isFirstApplication = true;
|
LoadedApk.class, "getClassLoader", hook));
|
||||||
XC_LoadPackage.callAll(lpparam);
|
|
||||||
|
|
||||||
if (reportedPackageName.equals(INSTALLER_PACKAGE_NAME)) {
|
|
||||||
XposedInstallerHooker.hookXposedInstaller(lpparam.classLoader);
|
|
||||||
}
|
|
||||||
if (reportedPackageName.equals(BLACK_LIST_PACKAGE_NAME)) {
|
|
||||||
XposedBlackListHooker.hook(lpparam.classLoader);
|
|
||||||
}
|
|
||||||
if (reportedPackageName.equals(SYSTEMUI_PACKAGE_NAME)) {
|
|
||||||
SliceProviderFix.hook();
|
|
||||||
}
|
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
Hookers.logE("error when hooking bindApp", t);
|
Hookers.logE("error when hooking bindApp", t);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,10 +9,8 @@ import com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker;
|
||||||
import com.elderdrivers.riru.edxp.util.Hookers;
|
import com.elderdrivers.riru.edxp.util.Hookers;
|
||||||
|
|
||||||
import de.robv.android.xposed.XC_MethodHook;
|
import de.robv.android.xposed.XC_MethodHook;
|
||||||
import de.robv.android.xposed.XposedBridge;
|
|
||||||
import de.robv.android.xposed.XposedHelpers;
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
import de.robv.android.xposed.XposedInit;
|
import de.robv.android.xposed.XposedInit;
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
|
||||||
|
|
||||||
// when a package is loaded for an existing process, trigger the callbacks as well
|
// when a package is loaded for an existing process, trigger the callbacks as well
|
||||||
// ed: remove resources related hooking
|
// ed: remove resources related hooking
|
||||||
|
|
@ -61,13 +59,11 @@ public class LoadedApkCstr extends XC_MethodHook {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
|
LoadedApkGetCL hook = new LoadedApkGetCL(loadedApk, packageName,
|
||||||
lpparam.packageName = packageName;
|
AndroidAppHelper.currentProcessName(), false);
|
||||||
lpparam.processName = AndroidAppHelper.currentProcessName();
|
hook.setUnhook(XposedHelpers.findAndHookMethod(
|
||||||
lpparam.classLoader = loadedApk.getClassLoader();
|
LoadedApk.class, "getClassLoader", hook));
|
||||||
lpparam.appInfo = loadedApk.getApplicationInfo();
|
|
||||||
lpparam.isFirstApplication = false;
|
|
||||||
XC_LoadPackage.callAll(lpparam);
|
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
Hookers.logE("error when hooking LoadedApk.<init>", t);
|
Hookers.logE("error when hooking LoadedApk.<init>", t);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
package com.elderdrivers.riru.edxp._hooker.impl;
|
||||||
|
|
||||||
|
import android.app.LoadedApk;
|
||||||
|
|
||||||
|
import com.elderdrivers.riru.edxp.hooker.SliceProviderFix;
|
||||||
|
import com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker;
|
||||||
|
import com.elderdrivers.riru.edxp.hooker.XposedInstallerHooker;
|
||||||
|
import com.elderdrivers.riru.edxp.util.Hookers;
|
||||||
|
|
||||||
|
import de.robv.android.xposed.XC_MethodHook;
|
||||||
|
import de.robv.android.xposed.XposedBridge;
|
||||||
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
|
import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
||||||
|
|
||||||
|
import static com.elderdrivers.riru.edxp.config.InstallerChooser.INSTALLER_PACKAGE_NAME;
|
||||||
|
import static com.elderdrivers.riru.edxp.hooker.SliceProviderFix.SYSTEMUI_PACKAGE_NAME;
|
||||||
|
import static com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker.BLACK_LIST_PACKAGE_NAME;
|
||||||
|
|
||||||
|
|
||||||
|
public class LoadedApkGetCL extends XC_MethodHook {
|
||||||
|
|
||||||
|
private final LoadedApk loadedApk;
|
||||||
|
private final String packageName;
|
||||||
|
private final String processName;
|
||||||
|
private final boolean isFirstApplication;
|
||||||
|
private Unhook unhook;
|
||||||
|
|
||||||
|
public LoadedApkGetCL(LoadedApk loadedApk, String packageName, String processName,
|
||||||
|
boolean isFirstApplication) {
|
||||||
|
this.loadedApk = loadedApk;
|
||||||
|
this.packageName = packageName;
|
||||||
|
this.processName = processName;
|
||||||
|
this.isFirstApplication = isFirstApplication;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
if (XposedBlackListHooker.shouldDisableHooks("")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hookers.logD("LoadedApk#getClassLoader starts");
|
||||||
|
|
||||||
|
LoadedApk loadedApk = (LoadedApk) param.thisObject;
|
||||||
|
|
||||||
|
if (loadedApk != this.loadedApk) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object mAppDir = XposedHelpers.getObjectField(loadedApk, "mAppDir");
|
||||||
|
ClassLoader classLoader = (ClassLoader) param.getResult();
|
||||||
|
Hookers.logD("LoadedApk#getClassLoader ends: " + mAppDir + " -> " + classLoader);
|
||||||
|
|
||||||
|
if (classLoader == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(
|
||||||
|
XposedBridge.sLoadedPackageCallbacks);
|
||||||
|
lpparam.packageName = this.packageName;
|
||||||
|
lpparam.processName = this.processName;
|
||||||
|
lpparam.classLoader = classLoader;
|
||||||
|
lpparam.appInfo = loadedApk.getApplicationInfo();
|
||||||
|
lpparam.isFirstApplication = this.isFirstApplication;
|
||||||
|
XC_LoadPackage.callAll(lpparam);
|
||||||
|
|
||||||
|
if (this.packageName.equals(INSTALLER_PACKAGE_NAME)) {
|
||||||
|
XposedInstallerHooker.hookXposedInstaller(lpparam.classLoader);
|
||||||
|
}
|
||||||
|
if (this.packageName.equals(BLACK_LIST_PACKAGE_NAME)) {
|
||||||
|
XposedBlackListHooker.hook(lpparam.classLoader);
|
||||||
|
}
|
||||||
|
if (this.packageName.equals(SYSTEMUI_PACKAGE_NAME)) {
|
||||||
|
SliceProviderFix.hook();
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Throwable t) {
|
||||||
|
Hookers.logE("error when hooking LoadedApk#getClassLoader", t);
|
||||||
|
} finally {
|
||||||
|
if (unhook != null) {
|
||||||
|
unhook.unhook();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUnhook(Unhook unhook) {
|
||||||
|
this.unhook = unhook;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Unhook getUnhook() {
|
||||||
|
return unhook;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,7 +4,7 @@ import org.gradle.internal.os.OperatingSystem
|
||||||
apply plugin: 'com.android.library'
|
apply plugin: 'com.android.library'
|
||||||
|
|
||||||
// Values set here will be overriden by AppVeyor, feel free to modify during development.
|
// Values set here will be overriden by AppVeyor, feel free to modify during development.
|
||||||
def buildVersionName = 'v0.4.5.4_beta'
|
def buildVersionName = 'v0.4.5.5_beta'
|
||||||
def buildVersionCode = 10000
|
def buildVersionCode = 10000
|
||||||
|
|
||||||
if (System.env.APPVEYOR_BUILD_VERSION != null) {
|
if (System.env.APPVEYOR_BUILD_VERSION != null) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue