diff options
-rw-r--r-- | services/accessibility/accessibility.aconfig | 10 | ||||
-rw-r--r-- | services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java | 15 |
2 files changed, 24 insertions, 1 deletions
diff --git a/services/accessibility/accessibility.aconfig b/services/accessibility/accessibility.aconfig index ee3bbcaf711d..1280a048ed32 100644 --- a/services/accessibility/accessibility.aconfig +++ b/services/accessibility/accessibility.aconfig @@ -172,6 +172,16 @@ flag { } flag { + name: "package_monitor_dedicated_thread" + namespace: "accessibility" + description: "Runs the A11yManagerService PackageMonitor on a dedicated thread" + bug: "348138695" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "manager_package_monitor_logic_fix" namespace: "accessibility" description: "Corrects the return values of the HandleForceStop function" diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index d595d02016e0..a23eb6748481 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -116,6 +116,7 @@ import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.os.HandlerThread; import android.os.IBinder; import android.os.Looper; import android.os.Message; @@ -901,7 +902,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub private void registerBroadcastReceivers() { // package changes mPackageMonitor = new ManagerPackageMonitor(this); - mPackageMonitor.register(mContext, null, UserHandle.ALL, true); + final Looper packageMonitorLooper; + if (Flags.packageMonitorDedicatedThread()) { + // Use a dedicated thread because the default BackgroundThread used by PackageMonitor + // is shared by other components and can get busy, causing a delay and eventual ANR when + // responding to broadcasts sent to this PackageMonitor. + HandlerThread packageMonitorThread = new HandlerThread(LOG_TAG + " PackageMonitor", + Process.THREAD_PRIORITY_BACKGROUND); + packageMonitorThread.start(); + packageMonitorLooper = packageMonitorThread.getLooper(); + } else { + packageMonitorLooper = null; + } + mPackageMonitor.register(mContext, packageMonitorLooper, UserHandle.ALL, true); // user change and unlock IntentFilter intentFilter = new IntentFilter(); |