From 56b3ed5a55625dce2482e8b74370cec95588d15d Mon Sep 17 00:00:00 2001 From: david Date: Tue, 10 May 2022 18:30:34 +0800 Subject: [PATCH] noANR --- .../java/cn/myflv/android/noanr/Hook.java | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/cn/myflv/android/noanr/Hook.java b/app/src/main/java/cn/myflv/android/noanr/Hook.java index 21acc61..b34a4f0 100644 --- a/app/src/main/java/cn/myflv/android/noanr/Hook.java +++ b/app/src/main/java/cn/myflv/android/noanr/Hook.java @@ -80,19 +80,19 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable { log("packageManager is null"); } Object mParallelBroadcasts = XposedHelpers.getObjectField(broadcastQueue, "mParallelBroadcasts"); - removeList(mService, mParallelBroadcasts, ResolveInfo, BroadcastFilter, packageManager); + removeList(mService, mParallelBroadcasts, ResolveInfo, BroadcastFilter, packageManager, mServices); Object mPendingBroadcast = XposedHelpers.getObjectField(broadcastQueue, "mPendingBroadcast"); - remove(mService, mPendingBroadcast, ResolveInfo, BroadcastFilter, packageManager); + remove(mService, mPendingBroadcast, ResolveInfo, BroadcastFilter, packageManager, mServices); Object mDispatcher = XposedHelpers.getObjectField(broadcastQueue, "mDispatcher"); if (mDispatcher == null) return; Object mOrderedBroadcasts = XposedHelpers.getObjectField(mDispatcher, "mOrderedBroadcasts"); - removeList(mService, mOrderedBroadcasts, ResolveInfo, BroadcastFilter, packageManager); + removeList(mService, mOrderedBroadcasts, ResolveInfo, BroadcastFilter, packageManager, mServices); Object mAlarmBroadcasts = XposedHelpers.getObjectField(mDispatcher, "mAlarmBroadcasts"); - removeDeferralList(mService, mAlarmBroadcasts, ResolveInfo, BroadcastFilter, packageManager); + removeDeferralList(mService, mAlarmBroadcasts, ResolveInfo, BroadcastFilter, packageManager, mServices); Object mDeferredBroadcasts = XposedHelpers.getObjectField(mDispatcher, "mDeferredBroadcasts"); - removeDeferralList(mService, mDeferredBroadcasts, ResolveInfo, BroadcastFilter, packageManager); + removeDeferralList(mService, mDeferredBroadcasts, ResolveInfo, BroadcastFilter, packageManager, mServices); Object mCurrentBroadcast = XposedHelpers.getObjectField(mDispatcher, "mCurrentBroadcast"); - remove(mService, mCurrentBroadcast, ResolveInfo, BroadcastFilter, packageManager); + remove(mService, mCurrentBroadcast, ResolveInfo, BroadcastFilter, packageManager, mServices); } catch (Exception e) { log("Exception clean broadcast " + e.getMessage()); } @@ -120,27 +120,27 @@ public List toList(Object object) { } - public void removeDeferralList(Object activityManagerService, Object deferrals, Class ResolveInfo, Class BroadcastFilter, Object packageManager) { + public void removeDeferralList(Object activityManagerService, Object deferrals, Class ResolveInfo, Class BroadcastFilter, Object packageManager, Object activeServices) { List deferralList = toList(deferrals); if (deferralList != null && deferralList.size() > 0) { for (Object deferral : deferralList) { Object broadcastRecords = XposedHelpers.getObjectField(deferral, "broadcasts"); - removeList(activityManagerService, broadcastRecords, ResolveInfo, BroadcastFilter, packageManager); + removeList(activityManagerService, broadcastRecords, ResolveInfo, BroadcastFilter, packageManager, activeServices); } } } - public void removeList(Object activityManagerService, Object broadcastRecords, Class ResolveInfo, Class BroadcastFilter, Object packageManager) { + public void removeList(Object activityManagerService, Object broadcastRecords, Class ResolveInfo, Class BroadcastFilter, Object packageManager, Object activeServices) { List broadcastRecordList = toList(broadcastRecords); if (broadcastRecordList != null && broadcastRecordList.size() > 0) { for (Object broadcastRecord : broadcastRecordList) { - remove(activityManagerService, broadcastRecord, ResolveInfo, BroadcastFilter, packageManager); + remove(activityManagerService, broadcastRecord, ResolveInfo, BroadcastFilter, packageManager, activeServices); } } } - public void remove(Object activityManagerService, Object broadcastRecord, Class ResolveInfo, Class BroadcastFilter, Object packageManager) { + public void remove(Object activityManagerService, Object broadcastRecord, Class ResolveInfo, Class BroadcastFilter, Object packageManager, Object activeServices) { try { if (broadcastRecord == null) return; Object receiversList = XposedHelpers.getObjectField(broadcastRecord, "receivers"); @@ -184,8 +184,11 @@ public void remove(Object activityManagerService, Object broadcastRecord, Class< if (app != null) isRun = true; } if (packageName == null || uid == null || !isRun) continue; + final int finalUid = uid; + final String finalPackageName = packageName; + boolean appRestrictedAnyInBackground = (boolean) XposedHelpers.callMethod(activeServices, "appRestrictedAnyInBackground", finalUid, finalPackageName); boolean isOnDeviceIdleAllowlistLOSP = (boolean) XposedHelpers.callMethod(activityManagerService, "isOnDeviceIdleAllowlistLOSP", uid, false); - if (!isOnDeviceIdleAllowlistLOSP) { + if (!isOnDeviceIdleAllowlistLOSP && appRestrictedAnyInBackground) { receivers.remove(i); if (i < nextReceiver) { nextReceiver--;