From 65e8de3fded5d007813f9b8dfd3a4ff0fe41534f Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Thu, 4 Apr 2019 11:01:41 -0700 Subject: [PATCH] Fix issue #129936402: Runtime restart occurs when suspending an app... NPE at com.android.server.appop.AppOpsService.notifyOpChanged(AppOpsService.java:1431) Wasn't checking for a null callback list, and also fixed threading issues. Fixes: 129936402 Test: Manual Change-Id: I9c39429421643ebc10e78679c2bec52827603da1 --- .../com/android/server/appop/AppOpsService.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index c9e7cfa732597..d073bc60c766a 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -782,13 +782,20 @@ public class AppOpsService extends IAppOpsService.Stub { final int[] changedUids = intent.getIntArrayExtra(Intent.EXTRA_CHANGED_UID_LIST); final String[] changedPkgs = intent.getStringArrayExtra( Intent.EXTRA_CHANGED_PACKAGE_LIST); - final ArraySet callbacks = mOpModeWatchers.get(OP_PLAY_AUDIO); + ArraySet callbacks; + synchronized (AppOpsService.this) { + callbacks = mOpModeWatchers.get(OP_PLAY_AUDIO); + if (callbacks == null) { + return; + } + callbacks = new ArraySet<>(callbacks); + } for (int i = 0; i < changedUids.length; i++) { final int changedUid = changedUids[i]; final String changedPkg = changedPkgs[i]; - // We trust packagemanager to insert matching uid and packageNames in the extras - mHandler.sendMessage(PooledLambda.obtainMessage(AppOpsService::notifyOpChanged, - AppOpsService.this, callbacks, OP_PLAY_AUDIO, changedUid, changedPkg)); + // We trust packagemanager to insert matching uid and packageNames in the + // extras + notifyOpChanged(callbacks, OP_PLAY_AUDIO, changedUid, changedPkg); } } }, packageSuspendFilter);