From 97ef900125bafd7df887be49afa3cfc21f80f972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E9=9B=AA=E7=8F=8A?= Date: Sat, 26 Feb 2022 04:26:35 +0800 Subject: [PATCH] Fix parasitic manager state restore on 8.1 (#1726) --- .../lspd/util/ParasiticManagerHooker.java | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java b/core/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java index 7c4401cb..6e031d02 100644 --- a/core/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java +++ b/core/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java @@ -116,7 +116,6 @@ public class ParasiticManagerHooker { } }); - var activityClientRecordClass = XposedHelpers.findClass("android.app.ActivityThread$ActivityClientRecord", ActivityThread.class.getClassLoader()); var activityHooker = new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) { @@ -129,8 +128,30 @@ public class ParasiticManagerHooker { if ("org.lsposed.manager.ui.activity.MainActivity".equals(activity.name)) { activity.applicationInfo = pkgInfo.applicationInfo; param.args[i] = activity; + break; } } + + for (var j = 0; j < param.args.length; ++j) { + if (param.args[j] instanceof Bundle) { + Hookers.logD("loading state of " + aInfo.name); + int stateId = j; + states.computeIfPresent(aInfo.name, (k, v) -> { + param.args[stateId] = v; + return v; + }); + continue; + } + if (param.args[j] instanceof PersistableBundle) { + Hookers.logD("loading persistentState of " + aInfo.name); + int persistentStateId = j; + states.computeIfPresent(aInfo.name, (k, v) -> { + param.args[persistentStateId] = v; + return v; + }); + } + } + continue; } if (param.args[i] instanceof Intent) { var intent = (Intent) param.args[i]; @@ -139,25 +160,8 @@ public class ParasiticManagerHooker { } } } - - @Override - protected void afterHookedMethod(MethodHookParam param) { - for (var i = 0; i < param.args.length; ++i) { - if (param.args[i] instanceof ActivityInfo) { - var aInfo = (ActivityInfo) param.args[i]; - Hookers.logD("loading state of " + aInfo.name); - states.computeIfPresent(aInfo.name, (k, v) -> { - XposedHelpers.setObjectField(param.thisObject, "state", v); - return v; - }); - persistentStates.computeIfPresent(aInfo.name, (k, v) -> { - XposedHelpers.setObjectField(param.thisObject, "persistentState", v); - return v; - }); - } - } - } }; + var activityClientRecordClass = XposedHelpers.findClass("android.app.ActivityThread$ActivityClientRecord", ActivityThread.class.getClassLoader()); XposedBridge.hookAllConstructors(activityClientRecordClass, activityHooker); if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1) {