diff options
| author | 2022-08-31 13:39:09 -0700 | |
|---|---|---|
| committer | 2022-08-31 17:30:37 -0700 | |
| commit | 5ec2f4d52ef10f91eaff9013e10d695dbbea96b6 (patch) | |
| tree | df4e0c063b3b1122bc8f98148fc01dbaf1ee3c8f | |
| parent | 77338a2cf48e558d312a372344e4e88402ade71d (diff) | |
Handle ProtoLog logging command in WMShell
Added a ProtoLogController class that hooks into ShellCommandHandler to
handle the adb shell command for ProtoLog in WMShell.
Removed the proxy in WM to pipe the adb shell command to WMShell via
StatusBarManagerService.
Bug: 243447162
Test: adb shell dumpsys activity service \
SystemUIService WMShell protolog help
Change-Id: I9175ec88dcbae53508c97b4df1c2378b3eb9d648
8 files changed, 125 insertions, 107 deletions
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 65bec0e405ea..44cfe1aa4a79 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -264,11 +264,6 @@ 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/ProtoLogController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ProtoLogController.java new file mode 100644 index 000000000000..d2760022a015 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ProtoLogController.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell; + +import com.android.wm.shell.protolog.ShellProtoLogImpl; +import com.android.wm.shell.sysui.ShellCommandHandler; +import com.android.wm.shell.sysui.ShellInit; + +import java.io.PrintWriter; +import java.util.Arrays; + +/** + * Controls the {@link ShellProtoLogImpl} in WMShell via adb shell commands. + * + * Use with {@code adb shell dumpsys activity service SystemUIService WMShell protolog ...}. + */ +public class ProtoLogController implements ShellCommandHandler.ShellCommandActionHandler { + private final ShellCommandHandler mShellCommandHandler; + private final ShellProtoLogImpl mShellProtoLog; + + public ProtoLogController(ShellInit shellInit, + ShellCommandHandler shellCommandHandler) { + shellInit.addInitCallback(this::onInit, this); + mShellCommandHandler = shellCommandHandler; + mShellProtoLog = ShellProtoLogImpl.getSingleInstance(); + } + + void onInit() { + mShellCommandHandler.addCommandCallback("protolog", this, this); + } + + @Override + public boolean onShellCommand(String[] args, PrintWriter pw) { + switch (args[0]) { + case "status": { + pw.println(mShellProtoLog.getStatus()); + return true; + } + case "start": { + mShellProtoLog.startProtoLog(pw); + return true; + } + case "stop": { + mShellProtoLog.stopProtoLog(pw, true /* writeToFile */); + return true; + } + case "enable-text": { + String[] groups = Arrays.copyOfRange(args, 1, args.length); + int result = mShellProtoLog.startTextLogging(groups, pw); + if (result == 0) { + pw.println("Starting logging on groups: " + Arrays.toString(groups)); + return true; + } + return false; + } + case "disable-text": { + String[] groups = Arrays.copyOfRange(args, 1, args.length); + int result = mShellProtoLog.stopTextLogging(groups, pw); + if (result == 0) { + pw.println("Stopping logging on groups: " + Arrays.toString(groups)); + return true; + } + return false; + } + case "enable": { + String[] groups = Arrays.copyOfRange(args, 1, args.length); + return mShellProtoLog.startTextLogging(groups, pw) == 0; + } + case "disable": { + String[] groups = Arrays.copyOfRange(args, 1, args.length); + return mShellProtoLog.stopTextLogging(groups, pw) == 0; + } + default: { + pw.println("Invalid command: " + args[0]); + printShellCommandHelp(pw, ""); + return false; + } + } + } + + @Override + public void printShellCommandHelp(PrintWriter pw, String prefix) { + pw.println(prefix + "status"); + pw.println(prefix + " Get current ProtoLog status."); + pw.println(prefix + "start"); + pw.println(prefix + " Start proto logging."); + pw.println(prefix + "stop"); + pw.println(prefix + " Stop proto logging and flush to file."); + pw.println(prefix + "enable [group...]"); + pw.println(prefix + " Enable proto logging for given groups."); + pw.println(prefix + "disable [group...]"); + pw.println(prefix + " Disable proto logging for given groups."); + pw.println(prefix + "enable-text [group...]"); + pw.println(prefix + " Enable logcat logging for given groups."); + pw.println(prefix + "disable-text [group...]"); + pw.println(prefix + " Disable logcat logging for given groups."); + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java index 7a736ccab5d1..c39602032170 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java @@ -27,6 +27,7 @@ import android.view.IWindowManager; import com.android.internal.logging.UiEventLogger; import com.android.launcher3.icons.IconProvider; +import com.android.wm.shell.ProtoLogController; import com.android.wm.shell.RootDisplayAreaOrganizer; import com.android.wm.shell.RootTaskDisplayAreaOrganizer; import com.android.wm.shell.ShellTaskOrganizer; @@ -699,6 +700,7 @@ public abstract class WMShellBaseModule { Optional<ActivityEmbeddingController> activityEmbeddingOptional, Transitions transitions, StartingWindowController startingWindow, + ProtoLogController protoLogController, @ShellCreateTriggerOverride Optional<Object> overriddenCreateTrigger) { return new Object(); } @@ -714,4 +716,12 @@ public abstract class WMShellBaseModule { static ShellCommandHandler provideShellCommandHandler() { return new ShellCommandHandler(); } + + @WMSingleton + @Provides + static ProtoLogController provideProtoLogController( + ShellInit shellInit, + ShellCommandHandler shellCommandHandler) { + return new ProtoLogController(shellInit, shellCommandHandler); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index e99244048fd6..04621168493b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -52,7 +52,6 @@ import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.RemoteException; -import android.util.Log; import android.util.Pair; import android.util.SparseArray; import android.view.InsetsState.InternalInsetsType; @@ -76,7 +75,6 @@ import com.android.systemui.statusbar.policy.CallbackController; import com.android.systemui.tracing.ProtoTracer; import java.io.FileOutputStream; -import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; @@ -152,7 +150,6 @@ public class CommandQueue extends IStatusBar.Stub implements private static final int MSG_TRACING_STATE_CHANGED = 54 << MSG_SHIFT; private static final int MSG_SUPPRESS_AMBIENT_DISPLAY = 55 << MSG_SHIFT; private static final int MSG_REQUEST_WINDOW_MAGNIFICATION_CONNECTION = 56 << MSG_SHIFT; - private static final int MSG_HANDLE_WINDOW_MANAGER_LOGGING_COMMAND = 57 << MSG_SHIFT; //TODO(b/169175022) Update name and when feature name is locked. private static final int MSG_EMERGENCY_ACTION_LAUNCH_GESTURE = 58 << MSG_SHIFT; private static final int MSG_SET_NAVIGATION_BAR_LUMA_SAMPLING_ENABLED = 59 << MSG_SHIFT; @@ -425,11 +422,6 @@ public class CommandQueue extends IStatusBar.Stub implements default void requestWindowMagnificationConnection(boolean connect) { } /** - * Handles a window manager shell logging command. - */ - default void handleWindowManagerLoggingCommand(String[] args, ParcelFileDescriptor outFd) {} - - /** * @see IStatusBar#setNavigationBarLumaSamplingEnabled(int, boolean) */ default void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable) {} @@ -1143,17 +1135,6 @@ public class CommandQueue extends IStatusBar.Stub implements } @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) { mHandler.obtainMessage(MSG_SUPPRESS_AMBIENT_DISPLAY, suppress).sendToTarget(); @@ -1637,18 +1618,6 @@ public class CommandQueue extends IStatusBar.Stub implements 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; case MSG_SET_NAVIGATION_BAR_LUMA_SAMPLING_ENABLED: for (int i = 0; i < mCallbacks.size(); i++) { mCallbacks.get(i).setNavigationBarLumaSamplingEnabled(msg.arg1, diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index a4a59fc9d4a7..3961a8bcc980 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -34,7 +34,6 @@ import android.content.res.Configuration; import android.graphics.Rect; import android.inputmethodservice.InputMethodService; import android.os.IBinder; -import android.os.ParcelFileDescriptor; import android.view.KeyEvent; import androidx.annotation.NonNull; @@ -62,12 +61,10 @@ import com.android.wm.shell.onehanded.OneHandedEventCallback; import com.android.wm.shell.onehanded.OneHandedTransitionCallback; import com.android.wm.shell.onehanded.OneHandedUiEventLogger; import com.android.wm.shell.pip.Pip; -import com.android.wm.shell.protolog.ShellProtoLogImpl; import com.android.wm.shell.splitscreen.SplitScreen; import com.android.wm.shell.sysui.ShellInterface; import java.io.PrintWriter; -import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.concurrent.Executor; @@ -336,44 +333,7 @@ public final class WMShell extends CoreStartable if (mShell.handleCommand(args, pw)) { return; } - // Handle logging commands if provided - if (handleLoggingCommand(args, pw)) { - return; - } // Dump WMShell stuff here if no commands were handled mShell.dump(pw); } - - @Override - public void handleWindowManagerLoggingCommand(String[] args, ParcelFileDescriptor outFd) { - PrintWriter pw = new PrintWriter(new ParcelFileDescriptor.AutoCloseOutputStream(outFd)); - handleLoggingCommand(args, pw); - pw.flush(); - pw.close(); - } - - private boolean handleLoggingCommand(String[] args, PrintWriter pw) { - ShellProtoLogImpl protoLogImpl = ShellProtoLogImpl.getSingleInstance(); - for (int i = 0; i < args.length; i++) { - switch (args[i]) { - case "enable-text": { - String[] groups = Arrays.copyOfRange(args, i + 1, args.length); - int result = protoLogImpl.startTextLogging(groups, pw); - if (result == 0) { - pw.println("Starting logging on groups: " + Arrays.toString(groups)); - } - return true; - } - case "disable-text": { - String[] groups = Arrays.copyOfRange(args, i + 1, args.length); - int result = protoLogImpl.stopTextLogging(groups, pw); - if (result == 0) { - pw.println("Stopping logging on groups: " + Arrays.toString(groups)); - } - return true; - } - } - } - return false; - } } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index 53b8b53e2b6c..690dd10aa3e5 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -21,7 +21,6 @@ import android.app.ITransientNotificationCallback; import android.hardware.fingerprint.IUdfpsHbmListener; import android.os.Bundle; import android.os.IBinder; -import android.os.ParcelFileDescriptor; import android.view.InsetsState.InternalInsetsType; import android.view.InsetsVisibilities; import android.view.WindowInsetsController.Appearance; @@ -162,11 +161,6 @@ public interface StatusBarManagerInternal { boolean requestWindowMagnificationConnection(boolean request); /** - * Handles a logging command from the WM shell command. - */ - void handleWindowManagerLoggingCommand(String[] args, ParcelFileDescriptor outFd); - - /** * @see com.android.internal.statusbar.IStatusBar#setNavigationBarLumaSamplingEnabled(int, * boolean) */ diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index bec3754536e2..653b51a95993 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -62,7 +62,6 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; -import android.os.ParcelFileDescriptor; import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; @@ -664,15 +663,6 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override - public void handleWindowManagerLoggingCommand(String[] args, ParcelFileDescriptor outFd) { - if (mBar != null) { - try { - mBar.handleWindowManagerLoggingCommand(args, outFd); - } catch (RemoteException ex) { } - } - } - - @Override public void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable) { if (mBar != null) { try { diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java index ff43a96d6afc..c22091b4eacb 100644 --- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java +++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java @@ -34,7 +34,6 @@ import android.content.res.Resources.NotFoundException; import android.graphics.Color; import android.graphics.Point; import android.graphics.Rect; -import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.ShellCommand; import android.os.UserHandle; @@ -47,8 +46,6 @@ import android.view.ViewDebug; import com.android.internal.os.ByteTransferPipe; import com.android.internal.protolog.ProtoLogImpl; -import com.android.server.LocalServices; -import com.android.server.statusbar.StatusBarManagerInternal; import com.android.server.wm.LetterboxConfiguration.LetterboxBackgroundType; import com.android.server.wm.LetterboxConfiguration.LetterboxHorizontalReachabilityPosition; import com.android.server.wm.LetterboxConfiguration.LetterboxVerticalReachabilityPosition; @@ -56,7 +53,6 @@ import com.android.server.wm.LetterboxConfiguration.LetterboxVerticalReachabilit import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipEntry; @@ -106,19 +102,11 @@ public class WindowManagerShellCommand extends ShellCommand { // trace files can be written. return mInternal.mWindowTracing.onShellCommand(this); case "logging": - String[] args = peekRemainingArgs(); int result = ProtoLogImpl.getSingleInstance().onShellCommand(this); if (result != 0) { - // Let the shell try and handle this - try (ParcelFileDescriptor pfd - = ParcelFileDescriptor.dup(getOutFileDescriptor())){ - pw.println("Not handled, calling status bar with args: " - + Arrays.toString(args)); - LocalServices.getService(StatusBarManagerInternal.class) - .handleWindowManagerLoggingCommand(args, pfd); - } catch (IOException e) { - pw.println("Failed to handle logging command: " + e.getMessage()); - } + pw.println("Not handled, please use " + + "`adb shell dumpsys activity service SystemUIService WMShell` " + + "if you are looking for ProtoLog in WMShell"); } return result; case "user-rotation": |