Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dca77daf authored by Daniel Norman's avatar Daniel Norman
Browse files

Runs the A11yManagerService package monitor on a dedicated thread.

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.

Fix: 348138695
Test: existing tests in `atest AccessibilityManagerService`
Test: install and uninstall packages, observe no change in behavior
Flag: com.android.server.accessibility.package_monitor_dedicated_thread
Change-Id: Idd112cfeb7e3e55d18d4596c28a90450aa72f682
parent 562064be
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -171,6 +171,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"
+14 −1
Original line number Diff line number Diff line
@@ -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();