From d2b60176849afb5591d5addc20b68dfd0cd3a98b Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 14 Sep 2020 12:56:42 -0700 Subject: [PATCH] Link wm shell command to enable protolog in shell - Pass through unhandled logging commands to SysUI to simplify enabling/disabling logging for the shell. Bug: 168497382 Test: adb shell wm logging enable-text WM_SHELL_TASK_ORG Test: adb shell wm logging enable-text WM_DEBUG_RECENTS_ANIMATIONS Change-Id: I37942eaee82fdcf545212b18375f3d3e2638b8ee --- .../android/os/BasicShellCommandHandler.java | 12 ++++ .../internal/protolog/BaseProtoLogImpl.java | 1 - .../internal/statusbar/IStatusBar.aidl | 6 ++ .../wm/shell/protolog/ShellProtoLogGroup.java | 2 + .../wm/shell/protolog/ShellProtoLogImpl.java | 15 ++--- .../systemui/statusbar/CommandQueue.java | 35 ++++++++++++ .../com/android/systemui/wmshell/WMShell.java | 56 ++++++++++++------- .../android/systemui/wmshell/WMShellTest.java | 7 ++- .../statusbar/StatusBarManagerInternal.java | 6 ++ .../statusbar/StatusBarManagerService.java | 10 ++++ .../server/wm/WindowManagerShellCommand.java | 20 ++++++- 11 files changed, 137 insertions(+), 33 deletions(-) diff --git a/core/java/android/os/BasicShellCommandHandler.java b/core/java/android/os/BasicShellCommandHandler.java index 1ea2229cff1ff..366da3db00109 100644 --- a/core/java/android/os/BasicShellCommandHandler.java +++ b/core/java/android/os/BasicShellCommandHandler.java @@ -263,6 +263,18 @@ public abstract class BasicShellCommandHandler { } } + /** + * @return all the remaining arguments in the command without moving the current position. + */ + public String[] peekRemainingArgs() { + int remaining = getRemainingArgsCount(); + String[] args = new String[remaining]; + for (int pos = mArgPos; pos < mArgs.length; pos++) { + args[pos - mArgPos] = mArgs[pos]; + } + return args; + } + /** * Returns number of arguments that haven't been processed yet. */ diff --git a/core/java/com/android/internal/protolog/BaseProtoLogImpl.java b/core/java/com/android/internal/protolog/BaseProtoLogImpl.java index 8a4eb4a9ca71b..bed85aed36257 100644 --- a/core/java/com/android/internal/protolog/BaseProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/BaseProtoLogImpl.java @@ -277,7 +277,6 @@ public class BaseProtoLogImpl { String group = groups[i]; IProtoLogGroup g = LOG_GROUPS.get(group); if (g != null) { - System.out.println("G: "+ g); if (setTextLogging) { g.setLogToLogcat(value); } else { diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index ef2dfd599fb63..cc2934fd8dc52 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -22,6 +22,7 @@ import android.graphics.Rect; import android.hardware.biometrics.IBiometricSysuiReceiver; import android.hardware.biometrics.PromptInfo; import android.os.Bundle; +import android.os.ParcelFileDescriptor; import android.service.notification.StatusBarNotification; import com.android.internal.statusbar.StatusBarIcon; @@ -223,6 +224,11 @@ oneway interface IStatusBar */ void stopTracing(); + /** + * Handles a logging command from the WM shell command. + */ + void handleWindowManagerLoggingCommand(in String[] args, in ParcelFileDescriptor outFd); + /** * If true, suppresses the ambient display from showing. If false, re-enables the ambient * display. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java b/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java index ae0975467e3f6..e3029e55a2143 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java @@ -24,6 +24,8 @@ import com.android.internal.protolog.common.IProtoLogGroup; * This file is used by the ProtoLogTool to generate optimized logging code. */ public enum ShellProtoLogGroup implements IProtoLogGroup { + // NOTE: Since we enable these from the same WM ShellCommand, these names should not conflict + // with those in the framework ProtoLogGroup WM_SHELL_TASK_ORG(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM_SHELL), TEST_GROUP(true, true, false, "WindowManagerShellProtoLogTest"); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogImpl.java b/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogImpl.java index 6a925e74e8476..66ecf453c3628 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogImpl.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogImpl.java @@ -44,8 +44,6 @@ public class ShellProtoLogImpl extends BaseProtoLogImpl { private static ShellProtoLogImpl sServiceInstance = null; - private final PrintWriter mSystemOutWriter; - static { addLogGroupEnum(ShellProtoLogGroup.values()); } @@ -111,11 +109,11 @@ public class ShellProtoLogImpl extends BaseProtoLogImpl { return sServiceInstance; } - public void startTextLogging(Context context, String... groups) { + public int startTextLogging(Context context, String[] groups, PrintWriter pw) { try { mViewerConfig.loadViewerConfig( context.getResources().openRawResource(R.raw.wm_shell_protolog)); - setLogging(true /* setTextLogging */, true, mSystemOutWriter, groups); + return setLogging(true /* setTextLogging */, true, pw, groups); } catch (IOException e) { Log.i(TAG, "Unable to load log definitions: IOException while reading " + "wm_shell_protolog. " + e); @@ -123,16 +121,15 @@ public class ShellProtoLogImpl extends BaseProtoLogImpl { Log.i(TAG, "Unable to load log definitions: JSON parsing exception while reading " + "wm_shell_protolog. " + e); } + return -1; } - public void stopTextLogging(String... groups) { - setLogging(true /* setTextLogging */, false, mSystemOutWriter, groups); + public int stopTextLogging(String[] groups, PrintWriter pw) { + return setLogging(true /* setTextLogging */, false, pw, groups); } private ShellProtoLogImpl() { - super(new File(LOG_FILENAME), null, BUFFER_CAPACITY, - new ProtoLogViewerConfigReader()); - mSystemOutWriter = new PrintWriter(System.out, true); + super(new File(LOG_FILENAME), null, BUFFER_CAPACITY, new ProtoLogViewerConfigReader()); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 4673ec73c25a3..37ae791bf1726 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -44,6 +44,8 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; +import android.os.ParcelFileDescriptor; +import android.util.Log; import android.util.Pair; import android.util.SparseArray; import android.view.InsetsState.InternalInsetsType; @@ -59,7 +61,9 @@ import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.policy.CallbackController; import com.android.systemui.tracing.ProtoTracer; +import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; /** * This class takes the functions from IStatusBar that come in on @@ -70,6 +74,8 @@ import java.util.ArrayList; */ public class CommandQueue extends IStatusBar.Stub implements CallbackController, DisplayManager.DisplayListener { + private static final String TAG = CommandQueue.class.getSimpleName(); + private static final int INDEX_MASK = 0xffff; private static final int MSG_SHIFT = 16; private static final int MSG_MASK = 0xffff << MSG_SHIFT; @@ -131,6 +137,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< private static final int MSG_TRACING_STATE_CHANGED = 55 << MSG_SHIFT; private static final int MSG_SUPPRESS_AMBIENT_DISPLAY = 56 << MSG_SHIFT; private static final int MSG_REQUEST_WINDOW_MAGNIFICATION_CONNECTION = 57 << MSG_SHIFT; + private static final int MSG_HANDLE_WINDOW_MANAGER_LOGGING_COMMAND = 58 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; @@ -353,6 +360,11 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< * @param connect {@code true} if needs connection, otherwise set the connection to null. */ default void requestWindowMagnificationConnection(boolean connect) { } + + /** + * Handles a window manager shell logging command. + */ + default void handleWindowManagerLoggingCommand(String[] args, ParcelFileDescriptor outFd) {} } public CommandQueue(Context context) { @@ -983,6 +995,17 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< } } + @Override + public void handleWindowManagerLoggingCommand(String[] args, ParcelFileDescriptor outFd) { + synchronized (mLock) { + SomeArgs internalArgs = SomeArgs.obtain(); + internalArgs.arg1 = args; + internalArgs.arg2 = outFd; + mHandler.obtainMessage(MSG_HANDLE_WINDOW_MANAGER_LOGGING_COMMAND, internalArgs) + .sendToTarget(); + } + } + @Override public void suppressAmbientDisplay(boolean suppress) { synchronized (mLock) { @@ -1334,6 +1357,18 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< mCallbacks.get(i).requestWindowMagnificationConnection((Boolean) msg.obj); } break; + case MSG_HANDLE_WINDOW_MANAGER_LOGGING_COMMAND: + args = (SomeArgs) msg.obj; + try (ParcelFileDescriptor pfd = (ParcelFileDescriptor) args.arg2) { + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).handleWindowManagerLoggingCommand( + (String[]) args.arg1, pfd); + } + } catch (IOException e) { + Log.e(TAG, "Failed to handle logging command", e); + } + args.recycle(); + break; } } } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index da7713acfc323..ce125f3fdce07 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -28,6 +28,7 @@ import android.content.Context; import android.graphics.Rect; import android.inputmethodservice.InputMethodService; import android.os.IBinder; +import android.os.ParcelFileDescriptor; import android.view.KeyEvent; import com.android.internal.annotations.VisibleForTesting; @@ -56,6 +57,7 @@ import com.android.wm.shell.protolog.ShellProtoLogImpl; import com.android.wm.shell.splitscreen.SplitScreen; import java.io.FileDescriptor; +import java.io.FileOutputStream; import java.io.PrintWriter; import java.util.Arrays; import java.util.Optional; @@ -66,7 +68,8 @@ import javax.inject.Inject; * Proxy in SysUiScope to delegate events to controllers in WM Shell library. */ @SysUISingleton -public final class WMShell extends SystemUI implements ProtoTraceable { +public final class WMShell extends SystemUI + implements CommandQueue.Callbacks, ProtoTraceable { private final CommandQueue mCommandQueue; private final DisplayImeController mDisplayImeController; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; @@ -100,6 +103,7 @@ public final class WMShell extends SystemUI implements ProtoTraceable