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

Commit 1440ee78 authored by qinyige1's avatar qinyige1 Committed by Riddle Hsu
Browse files

[WMS][Bugfix] Catch exception when dump local window.

The local window may update its view on its ui thread.
Add synchronization in case the window is removing when dumping.
Also catch exception for the race condition inside the view.

Bug: 270280397
Test: Manual
Change-Id: Ic0268ffff9a6a087b9e18340783da0676bf9caee
parent b98b2c84
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.provider.Settings;
import android.util.DisplayMetrics;
import android.util.Pair;
import android.view.Display;
import android.view.IWindow;
import android.view.IWindowManager;
import android.view.ViewDebug;

@@ -553,6 +554,22 @@ public class WindowManagerShellCommand extends ShellCommand {
        return 0;
    }

    private void dumpLocalWindowAsync(IWindow client, ParcelFileDescriptor pfd) {
        // Make it asynchronous to avoid writer from being blocked
        // by waiting for the buffer to be consumed in the same process.
        IoThread.getExecutor().execute(() -> {
            synchronized (mInternal.mGlobalLock) {
                try {
                    client.executeCommand(ViewDebug.REMOTE_COMMAND_DUMP_ENCODED, null, pfd);
                } catch (Exception e) {
                    // Ignore RemoteException for local call. Just print trace for other
                    // exceptions caused by RC with tolerable low possibility.
                    e.printStackTrace();
                }
            }
        });
    }

    private int runDumpVisibleWindowViews(PrintWriter pw) {
        if (!mInternal.checkCallingPermission(android.Manifest.permission.DUMP,
                "runDumpVisibleWindowViews()")) {
@@ -575,16 +592,7 @@ public class WindowManagerShellCommand extends ShellCommand {
                            pipe = new ByteTransferPipe();
                            final ParcelFileDescriptor pfd = pipe.getWriteFd();
                            if (w.isClientLocal()) {
                                // Make it asynchronous to avoid writer from being blocked
                                // by waiting for the buffer to be consumed in the same process.
                                IoThread.getExecutor().execute(() -> {
                                    try {
                                        w.mClient.executeCommand(
                                                ViewDebug.REMOTE_COMMAND_DUMP_ENCODED, null, pfd);
                                    } catch (RemoteException e) {
                                        // Ignore for local call.
                                    }
                                });
                                dumpLocalWindowAsync(w.mClient, pfd);
                            } else {
                                w.mClient.executeCommand(
                                        ViewDebug.REMOTE_COMMAND_DUMP_ENCODED, null, pfd);