Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
3c7a6d363e |
@ -8,6 +8,11 @@ import android.util.Log;
|
|||||||
*/
|
*/
|
||||||
public final class Ln {
|
public final class Ln {
|
||||||
|
|
||||||
|
public interface ConsolePrinter {
|
||||||
|
void printOut(String message);
|
||||||
|
void printErr(String message, Throwable throwable);
|
||||||
|
}
|
||||||
|
|
||||||
private static final String TAG = "scrcpy";
|
private static final String TAG = "scrcpy";
|
||||||
private static final String PREFIX = "[server] ";
|
private static final String PREFIX = "[server] ";
|
||||||
|
|
||||||
@ -15,12 +20,17 @@ public final class Ln {
|
|||||||
VERBOSE, DEBUG, INFO, WARN, ERROR
|
VERBOSE, DEBUG, INFO, WARN, ERROR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ConsolePrinter consolePrinter = new DefaultConsolePrinter();
|
||||||
private static Level threshold = Level.INFO;
|
private static Level threshold = Level.INFO;
|
||||||
|
|
||||||
private Ln() {
|
private Ln() {
|
||||||
// not instantiable
|
// not instantiable
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setConsolePrinter(ConsolePrinter consolePrinter) {
|
||||||
|
Ln.consolePrinter = consolePrinter;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the log level.
|
* Initialize the log level.
|
||||||
* <p>
|
* <p>
|
||||||
@ -39,31 +49,28 @@ public final class Ln {
|
|||||||
public static void v(String message) {
|
public static void v(String message) {
|
||||||
if (isEnabled(Level.VERBOSE)) {
|
if (isEnabled(Level.VERBOSE)) {
|
||||||
Log.v(TAG, message);
|
Log.v(TAG, message);
|
||||||
System.out.print(PREFIX + "VERBOSE: " + message + '\n');
|
consolePrinter.printOut(PREFIX + "VERBOSE: " + message + '\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void d(String message) {
|
public static void d(String message) {
|
||||||
if (isEnabled(Level.DEBUG)) {
|
if (isEnabled(Level.DEBUG)) {
|
||||||
Log.d(TAG, message);
|
Log.d(TAG, message);
|
||||||
System.out.print(PREFIX + "DEBUG: " + message + '\n');
|
consolePrinter.printOut(PREFIX + "DEBUG: " + message + '\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void i(String message) {
|
public static void i(String message) {
|
||||||
if (isEnabled(Level.INFO)) {
|
if (isEnabled(Level.INFO)) {
|
||||||
Log.i(TAG, message);
|
Log.i(TAG, message);
|
||||||
System.out.print(PREFIX + "INFO: " + message + '\n');
|
consolePrinter.printOut(PREFIX + "INFO: " + message + '\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void w(String message, Throwable throwable) {
|
public static void w(String message, Throwable throwable) {
|
||||||
if (isEnabled(Level.WARN)) {
|
if (isEnabled(Level.WARN)) {
|
||||||
Log.w(TAG, message, throwable);
|
Log.w(TAG, message, throwable);
|
||||||
System.err.print(PREFIX + "WARN: " + message + '\n');
|
consolePrinter.printErr(PREFIX + "WARN: " + message + '\n', throwable);
|
||||||
if (throwable != null) {
|
|
||||||
throwable.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,14 +81,26 @@ public final class Ln {
|
|||||||
public static void e(String message, Throwable throwable) {
|
public static void e(String message, Throwable throwable) {
|
||||||
if (isEnabled(Level.ERROR)) {
|
if (isEnabled(Level.ERROR)) {
|
||||||
Log.e(TAG, message, throwable);
|
Log.e(TAG, message, throwable);
|
||||||
System.err.print(PREFIX + "ERROR: " + message + "\n");
|
consolePrinter.printErr(PREFIX + "ERROR: " + message + '\n', throwable);
|
||||||
if (throwable != null) {
|
|
||||||
throwable.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void e(String message) {
|
public static void e(String message) {
|
||||||
e(message, null);
|
e(message, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class DefaultConsolePrinter implements ConsolePrinter {
|
||||||
|
@Override
|
||||||
|
public void printOut(String message) {
|
||||||
|
System.out.print(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printErr(String message, Throwable throwable) {
|
||||||
|
System.err.print(message);
|
||||||
|
if (throwable != null) {
|
||||||
|
throwable.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,12 @@ import android.os.Build;
|
|||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
|
|
||||||
|
import java.io.FileDescriptor;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@ -55,6 +61,12 @@ public final class Workarounds {
|
|||||||
mustFillAppInfo = true;
|
mustFillAppInfo = true;
|
||||||
mustFillBaseContext = true;
|
mustFillBaseContext = true;
|
||||||
mustFillAppContext = true;
|
mustFillAppContext = true;
|
||||||
|
} else if (Build.MANUFACTURER.equalsIgnoreCase("xiaomi")) {
|
||||||
|
// Trash the messages printed to the console by direct calls to System.out and System.err.
|
||||||
|
// Xiaomi device ROMs may print internal errors using e.printStackTrace(), flooding the console with irrelevant errors.
|
||||||
|
ExclusiveConsolePrinter exclusiveConsolePrinter = new ExclusiveConsolePrinter();
|
||||||
|
exclusiveConsolePrinter.installNullSystemStreams();
|
||||||
|
Ln.setConsolePrinter(new ExclusiveConsolePrinter());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audio && Build.VERSION.SDK_INT == Build.VERSION_CODES.R) {
|
if (audio && Build.VERSION.SDK_INT == Build.VERSION_CODES.R) {
|
||||||
@ -306,4 +318,48 @@ public final class Workarounds {
|
|||||||
throw new RuntimeException("Cannot create AudioRecord");
|
throw new RuntimeException("Cannot create AudioRecord");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class ExclusiveConsolePrinter implements Ln.ConsolePrinter {
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final PrintStream realOut = new PrintStream(new FileOutputStream(FileDescriptor.out));
|
||||||
|
private final PrintStream realErr = new PrintStream(new FileOutputStream(FileDescriptor.err));
|
||||||
|
|
||||||
|
void installNullSystemStreams() {
|
||||||
|
PrintStream nullStream = new PrintStream(new NullOutputStream());
|
||||||
|
System.setOut(nullStream);
|
||||||
|
System.setErr(nullStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printOut(String message) {
|
||||||
|
realOut.print(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printErr(String message, Throwable throwable) {
|
||||||
|
realErr.print(message);
|
||||||
|
if (throwable != null) {
|
||||||
|
StringWriter errors = new StringWriter();
|
||||||
|
throwable.printStackTrace(new PrintWriter(errors));
|
||||||
|
realErr.print(errors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user