aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/invalid/lena/scrcpy/Crashlog.java
diff options
context:
space:
mode:
authorLena <lena@omega>2026-08-01 00:00:00 +0000
committerLena <lena@omega>2026-08-01 00:00:00 +0000
commit852a8a00273c9128efeed0217a8e5d3fcd8bf780 (patch)
treec72f959731fa3c7c809cf1a0222363b6c9c9b03b /app/src/main/java/invalid/lena/scrcpy/Crashlog.java
parentf379b93d52bf0dbd3816ec3f64d165314771d2a6 (diff)
downloadscrcpy-android-852a8a00273c9128efeed0217a8e5d3fcd8bf780.tar.gz
app: harden mirroring lifecycle and state
Diffstat (limited to 'app/src/main/java/invalid/lena/scrcpy/Crashlog.java')
-rw-r--r--app/src/main/java/invalid/lena/scrcpy/Crashlog.java29
1 files changed, 27 insertions, 2 deletions
diff --git a/app/src/main/java/invalid/lena/scrcpy/Crashlog.java b/app/src/main/java/invalid/lena/scrcpy/Crashlog.java
index 00bd3d8..705d191 100644
--- a/app/src/main/java/invalid/lena/scrcpy/Crashlog.java
+++ b/app/src/main/java/invalid/lena/scrcpy/Crashlog.java
@@ -4,8 +4,11 @@ import android.content.Context;
import java.io.File;
import java.io.FileWriter;
+import java.io.IOException;
import java.io.PrintWriter;
+import java.nio.file.Files;
import java.text.SimpleDateFormat;
+import java.util.Arrays;
import java.util.Date;
import java.util.Locale;
@@ -16,6 +19,8 @@ import java.util.Locale;
// fishing for it in adb logcat.
public final class Crashlog {
+ private static final int MAX_LOGS = 5;
+
private Crashlog() {}
public static void install(Context ctx) {
@@ -24,19 +29,25 @@ public final class Crashlog {
Log.w("crashlog: no external storage, skipping install");
return;
}
+ try {
+ prune(dir, MAX_LOGS);
+ } catch (IOException e) {
+ Log.w("crashlog: prune failed: %s", e);
+ }
Thread.UncaughtExceptionHandler prev =
Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
try {
- String ts = new SimpleDateFormat("yyyyMMdd-HHmmss",
+ String ts = new SimpleDateFormat("yyyyMMdd-HHmmss-SSS",
Locale.ROOT).format(new Date());
- File out = new File(dir, "crash-" + ts + ".log");
+ File out = File.createTempFile("crash-" + ts + "-", ".log", dir);
try (PrintWriter pw = new PrintWriter(new FileWriter(out))) {
pw.println("# " + new Date());
pw.println("# thread=" + t.getName());
pw.println();
e.printStackTrace(pw);
}
+ prune(dir, MAX_LOGS);
Log.e(e, "crashlog: wrote %s", out.getAbsolutePath());
} catch (Throwable ignored) {
// best effort - do not mask the original crash
@@ -45,4 +56,18 @@ public final class Crashlog {
});
Log.i("crashlog: installed -> %s", dir.getAbsolutePath());
}
+
+ static void prune(File dir, int keep) throws IOException {
+ if (keep < 0) throw new IllegalArgumentException("negative retention");
+ File[] logs = dir.listFiles((parent, name) ->
+ name.startsWith("crash-") && name.endsWith(".log"));
+ if (logs == null) throw new IOException("cannot list crashlog directory: " + dir);
+ Arrays.sort(logs, (left, right) -> {
+ int modified = Long.compare(right.lastModified(), left.lastModified());
+ return modified != 0 ? modified : right.getName().compareTo(left.getName());
+ });
+ for (int i = keep; i < logs.length; i++) {
+ Files.deleteIfExists(logs[i].toPath());
+ }
+ }
}