Log.java 源代码
package com.x8zs.morgoo.helper;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
import androidx.exifinterface.media.ExifInterface;
import com.x8zs.morgoo.droidplugin.hook.HookFactory;
import com.x8zs.morgoo.droidplugin.hook.proxy.LibCoreHook;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Log {
private static final int ASSERT = 7;
private static final int DEBUG = 3;
private static final int ERROR = 6;
private static final int INFO = 4;
private static final long MAX_LOG_FILE = 8388608;
public static final String TAG = "x8zs";
private static final int VERBOSE = 2;
private static final int WARN = 5;
private static boolean sDebug = true;
private static final File sDir;
private static boolean sFileLog = false;
private static final SimpleDateFormat sFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
private static final SimpleDateFormat sFormat1 = new SimpleDateFormat("yyyyMMdd");
private static Handler sHandler;
private static HandlerThread sHandlerThread;
static {
boolean z6;
File file = new File(Environment.getExternalStorageDirectory(), "360Log/Plugin/");
sDir = file;
if (file.exists() && file.isDirectory()) {
z6 = true;
} else {
z6 = false;
}
sFileLog = z6;
sDebug = z6;
HandlerThread handlerThread = new HandlerThread("DroidPlugin@FileLogThread");
sHandlerThread = handlerThread;
handlerThread.start();
sHandler = new Handler(sHandlerThread.getLooper());
}
private Log() {
}
public static void d(String str, String str2, Object... objArr) {
d(str, str2, null, objArr);
}
public static void e(String str, String str2, Object... objArr) {
e(str, str2, null, objArr);
}
private static File getLogFile() {
File file = new File(Environment.getExternalStorageDirectory(), String.format("360Log/Plugin/Log_%s_%s.log", sFormat1.format(new Date()), Integer.valueOf(Process.myPid())));
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
parentFile.mkdirs();
}
return file;
}
private static String getProcessName() {
return "?";
}
public static void i(String str, String str2, Object... objArr) {
i(str, str2, null, objArr);
}
public static boolean isDebug() {
return false;
}
private static boolean isFileLog() {
return sFileLog;
}
public static boolean isLoggable(int i6) {
return isDebug();
}
private static String levelToStr(int i6) {
switch (i6) {
case 2:
return ExifInterface.GPS_MEASUREMENT_INTERRUPTED;
case 3:
return "D";
case 4:
return "I";
case 5:
return ExifInterface.LONGITUDE_WEST;
case 6:
return ExifInterface.LONGITUDE_EAST;
case 7:
return ExifInterface.GPS_MEASUREMENT_IN_PROGRESS;
default:
return "UNKNOWN";
}
}
private static void logToFile(final int i6, final String str, final String str2, final Object[] objArr, final Throwable th) {
sHandler.post(new Runnable() {
@Override
public void run() {
Log.logToFileInner(i6, str, str2, objArr, th);
}
});
}
public static void logToFileInner(int i6, String str, String str2, Object[] objArr, Throwable th) {
PrintWriter printWriter = null;
try {
try {
if (!isFileLog()) {
HookFactory.getInstance().setHookEnable(LibCoreHook.class, true);
return;
}
HookFactory.getInstance().setHookEnable(LibCoreHook.class, false);
File logFile = getLogFile();
if (logFile.length() > MAX_LOG_FILE) {
logFile.delete();
}
PrintWriter printWriter2 = new PrintWriter(new FileWriter(logFile, true));
try {
printWriter2.println(String.format("%s %s-%s/%s %s/%s %s", sFormat.format(new Date()), Integer.valueOf(Process.myPid()), Integer.valueOf(Process.myUid()), getProcessName(), levelToStr(i6), str, String.format(str2, objArr)));
if (th != null) {
th.printStackTrace(printWriter2);
printWriter2.println();
}
printWriter2.close();
} catch (Throwable th2) {
th = th2;
printWriter = printWriter2;
try {
th.printStackTrace();
if (printWriter != null) {
printWriter.close();
}
HookFactory.getInstance().setHookEnable(LibCoreHook.class, true);
} catch (Throwable th3) {
if (printWriter != null) {
try {
printWriter.close();
} catch (Throwable unused) {
}
}
HookFactory.getInstance().setHookEnable(LibCoreHook.class, true);
throw th3;
}
}
} catch (Throwable unused2) {
HookFactory.getInstance().setHookEnable(LibCoreHook.class, true);
}
} catch (Throwable th4) {
th = th4;
}
}
private static void println(int i6, String str, String str2, Object[] objArr, Throwable th) {
logToFile(i6, str, str2, objArr, th);
if (objArr != null && objArr.length > 0) {
str2 = String.format(str2, objArr);
}
if (th != null) {
str2 = str2 + android.util.Log.getStackTraceString(th);
}
android.util.Log.println(i6, str, str2);
}
public static void v(String str, String str2, Object... objArr) {
v(str, str2, null, objArr);
}
public static void w(String str, String str2, Object... objArr) {
w(str, str2, null, objArr);
}
public static void wtf(String str, String str2, Object... objArr) {
wtf(str, str2, null, objArr);
}
public static void d(String str, String str2, Throwable th, Object... objArr) {
if (isLoggable(3)) {
println(3, str, str2, objArr, th);
}
}
public static void e(String str, String str2, Throwable th, Object... objArr) {
if (isLoggable(6)) {
println(6, str, str2, objArr, th);
}
}
public static void i(String str, String str2, Throwable th, Object... objArr) {
if (isLoggable(4)) {
println(4, str, str2, objArr, th);
}
}
public static boolean isLoggable() {
return isDebug();
}
public static void v(String str, String str2, Throwable th, Object... objArr) {
if (isLoggable(2)) {
println(2, str, str2, objArr, th);
}
}
public static void w(String str, String str2, Throwable th, Object... objArr) {
if (isLoggable(5)) {
println(5, str, str2, objArr, th);
}
}
public static void wtf(String str, Throwable th) {
wtf(str, "wtf", th, new Object[0]);
}
public static void wtf(String str, String str2, Throwable th, Object... objArr) {
if (isLoggable()) {
println(7, str, str2, objArr, th);
}
}
public static void w(String str, Throwable th) {
w(str, "Log.warn", th, new Object[0]);
}
}