From b8c5853aa6ac9cfbe3fb4e46bf10978b3fa212e3 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Wed, 1 Nov 2023 10:36:28 +0100 Subject: [PATCH] Disable default stdout/stderr Some devices (mostly Xiaomi) print internal errors using e.printStackTrace(), flooding the console with irrelevant errors. Disable system streams used via System.out and System.err streams, to print only the logs from scrcpy. Refs #994 Refs #4213 --- .../main/java/com/genymobile/scrcpy/Ln.java | 45 ++++++++++++++++--- .../java/com/genymobile/scrcpy/Server.java | 3 +- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/server/src/main/java/com/genymobile/scrcpy/Ln.java b/server/src/main/java/com/genymobile/scrcpy/Ln.java index 199c29bec2..cdd57b9f0c 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Ln.java +++ b/server/src/main/java/com/genymobile/scrcpy/Ln.java @@ -2,6 +2,11 @@ import android.util.Log; +import java.io.FileDescriptor; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.io.PrintStream; + /** * Log both to Android logger (so that logs are visible in "adb logcat") and standard output/error (so that they are visible in the terminal * directly). @@ -11,6 +16,9 @@ public final class Ln { private static final String TAG = "scrcpy"; private static final String PREFIX = "[server] "; + private static final PrintStream CONSOLE_OUT = new PrintStream(new FileOutputStream(FileDescriptor.out)); + private static final PrintStream CONSOLE_ERR = new PrintStream(new FileOutputStream(FileDescriptor.err)); + enum Level { VERBOSE, DEBUG, INFO, WARN, ERROR } @@ -21,6 +29,12 @@ private Ln() { // not instantiable } + public static void disableSystemStreams() { + PrintStream nullStream = new PrintStream(new NullOutputStream()); + System.setOut(nullStream); + System.setErr(nullStream); + } + /** * Initialize the log level. *

@@ -39,30 +53,30 @@ public static boolean isEnabled(Level level) { public static void v(String message) { if (isEnabled(Level.VERBOSE)) { Log.v(TAG, message); - System.out.print(PREFIX + "VERBOSE: " + message + '\n'); + CONSOLE_OUT.print(PREFIX + "VERBOSE: " + message + '\n'); } } public static void d(String message) { if (isEnabled(Level.DEBUG)) { Log.d(TAG, message); - System.out.print(PREFIX + "DEBUG: " + message + '\n'); + CONSOLE_OUT.print(PREFIX + "DEBUG: " + message + '\n'); } } public static void i(String message) { if (isEnabled(Level.INFO)) { Log.i(TAG, message); - System.out.print(PREFIX + "INFO: " + message + '\n'); + CONSOLE_OUT.print(PREFIX + "INFO: " + message + '\n'); } } public static void w(String message, Throwable throwable) { if (isEnabled(Level.WARN)) { Log.w(TAG, message, throwable); - System.err.print(PREFIX + "WARN: " + message + '\n'); + CONSOLE_ERR.print(PREFIX + "WARN: " + message + '\n'); if (throwable != null) { - throwable.printStackTrace(); + throwable.printStackTrace(CONSOLE_ERR); } } } @@ -74,9 +88,9 @@ public static void w(String message) { public static void e(String message, Throwable throwable) { if (isEnabled(Level.ERROR)) { Log.e(TAG, message, throwable); - System.err.print(PREFIX + "ERROR: " + message + "\n"); + CONSOLE_ERR.print(PREFIX + "ERROR: " + message + '\n'); if (throwable != null) { - throwable.printStackTrace(); + throwable.printStackTrace(CONSOLE_ERR); } } } @@ -84,4 +98,21 @@ public static void e(String message, Throwable throwable) { public static void e(String message) { e(message, null); } + + static class NullOutputStream extends OutputStream { + @Override + public void write(byte[] b) { + // ignore + } + + @Override + public void write(byte[] b, int off, int len) { + // ignore + } + + @Override + public void write(int b) { + // ignore + } + } } diff --git a/server/src/main/java/com/genymobile/scrcpy/Server.java b/server/src/main/java/com/genymobile/scrcpy/Server.java index a8e8e36a25..0126f396f9 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Server.java +++ b/server/src/main/java/com/genymobile/scrcpy/Server.java @@ -187,7 +187,7 @@ public static void main(String... args) { try { internalMain(args); } catch (Throwable t) { - t.printStackTrace(); + Ln.e(t.getMessage(), t); status = 1; } finally { // By default, the Java process exits when all non-daemon threads are terminated. @@ -204,6 +204,7 @@ private static void internalMain(String... args) throws Exception { Options options = Options.parse(args); + Ln.disableSystemStreams(); Ln.initLogLevel(options.getLogLevel()); Ln.i("Device: [" + Build.MANUFACTURER + "] " + Build.BRAND + " " + Build.MODEL + " (Android " + Build.VERSION.RELEASE + ")");