From 7e6c23049405331f397fd97eaef663b1db0d33d4 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Thu, 27 May 2021 02:37:22 +0800 Subject: [PATCH] [core] Unblock receiver by calling finish receiver (#685) --- .../lsposed/lspd/service/ActivityManagerService.java | 7 +++++++ .../java/org/lsposed/lspd/service/LSPosedService.java | 10 ++++++++++ .../src/main/java/android/app/IActivityManager.java | 5 ++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/lsposed/lspd/service/ActivityManagerService.java b/core/src/main/java/org/lsposed/lspd/service/ActivityManagerService.java index 8164763c..ac90161d 100644 --- a/core/src/main/java/org/lsposed/lspd/service/ActivityManagerService.java +++ b/core/src/main/java/org/lsposed/lspd/service/ActivityManagerService.java @@ -110,6 +110,13 @@ public class ActivityManagerService { } } + public static void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, + boolean abortBroadcast, int flags) throws RemoteException { + IActivityManager am = getActivityManager(); + if (am == null || thread == null) return; + am.finishReceiver(who, resultCode, resultData, map, abortBroadcast, flags); + } + public static int bindService(Intent service, String resolvedType, IServiceConnection connection, int flags, String callingPackage, int userId) throws RemoteException { diff --git a/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java b/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java index c55a0817..c9ccc74b 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java @@ -186,6 +186,11 @@ public class LSPosedService extends ILSPosedService.Stub { @Override public void performReceive(Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, int sendingUser) { new Thread(() -> dispatchPackageChanged(intent)).start(); + try { + ActivityManagerService.finishReceiver(this, resultCode, data, extras, false, intent.getFlags()); + } catch (Throwable e) { + Log.e(TAG, "finish receiver", e); + } } }; @@ -205,6 +210,11 @@ public class LSPosedService extends ILSPosedService.Stub { @Override public void performReceive(Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, int sendingUser) { new Thread(() -> dispatchBootCompleted(intent)).start(); + try { + ActivityManagerService.finishReceiver(this, resultCode, data, extras, false, intent.getFlags()); + } catch (Throwable e) { + Log.e(TAG, "finish receiver", e); + } } }, intentFilter, null, 0, 0); } catch (Throwable e) { diff --git a/hiddenapi-stubs/src/main/java/android/app/IActivityManager.java b/hiddenapi-stubs/src/main/java/android/app/IActivityManager.java index 6562390e..fb9387d1 100644 --- a/hiddenapi-stubs/src/main/java/android/app/IActivityManager.java +++ b/hiddenapi-stubs/src/main/java/android/app/IActivityManager.java @@ -70,7 +70,10 @@ public interface IActivityManager extends IInterface { Intent registerReceiver(IApplicationThread caller, String callerPackage, IIntentReceiver receiver, IntentFilter filter, - String requiredPermission, int userId, int flags); + String requiredPermission, int userId, int flags) throws RemoteException; + + void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, + boolean abortBroadcast, int flags) throws RemoteException; @RequiresApi(30) Intent registerReceiverWithFeature(IApplicationThread caller, String callerPackage,