[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
This commit is contained in:
qinyige1
2023-02-22 11:02:53 +08:00
committed by Riddle Hsu
parent b98b2c84e7
commit 1440ee7834

View File

@@ -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);