From 6cdb907c01786a11487cd6c43e5032d29f60b1ad Mon Sep 17 00:00:00 2001 From: absence Date: Thu, 3 Jul 2025 00:17:00 +0800 Subject: [PATCH] fix #307 Add multi-user support --- .../commands/monkey/framework/APIAdapter.java | 52 ++++++++++++++++++- .../monkey/framework/AndroidDevice.java | 2 +- .../monkey/source/MonkeySourceApeNative.java | 4 +- .../monkey/source/MonkeySourceRandom.java | 4 +- 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/monkey/src/main/java/com/android/commands/monkey/framework/APIAdapter.java b/monkey/src/main/java/com/android/commands/monkey/framework/APIAdapter.java index aa0e8be..8cf059c 100755 --- a/monkey/src/main/java/com/android/commands/monkey/framework/APIAdapter.java +++ b/monkey/src/main/java/com/android/commands/monkey/framework/APIAdapter.java @@ -31,6 +31,8 @@ import android.content.pm.PackageManager; import android.content.pm.PermissionInfo; import android.content.pm.ResolveInfo; +import android.content.pm.UserInfo; +import android.content.pm.PackageInfo; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; @@ -163,8 +165,45 @@ private static Object invokek(Method method, Object reciver, Object... args) { } } + private static int getCurrentUser() { + IActivityManager mAm = getActivityManager(); + Class clazz = mAm.getClass(); + String name = "getCurrentUser"; + Method method = findMethod(clazz, name); + if (method != null) { + Object obj = invoke(method, mAm); + if(obj instanceof UserInfo) { + return ((UserInfo) obj).id; + } else if( obj instanceof Integer){ + return (int) obj; + } + } + return 0; + } + + public static PackageInfo getPackageInfo(PackageManager mPm, String packageName, int flags) + throws PackageManager.NameNotFoundException { + int userId = getCurrentUser(); + Class clazz = mPm.getClass(); + String name = "getPackageInfoAsUser"; + Method method = findMethod(clazz, name, String.class, int.class, int.class); + if (method != null) { + return (PackageInfo) invoke(method, mPm, packageName, flags, userId); + } else { + return mPm.getPackageInfo(packageName, flags); + } + } + public static List queryIntentActivities(PackageManager mPm, Intent intent) { - return mPm.queryIntentActivities(intent, 0); + int userId = getCurrentUser(); + Class clazz = mPm.getClass(); + String name = "queryIntentActivitiesAsUser"; + Method method = findMethod(clazz, name, Intent.class, int.class, int.class); + if (method != null) { + return (List) invoke(method, mPm, intent, 0, userId); + }else { + return mPm.queryIntentActivities(intent, 0); + } } @SuppressWarnings("unchecked") @@ -242,6 +281,17 @@ public static Object startActivity(IActivityManager mAm, Intent paramIntent) { String.class, Intent.class, String.class, IBinder.class, String.class, int.class, int.class, ProfilerInfo.class, Bundle.class); + int userId = getCurrentUser(); + String name = "startActivityAsUser"; + Method method = findMethod(c0, name, IApplicationThread.class, + String.class, Intent.class, String.class, IBinder.class, + String.class, int.class, int.class, ProfilerInfo.class, Bundle.class, int.class); + + if (method != null) { + Logger.println("invoker startActivityAsUser"); + return invokek(method, mAm, null, null, paramIntent, null, null, null, 0, 0, null, null, userId); + } + if (m0 != null) { return invokek(m0, mAm, null, null, paramIntent, null, null, null, 0, 0, null, null); } diff --git a/monkey/src/main/java/com/android/commands/monkey/framework/AndroidDevice.java b/monkey/src/main/java/com/android/commands/monkey/framework/AndroidDevice.java index 27d0021..afd0a47 100755 --- a/monkey/src/main/java/com/android/commands/monkey/framework/AndroidDevice.java +++ b/monkey/src/main/java/com/android/commands/monkey/framework/AndroidDevice.java @@ -249,7 +249,7 @@ public static boolean checkAndSetInputMethod() { public static String[] getGrantedPermissions(String packageName) { PackageInfo packageInfo = null; try { - packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS); + packageInfo = APIAdapter.getPackageInfo(packageManager, packageName, PackageManager.GET_PERMISSIONS); if (packageInfo == null) { return new String[0]; diff --git a/monkey/src/main/java/com/android/commands/monkey/source/MonkeySourceApeNative.java b/monkey/src/main/java/com/android/commands/monkey/source/MonkeySourceApeNative.java index 341cf25..2997725 100755 --- a/monkey/src/main/java/com/android/commands/monkey/source/MonkeySourceApeNative.java +++ b/monkey/src/main/java/com/android/commands/monkey/source/MonkeySourceApeNative.java @@ -87,6 +87,7 @@ import com.android.commands.monkey.fastbot.client.ActionType; import com.android.commands.monkey.fastbot.client.Operate; import com.android.commands.monkey.framework.AndroidDevice; +import com.android.commands.monkey.framework.APIAdapter; import com.android.commands.monkey.events.base.mutation.MutationAirplaneEvent; import com.android.commands.monkey.events.base.mutation.MutationAlwaysFinishActivityEvent; import com.android.commands.monkey.events.base.mutation.MutationWifiEvent; @@ -1160,7 +1161,8 @@ private void generateFuzzingEvents(FuzzAction action) { private void getTotalActivities() { try { for (String p : MonkeyUtils.getPackageFilter().getmValidPackages()) { - PackageInfo packageInfo = AndroidDevice.packageManager.getPackageInfo(p, PackageManager.GET_ACTIVITIES); + PackageInfo packageInfo = APIAdapter.getPackageInfo(AndroidDevice.packageManager, + p, PackageManager.GET_ACTIVITIES); if (packageInfo != null) { if (packageInfo.packageName.equals("com.android.packageinstaller")) continue; diff --git a/monkey/src/main/java/com/android/commands/monkey/source/MonkeySourceRandom.java b/monkey/src/main/java/com/android/commands/monkey/source/MonkeySourceRandom.java index d11b5d5..ed0af36 100755 --- a/monkey/src/main/java/com/android/commands/monkey/source/MonkeySourceRandom.java +++ b/monkey/src/main/java/com/android/commands/monkey/source/MonkeySourceRandom.java @@ -43,6 +43,7 @@ import com.android.commands.monkey.events.base.MonkeyTouchEvent; import com.android.commands.monkey.events.base.MonkeyTrackballEvent; import com.android.commands.monkey.framework.AndroidDevice; +import com.android.commands.monkey.framework.APIAdapter; import com.android.commands.monkey.utils.Logger; import com.android.commands.monkey.utils.Utils; @@ -602,7 +603,8 @@ protected void generateThrottleEvent(long base) { private void getTotalAcitivities() { try { for (String p : MonkeyUtils.getPackageFilter().getmValidPackages()) { - PackageInfo packageInfo = AndroidDevice.packageManager.getPackageInfo(p, PackageManager.GET_ACTIVITIES); + PackageInfo packageInfo = APIAdapter.getPackageInfo(AndroidDevice.packageManager, + p, PackageManager.GET_ACTIVITIES); if (packageInfo != null) { if (packageInfo.packageName.equals("com.android.packageinstaller")) continue;