diff options
| author | Lena <lena@omega> | 2026-08-01 00:00:00 +0000 |
|---|---|---|
| committer | Lena <lena@omega> | 2026-08-01 00:00:00 +0000 |
| commit | 852a8a00273c9128efeed0217a8e5d3fcd8bf780 (patch) | |
| tree | c72f959731fa3c7c809cf1a0222363b6c9c9b03b /app/src/main/java/invalid/lena/scrcpy/Crashlog.java | |
| parent | f379b93d52bf0dbd3816ec3f64d165314771d2a6 (diff) | |
| download | scrcpy-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.java | 29 |
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()); + } + } } |