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

Commit 3f73a1c1 authored by Pablo Gamito's avatar Pablo Gamito
Browse files

Support command to enable logcat protologging in PerfettoProtoLogImpl

Test: adb shell wm logging enable-text WM_DEBUG_WINDOW_TRANSITIONS
Bug: 328420403
Change-Id: I1c2f0aa21126f6137a0dcd83cc575078d8607725
parent d45f744e
Loading
Loading
Loading
Loading
+43 −34
Original line number Diff line number Diff line
@@ -466,40 +466,6 @@ public class PerfettoProtoLogImpl implements IProtoLog {
        return internMap.get(string);
    }

    /**
     * Responds to a shell command.
     */
    public int onShellCommand(ShellCommand shell) {
        PrintWriter pw = shell.getOutPrintWriter();
        String cmd = shell.getNextArg();
        if (cmd == null) {
            return unknownCommand(pw);
        }
        ArrayList<String> args = new ArrayList<>();
        String arg;
        while ((arg = shell.getNextArg()) != null) {
            args.add(arg);
        }
        final ILogger logger = (msg) -> logAndPrintln(pw, msg);
        String[] groups = args.toArray(new String[args.size()]);
        switch (cmd) {
            case "enable-text":
                return this.startLoggingToLogcat(groups, logger);
            case "disable-text":
                return this.stopLoggingToLogcat(groups, logger);
            default:
                return unknownCommand(pw);
        }
    }

    private int unknownCommand(PrintWriter pw) {
        pw.println("Unknown command");
        pw.println("Window manager logging options:");
        pw.println("  enable-text [group...]: Enable logcat logging for given groups");
        pw.println("  disable-text [group...]: Disable logcat logging for given groups");
        return -1;
    }

    /**
     * Returns {@code true} iff logging to proto is enabled.
     */
@@ -559,6 +525,49 @@ public class PerfettoProtoLogImpl implements IProtoLog {
        return 0;
    }

    /**
     * Responds to a shell command.
     */
    public int onShellCommand(ShellCommand shell) {
        PrintWriter pw = shell.getOutPrintWriter();
        String cmd = shell.getNextArg();
        if (cmd == null) {
            return unknownCommand(pw);
        }
        ArrayList<String> args = new ArrayList<>();
        String arg;
        while ((arg = shell.getNextArg()) != null) {
            args.add(arg);
        }
        final ILogger logger = (msg) -> logAndPrintln(pw, msg);
        String[] groups = args.toArray(new String[0]);
        switch (cmd) {
            case "start", "stop" -> {
                pw.println("Command not supported. "
                        + "Please start and stop ProtoLog tracing with Perfetto.");
                return -1;
            }
            case "enable-text" -> {
                mViewerConfigReader.loadViewerConfig(logger);
                return setTextLogging(true, logger, groups);
            }
            case "disable-text" -> {
                return setTextLogging(false, logger, groups);
            }
            default -> {
                return unknownCommand(pw);
            }
        }
    }

    private int unknownCommand(PrintWriter pw) {
        pw.println("Unknown command");
        pw.println("Window manager logging options:");
        pw.println("  enable-text [group...]: Enable logcat logging for given groups");
        pw.println("  disable-text [group...]: Disable logcat logging for given groups");
        return -1;
    }

    static void logAndPrintln(@Nullable PrintWriter pw, String msg) {
        Slog.i(LOG_TAG, msg);
        if (pw != null) {
+9 −4
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import android.view.ViewDebug;

import com.android.internal.os.ByteTransferPipe;
import com.android.internal.protolog.LegacyProtoLogImpl;
import com.android.internal.protolog.PerfettoProtoLogImpl;
import com.android.internal.protolog.common.IProtoLog;
import com.android.internal.protolog.common.ProtoLog;
import com.android.server.IoThread;
@@ -111,8 +112,13 @@ public class WindowManagerShellCommand extends ShellCommand {
                case "logging":
                    IProtoLog instance = ProtoLog.getSingleInstance();
                    int result = 0;
                    if (instance instanceof LegacyProtoLogImpl
                            || instance instanceof PerfettoProtoLogImpl) {
                        if (instance instanceof LegacyProtoLogImpl) {
                            result = ((LegacyProtoLogImpl) instance).onShellCommand(this);
                        } else {
                            result = ((PerfettoProtoLogImpl) instance).onShellCommand(this);
                        }
                        if (result != 0) {
                            pw.println("Not handled, please use "
                                    + "`adb shell dumpsys activity service SystemUIService "
@@ -120,8 +126,7 @@ public class WindowManagerShellCommand extends ShellCommand {
                        }
                    } else {
                        result = -1;
                        pw.println("Command not supported. "
                                + "Only supported when using legacy ProtoLog.");
                        pw.println("ProtoLog impl doesn't support handling commands");
                    }
                    return result;
                case "user-rotation":