Timing
Generated: = h(date('c', (int)(($p['generated_at_epoch_ms'] ?? 0)/1000))) ?>
Received: = h(date('c', (int)(($report['received_at_ms'] ?? 0)/1000))) ?>
Fingerprint: = h($p['fingerprint'] ?? $report['fingerprint'] ?? '') ?>
@@ -54,8 +54,34 @@ $view = 'reports';
-
-
Session context (crash)
= h(json_encode($p['session_context'], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES)) ?>
-
-
Raw JSON
= h(json_encode($p, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES)) ?>
-
← Back to list
+
+
+
+
+
+
+
+
+ Session context (crash)
+
+
+
+
+
+
+
+
+
+ Raw JSON
+
+
+
+
diff --git a/examples/crash_reporter/generate_test_reports.py b/examples/crash_reporter/generate_test_reports.py
new file mode 100755
index 0000000..dde68a2
--- /dev/null
+++ b/examples/crash_reporter/generate_test_reports.py
@@ -0,0 +1,339 @@
+#!/usr/bin/env python3
+"""Generate fake crash JSON files (java + native) for batch upload testing."""
+from __future__ import annotations
+
+import json
+import random
+import uuid
+from datetime import datetime, timezone
+from pathlib import Path
+
+OUT_DIR = Path(__file__).resolve().parent / "test_reports"
+JAVA_COUNT = 35
+NATIVE_COUNT = 30
+BASE_MS = int(datetime(2026, 5, 1, 12, 0, tzinfo=timezone.utc).timestamp() * 1000)
+GENERATION_SEED = 20260523
+
+DEVICES = [
+ ("Samsung", "samsung", "Galaxy Tab A9+", "gta9pwifi", 34, "14"),
+ ("Lenovo", "Lenovo", "Tab P12", "TB370FU", 34, "14"),
+ ("Xiaomi", "Xiaomi", "Redmi Pad SE", "xun", 33, "13"),
+ ("Doogee", "DOOGEE", "Tab G6 Max", "TabG6Max", 34, "14"),
+ ("Huawei", "HUAWEI", "MatePad 11", "BAH3", 31, "12"),
+ ("Amazon", "Amazon", "Fire HD 10", "trona", 30, "11"),
+ ("Google", "google", "Pixel Tablet", "tangorpro", 34, "14"),
+ ("OnePlus", "OnePlus", "Pad Go", "OPD2303", 33, "13"),
+ ("Realme", "realme", "Pad 2", "RMX2201", 33, "13"),
+ ("Nokia", "HMD Global", "T21", "RON", 33, "13"),
+ ("TCL", "TCL", "Tab 10 Gen2", "9081G", 31, "12"),
+ ("Vivo", "vivo", "Pad Air", "PA2353", 34, "14"),
+ ("Oppo", "OPPO", "Pad Neo", "OPD2301", 33, "13"),
+ ("Asus", "asus", "ZenPad 10", "P00C", 29, "10"),
+ ("Acer", "Acer", "Iconia Tab P10", "acer_p10", 31, "12"),
+ ("Motorola", "motorola", "Tab G70", "scout", 33, "13"),
+ ("Honor", "HONOR", "Pad X8a", "HEY2", 34, "14"),
+]
+
+JAVA_TEMPLATES = [
+ {
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "scenario_weights": ("cast_session", "cast_session", "app_runtime"),
+ "process": "main",
+ "activity": "ScreenCastActivity",
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "Attempt to invoke virtual method on a null object reference",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.onCreate(ScreenCastService.java:118)",
+ "at android.app.ActivityThread.handleCreateService(ActivityThread.java:5148)",
+ ],
+ },
+ },
+ {
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "scenario_weights": ("cast_session", "cast_session"),
+ "process": "main",
+ "activity": "CastSettingsActivity",
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "encoderSurface was null when starting capture",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.startCapture(ScreenCastService.java:412)",
+ "at com.foxx.androidcast.sender.ScreenCastService.onStartCommand(ScreenCastService.java:205)",
+ ],
+ },
+ },
+ {
+ "fingerprint": "b2c3d4e5f6a01codec",
+ "scenario_weights": ("cast_session", "cast_session"),
+ "process": "main",
+ "activity": "ScreenCastActivity",
+ "java": {
+ "thread": "EncoderThread-1",
+ "exception": "java.lang.IllegalStateException",
+ "message": "MediaCodec codec is released already",
+ "stack_frames": [
+ "at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)",
+ "at com.foxx.androidcast.encoder.H264Encoder.drain(H264Encoder.java:88)",
+ ],
+ },
+ },
+ {
+ "fingerprint": "c3d4e5f6a01b02oom",
+ "scenario_weights": ("cast_session", "app_runtime"),
+ "process": "main",
+ "activity": "MainActivity",
+ "java": {
+ "thread": "pool-3-thread-2",
+ "exception": "java.lang.OutOfMemoryError",
+ "message": "Failed to allocate a 8294400 byte allocation with 524288 free bytes",
+ "stack_frames": [
+ "at android.graphics.Bitmap.createBitmap(Bitmap.java:1234)",
+ "at com.foxx.androidcast.capture.FrameRingBuffer.push(FrameRingBuffer.java:56)",
+ ],
+ },
+ },
+ {
+ "fingerprint": "d4e5f6a01b02c03net",
+ "scenario_weights": ("app_runtime", "cast_session", "app_runtime"),
+ "process": "main",
+ "activity": "MainActivity",
+ "java": {
+ "thread": "UdpSender-1",
+ "exception": "java.net.SocketTimeoutException",
+ "message": "connect timed out",
+ "stack_frames": [
+ "at com.foxx.androidcast.network.udp.UdpCastTransport.send(UdpCastTransport.java:142)",
+ "at com.foxx.androidcast.sender.ScreenCastService.flushStats(ScreenCastService.java:455)",
+ ],
+ },
+ },
+ {
+ "fingerprint": "f6a01b02c03d04e05perm",
+ "scenario_weights": ("app_runtime", "app_runtime"),
+ "process": "main",
+ "activity": "MainActivity",
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.SecurityException",
+ "message": "MediaProjection requires FOREGROUND_SERVICE_MEDIA_PROJECTION",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.acquireProjection(ScreenCastService.java:167)",
+ "at com.foxx.androidcast.ui.MainActivity.startCast(MainActivity.java:89)",
+ ],
+ },
+ },
+]
+
+NATIVE_TEMPLATES = [
+ {
+ "fingerprint": "e5f6a01b02c03d04nat",
+ "scenario_weights": ("cast_session", "cast_session"),
+ "process": "main",
+ "activity": "ScreenCastActivity",
+ "native": {
+ "signal": "SIGSEGV",
+ "backtrace": [
+ "#00 pc 00012ab4 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (crash_hook_backtrace+64)",
+ "#01 pc 0003f210 /data/app/.../lib/arm64/libandroidcast_jni.so (Java_com_foxx_androidcast_native_CrashHook_notify+28)",
+ "#02 pc 00021c44 /system/lib64/libart.so (art_quick_generic_jni_trampoline+148)",
+ ],
+ },
+ },
+ {
+ "fingerprint": "e5f6a01b02c03d04nat",
+ "scenario_weights": ("cast_session", "cast_session"),
+ "process": ":crashwatcher",
+ "activity": "ScreenCastActivity",
+ "native": {
+ "signal": "SIGSEGV",
+ "backtrace": [
+ "#00 pc 00008f20 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (unwind_stub+32)",
+ "#01 pc 00011a04 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (native_stub_write+96)",
+ "#02 pc 0002bc10 /apex/com.android.runtime/lib64/bionic/libc.so (__restore_rt)",
+ ],
+ },
+ },
+ {
+ "fingerprint": "nat_stfg_omx01",
+ "scenario_weights": ("cast_session", "cast_session"),
+ "process": "main",
+ "activity": "ScreenCastActivity",
+ "native": {
+ "signal": "SIGSEGV",
+ "backtrace": [
+ "#00 pc 000a4120 /system/lib64/libstagefright.so (android::MediaCodec::onMessageReceived+312)",
+ "#01 pc 0004e8c4 /system/lib64/libhidlbase.so (android::hardware::media::omx::V1_0::IOmxNode::dispatchMessage+68)",
+ "#02 pc 0001d330 /data/app/.../lib/arm64/libandroidcast_encoder.so (AvcEncoder::drainNAL+44)",
+ ],
+ },
+ },
+ {
+ "fingerprint": "nat_abort01",
+ "scenario_weights": ("cast_session", "app_runtime"),
+ "process": "main",
+ "activity": "ScreenCastActivity",
+ "native": {
+ "signal": "SIGABRT",
+ "backtrace": [
+ "#00 pc 0008c4bc /apex/com.android.runtime/lib64/bionic/libc.so (abort+164)",
+ "#01 pc 00005120 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (crash_hook_abort+48)",
+ "#02 pc 0003a8f0 /data/app/.../lib/arm64/libandroidcast_jni.so (jni_fatal_callback+20)",
+ ],
+ },
+ },
+ {
+ "fingerprint": "nat_bus_frb02",
+ "scenario_weights": ("cast_session", "cast_session"),
+ "process": "main",
+ "activity": "ScreenCastActivity",
+ "native": {
+ "signal": "SIGBUS",
+ "backtrace": [
+ "#00 pc 0000c210 /data/app/.../lib/arm64/libandroidcast_capture.so (FrameRingBuffer::slot_at+28)",
+ "#01 pc 0000d884 /data/app/.../lib/arm64/libandroidcast_capture.so (FrameRingBuffer::push_copy+112)",
+ "#02 pc 0002f1a0 /data/app/.../lib/arm64/libandroidcast_jni.so (native_on_frame+64)",
+ ],
+ },
+ },
+ {
+ "fingerprint": "nat_fpe_swr03",
+ "scenario_weights": ("cast_session",),
+ "process": "main",
+ "activity": "ScreenCastActivity",
+ "native": {
+ "signal": "SIGFPE",
+ "backtrace": [
+ "#00 pc 0006b2c4 /vendor/lib64/libswresample.so (resample_internal+196)",
+ "#01 pc 0004a018 /data/app/.../lib/arm64/libandroidcast_audio.so (AudioResampler::convert+80)",
+ "#02 pc 0001ac44 /data/app/.../lib/arm64/libandroidcast_jni.so (native_audio_tick+36)",
+ ],
+ },
+ },
+ {
+ "fingerprint": "nat_trap_jni05",
+ "scenario_weights": ("app_runtime", "cast_session"),
+ "process": ":crashwatcher",
+ "activity": "MainActivity",
+ "native": {
+ "signal": "SIGTRAP",
+ "backtrace": [
+ "#00 pc 00002d10 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (debug_trap_handler+16)",
+ "#01 pc 00019c80 /system/lib64/libart.so (art::Thread::DumpStack+320)",
+ "#02 pc 0000e4a8 /data/app/.../lib/arm64/libandroidcast_jni.so (CrashHook::selfTest+24)",
+ ],
+ },
+ },
+ {
+ "fingerprint": "nat_ill_insn06",
+ "scenario_weights": ("cast_session", "cast_session"),
+ "process": "main",
+ "activity": "ScreenCastActivity",
+ "native": {
+ "signal": "SIGILL",
+ "backtrace": [
+ "#00 pc 00004580 /data/app/.../lib/arm64/libh264_neon.so (neon_idct_invalid+8)",
+ "#01 pc 00012f40 /data/app/.../lib/arm64/libandroidcast_encoder.so (H264Encoder::decode_slice+128)",
+ "#02 pc 00008c00 /data/app/.../lib/arm64/libandroidcast_jni.so (encoder_worker+200)",
+ ],
+ },
+ },
+]
+
+APP_VERSIONS = [
+ ("0.1.0", 100, "deadbeef"),
+ ("0.1.1", 101, "cafebabe"),
+ ("0.2.0-dev", 120, "a1b2c3d4"),
+]
+
+
+def pick(seq):
+ return random.choice(seq)
+
+
+def build_report(index: int, kind: str, tpl: dict) -> dict:
+ mfr, brand, model, device, sdk, release = pick(DEVICES)
+ ver_name, ver_code, git = pick(APP_VERSIONS)
+ scenario = pick(tpl["scenario_weights"])
+ ts = BASE_MS + index * 29 * 60 * 1000 + random.randint(0, 3600000)
+ slug = model.lower().replace(" ", "_")[:12]
+ report_id = str(uuid.uuid5(uuid.NAMESPACE_DNS, f"fake-{kind}-{index}-{slug}"))
+
+ payload = {
+ "schema_version": 1,
+ "report_id": report_id,
+ "generated_at_epoch_ms": ts,
+ "crash_type": "java" if kind == "java" else "native",
+ "scenario": scenario,
+ "process": tpl["process"],
+ "report_file": f"crash_{datetime.fromtimestamp(ts / 1000, tz=timezone.utc).strftime('%Y%m%d_%H%M%S')}.json",
+ "fingerprint": tpl["fingerprint"],
+ "runtime_context": {
+ "app_started_epoch_ms": ts - random.randint(60_000, 3_600_000),
+ "last_activity": tpl["activity"],
+ "sender_cast_active": scenario == "cast_session",
+ "receiver_cast_active": False,
+ "cast_active": scenario == "cast_session",
+ "session_stats_active": scenario == "cast_session" and random.random() > 0.4,
+ "last_session_file": f"session_send_{datetime.fromtimestamp(ts / 1000, tz=timezone.utc).strftime('%Y%m%d_%H%M%S')}.json",
+ },
+ "device": {
+ "manufacturer": mfr,
+ "brand": brand,
+ "model": model,
+ "device": device,
+ "product": device,
+ "sdk_int": sdk,
+ "release": release,
+ "abis": ["arm64-v8a", "armeabi-v7a"] if sdk >= 21 else ["armeabi-v7a"],
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": ver_name,
+ "version_code": ver_code,
+ },
+ "build": {
+ "debug": ver_name.endswith("-dev") or random.random() > 0.6,
+ "git_commit": git,
+ },
+ }
+ if kind == "java":
+ payload["java"] = dict(tpl["java"])
+ else:
+ payload["native"] = {
+ "signal": tpl["native"]["signal"],
+ "backtrace": list(tpl["native"]["backtrace"]),
+ }
+ return payload
+
+
+def main() -> None:
+ random.seed(GENERATION_SEED)
+ OUT_DIR.mkdir(parents=True, exist_ok=True)
+ for old in OUT_DIR.glob("crash*.json"):
+ old.unlink()
+
+ for i in range(JAVA_COUNT):
+ tpl = pick(JAVA_TEMPLATES)
+ path = OUT_DIR / f"crash_java_{i + 1:03d}.json"
+ path.write_text(
+ json.dumps(build_report(i, "java", tpl), indent=2, ensure_ascii=False) + "\n",
+ encoding="utf-8",
+ )
+
+ for i in range(NATIVE_COUNT):
+ tpl = pick(NATIVE_TEMPLATES)
+ path = OUT_DIR / f"crash_native_{i + 1:03d}.json"
+ path.write_text(
+ json.dumps(build_report(i, "native", tpl), indent=2, ensure_ascii=False) + "\n",
+ encoding="utf-8",
+ )
+
+ total = JAVA_COUNT + NATIVE_COUNT
+ print(f"Wrote {total} reports to {OUT_DIR} ({JAVA_COUNT} java, {NATIVE_COUNT} native)")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/crash_reporter/test_reports/README.md b/examples/crash_reporter/test_reports/README.md
new file mode 100644
index 0000000..70e683b
--- /dev/null
+++ b/examples/crash_reporter/test_reports/README.md
@@ -0,0 +1,23 @@
+# Test crash reports
+
+**65** fake payloads: **35 java** + **30 native** (`crash_java_*.json`, `crash_native_*.json`).
+
+Regenerate:
+
+```bash
+python3 ../generate_test_reports.py
+```
+
+Batch upload (all):
+
+```bash
+../upload_test.sh
+```
+
+Upload only native:
+
+```bash
+ONLY=native ../upload_test.sh
+```
+
+Native clusters use signals `SIGSEGV`, `SIGABRT`, `SIGBUS`, `SIGFPE`, `SIGTRAP`, `SIGILL` with shared fingerprints per crash family (see `generate_test_reports.py`).
diff --git a/examples/crash_reporter/test_reports/crash_java_001.json b/examples/crash_reporter/test_reports/crash_java_001.json
new file mode 100644
index 0000000..3b27ad5
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_001.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "3046575f-58f6-5542-a72e-135ed5f562c6",
+ "generated_at_epoch_ms": 1777637675884,
+ "crash_type": "java",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260501_121435.json",
+ "fingerprint": "d4e5f6a01b02c03net",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777635763408,
+ "last_activity": "MainActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_121435.json"
+ },
+ "device": {
+ "manufacturer": "Realme",
+ "brand": "realme",
+ "model": "Pad 2",
+ "device": "RMX2201",
+ "product": "RMX2201",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "UdpSender-1",
+ "exception": "java.net.SocketTimeoutException",
+ "message": "connect timed out",
+ "stack_frames": [
+ "at com.foxx.androidcast.network.udp.UdpCastTransport.send(UdpCastTransport.java:142)",
+ "at com.foxx.androidcast.sender.ScreenCastService.flushStats(ScreenCastService.java:455)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_002.json b/examples/crash_reporter/test_reports/crash_java_002.json
new file mode 100644
index 0000000..7731112
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_002.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "c49c498a-23dc-5afd-a37f-cf0fc965c3b9",
+ "generated_at_epoch_ms": 1777641978209,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_132618.json",
+ "fingerprint": "c3d4e5f6a01b02oom",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777641560292,
+ "last_activity": "MainActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_132618.json"
+ },
+ "device": {
+ "manufacturer": "TCL",
+ "brand": "TCL",
+ "model": "Tab 10 Gen2",
+ "device": "9081G",
+ "product": "9081G",
+ "sdk_int": 31,
+ "release": "12",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "pool-3-thread-2",
+ "exception": "java.lang.OutOfMemoryError",
+ "message": "Failed to allocate a 8294400 byte allocation with 524288 free bytes",
+ "stack_frames": [
+ "at android.graphics.Bitmap.createBitmap(Bitmap.java:1234)",
+ "at com.foxx.androidcast.capture.FrameRingBuffer.push(FrameRingBuffer.java:56)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_003.json b/examples/crash_reporter/test_reports/crash_java_003.json
new file mode 100644
index 0000000..eb61ebb
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_003.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "0af0cae6-95b3-56bb-9ea4-be2a2759c7b2",
+ "generated_at_epoch_ms": 1777643375148,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_134935.json",
+ "fingerprint": "b2c3d4e5f6a01codec",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777641833812,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_134935.json"
+ },
+ "device": {
+ "manufacturer": "Samsung",
+ "brand": "samsung",
+ "model": "Galaxy Tab A9+",
+ "device": "gta9pwifi",
+ "product": "gta9pwifi",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "java": {
+ "thread": "EncoderThread-1",
+ "exception": "java.lang.IllegalStateException",
+ "message": "MediaCodec codec is released already",
+ "stack_frames": [
+ "at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)",
+ "at com.foxx.androidcast.encoder.H264Encoder.drain(H264Encoder.java:88)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_004.json b/examples/crash_reporter/test_reports/crash_java_004.json
new file mode 100644
index 0000000..be92dd8
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_004.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "ffe2d35c-b0bd-5ff4-a3f1-eb45a535350a",
+ "generated_at_epoch_ms": 1777643114406,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_134514.json",
+ "fingerprint": "b2c3d4e5f6a01codec",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777641026858,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_134514.json"
+ },
+ "device": {
+ "manufacturer": "Asus",
+ "brand": "asus",
+ "model": "ZenPad 10",
+ "device": "P00C",
+ "product": "P00C",
+ "sdk_int": 29,
+ "release": "10",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "EncoderThread-1",
+ "exception": "java.lang.IllegalStateException",
+ "message": "MediaCodec codec is released already",
+ "stack_frames": [
+ "at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)",
+ "at com.foxx.androidcast.encoder.H264Encoder.drain(H264Encoder.java:88)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_005.json b/examples/crash_reporter/test_reports/crash_java_005.json
new file mode 100644
index 0000000..a9343b9
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_005.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "dad727ca-0ff7-5d50-b7cf-211a19ea47f8",
+ "generated_at_epoch_ms": 1777644027249,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_140027.json",
+ "fingerprint": "d4e5f6a01b02c03net",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777643125367,
+ "last_activity": "MainActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_140027.json"
+ },
+ "device": {
+ "manufacturer": "Samsung",
+ "brand": "samsung",
+ "model": "Galaxy Tab A9+",
+ "device": "gta9pwifi",
+ "product": "gta9pwifi",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "UdpSender-1",
+ "exception": "java.net.SocketTimeoutException",
+ "message": "connect timed out",
+ "stack_frames": [
+ "at com.foxx.androidcast.network.udp.UdpCastTransport.send(UdpCastTransport.java:142)",
+ "at com.foxx.androidcast.sender.ScreenCastService.flushStats(ScreenCastService.java:455)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_006.json b/examples/crash_reporter/test_reports/crash_java_006.json
new file mode 100644
index 0000000..a758c5d
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_006.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "bb62d9ee-1262-551d-8ec0-21250d2bd3e9",
+ "generated_at_epoch_ms": 1777647916919,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_150516.json",
+ "fingerprint": "c3d4e5f6a01b02oom",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777644480507,
+ "last_activity": "MainActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_150516.json"
+ },
+ "device": {
+ "manufacturer": "Samsung",
+ "brand": "samsung",
+ "model": "Galaxy Tab A9+",
+ "device": "gta9pwifi",
+ "product": "gta9pwifi",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "pool-3-thread-2",
+ "exception": "java.lang.OutOfMemoryError",
+ "message": "Failed to allocate a 8294400 byte allocation with 524288 free bytes",
+ "stack_frames": [
+ "at android.graphics.Bitmap.createBitmap(Bitmap.java:1234)",
+ "at com.foxx.androidcast.capture.FrameRingBuffer.push(FrameRingBuffer.java:56)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_007.json b/examples/crash_reporter/test_reports/crash_java_007.json
new file mode 100644
index 0000000..023396a
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_007.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "7151b615-1421-595f-80a8-de0a26ef7b39",
+ "generated_at_epoch_ms": 1777649652277,
+ "crash_type": "java",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260501_153412.json",
+ "fingerprint": "f6a01b02c03d04e05perm",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777646750557,
+ "last_activity": "MainActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_153412.json"
+ },
+ "device": {
+ "manufacturer": "Honor",
+ "brand": "HONOR",
+ "model": "Pad X8a",
+ "device": "HEY2",
+ "product": "HEY2",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.SecurityException",
+ "message": "MediaProjection requires FOREGROUND_SERVICE_MEDIA_PROJECTION",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.acquireProjection(ScreenCastService.java:167)",
+ "at com.foxx.androidcast.ui.MainActivity.startCast(MainActivity.java:89)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_008.json b/examples/crash_reporter/test_reports/crash_java_008.json
new file mode 100644
index 0000000..8a0c2e9
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_008.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "96e585ab-41d0-5862-a1d7-221fb191463b",
+ "generated_at_epoch_ms": 1777652246115,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_161726.json",
+ "fingerprint": "b2c3d4e5f6a01codec",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777649964933,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_161726.json"
+ },
+ "device": {
+ "manufacturer": "Huawei",
+ "brand": "HUAWEI",
+ "model": "MatePad 11",
+ "device": "BAH3",
+ "product": "BAH3",
+ "sdk_int": 31,
+ "release": "12",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "EncoderThread-1",
+ "exception": "java.lang.IllegalStateException",
+ "message": "MediaCodec codec is released already",
+ "stack_frames": [
+ "at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)",
+ "at com.foxx.androidcast.encoder.H264Encoder.drain(H264Encoder.java:88)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_009.json b/examples/crash_reporter/test_reports/crash_java_009.json
new file mode 100644
index 0000000..4cc8c40
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_009.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "ceaedbcf-a8e6-56f9-b813-ee9ed5571690",
+ "generated_at_epoch_ms": 1777653179464,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_163259.json",
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777652675161,
+ "last_activity": "CastSettingsActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_163259.json"
+ },
+ "device": {
+ "manufacturer": "Asus",
+ "brand": "asus",
+ "model": "ZenPad 10",
+ "device": "P00C",
+ "product": "P00C",
+ "sdk_int": 29,
+ "release": "10",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "encoderSurface was null when starting capture",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.startCapture(ScreenCastService.java:412)",
+ "at com.foxx.androidcast.sender.ScreenCastService.onStartCommand(ScreenCastService.java:205)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_010.json b/examples/crash_reporter/test_reports/crash_java_010.json
new file mode 100644
index 0000000..e6d1e28
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_010.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "5511c727-8375-57ba-805b-3335ef39649c",
+ "generated_at_epoch_ms": 1777653519182,
+ "crash_type": "java",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260501_163839.json",
+ "fingerprint": "f6a01b02c03d04e05perm",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777652291653,
+ "last_activity": "MainActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_163839.json"
+ },
+ "device": {
+ "manufacturer": "Doogee",
+ "brand": "DOOGEE",
+ "model": "Tab G6 Max",
+ "device": "TabG6Max",
+ "product": "TabG6Max",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.SecurityException",
+ "message": "MediaProjection requires FOREGROUND_SERVICE_MEDIA_PROJECTION",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.acquireProjection(ScreenCastService.java:167)",
+ "at com.foxx.androidcast.ui.MainActivity.startCast(MainActivity.java:89)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_011.json b/examples/crash_reporter/test_reports/crash_java_011.json
new file mode 100644
index 0000000..74a8664
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_011.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "6869f88e-5ea9-5d0b-8f54-a42d28b34669",
+ "generated_at_epoch_ms": 1777657433843,
+ "crash_type": "java",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260501_174353.json",
+ "fingerprint": "d4e5f6a01b02c03net",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777654788397,
+ "last_activity": "MainActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_174353.json"
+ },
+ "device": {
+ "manufacturer": "Google",
+ "brand": "google",
+ "model": "Pixel Tablet",
+ "device": "tangorpro",
+ "product": "tangorpro",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "UdpSender-1",
+ "exception": "java.net.SocketTimeoutException",
+ "message": "connect timed out",
+ "stack_frames": [
+ "at com.foxx.androidcast.network.udp.UdpCastTransport.send(UdpCastTransport.java:142)",
+ "at com.foxx.androidcast.sender.ScreenCastService.flushStats(ScreenCastService.java:455)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_012.json b/examples/crash_reporter/test_reports/crash_java_012.json
new file mode 100644
index 0000000..8648b16
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_012.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "067d7e49-9346-5e0a-adec-ad0e9e381cbd",
+ "generated_at_epoch_ms": 1777657112214,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_173832.json",
+ "fingerprint": "d4e5f6a01b02c03net",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777656083966,
+ "last_activity": "MainActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_173832.json"
+ },
+ "device": {
+ "manufacturer": "Realme",
+ "brand": "realme",
+ "model": "Pad 2",
+ "device": "RMX2201",
+ "product": "RMX2201",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "UdpSender-1",
+ "exception": "java.net.SocketTimeoutException",
+ "message": "connect timed out",
+ "stack_frames": [
+ "at com.foxx.androidcast.network.udp.UdpCastTransport.send(UdpCastTransport.java:142)",
+ "at com.foxx.androidcast.sender.ScreenCastService.flushStats(ScreenCastService.java:455)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_013.json b/examples/crash_reporter/test_reports/crash_java_013.json
new file mode 100644
index 0000000..e91ac7e
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_013.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "15a408ce-98f6-54a7-949f-4006dae99652",
+ "generated_at_epoch_ms": 1777659308389,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_181508.json",
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777655747320,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_181508.json"
+ },
+ "device": {
+ "manufacturer": "Google",
+ "brand": "google",
+ "model": "Pixel Tablet",
+ "device": "tangorpro",
+ "product": "tangorpro",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "Attempt to invoke virtual method on a null object reference",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.onCreate(ScreenCastService.java:118)",
+ "at android.app.ActivityThread.handleCreateService(ActivityThread.java:5148)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_014.json b/examples/crash_reporter/test_reports/crash_java_014.json
new file mode 100644
index 0000000..649122d
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_014.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "7893ac74-3588-597a-af7c-f93526eb15e5",
+ "generated_at_epoch_ms": 1777660062021,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_182742.json",
+ "fingerprint": "b2c3d4e5f6a01codec",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777656784323,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_182742.json"
+ },
+ "device": {
+ "manufacturer": "Doogee",
+ "brand": "DOOGEE",
+ "model": "Tab G6 Max",
+ "device": "TabG6Max",
+ "product": "TabG6Max",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "deadbeef"
+ },
+ "java": {
+ "thread": "EncoderThread-1",
+ "exception": "java.lang.IllegalStateException",
+ "message": "MediaCodec codec is released already",
+ "stack_frames": [
+ "at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)",
+ "at com.foxx.androidcast.encoder.H264Encoder.drain(H264Encoder.java:88)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_015.json b/examples/crash_reporter/test_reports/crash_java_015.json
new file mode 100644
index 0000000..13b60b3
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_015.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "2c8cb70c-92e2-51a8-9df1-469b7706f60a",
+ "generated_at_epoch_ms": 1777663450481,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_192410.json",
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777660388518,
+ "last_activity": "CastSettingsActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_192410.json"
+ },
+ "device": {
+ "manufacturer": "Honor",
+ "brand": "HONOR",
+ "model": "Pad X8a",
+ "device": "HEY2",
+ "product": "HEY2",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "encoderSurface was null when starting capture",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.startCapture(ScreenCastService.java:412)",
+ "at com.foxx.androidcast.sender.ScreenCastService.onStartCommand(ScreenCastService.java:205)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_016.json b/examples/crash_reporter/test_reports/crash_java_016.json
new file mode 100644
index 0000000..f67bf90
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_016.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "f73fd6a9-7443-54b1-9eb2-a5a535ea2cd8",
+ "generated_at_epoch_ms": 1777663799507,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_192959.json",
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777660983648,
+ "last_activity": "CastSettingsActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_192959.json"
+ },
+ "device": {
+ "manufacturer": "Google",
+ "brand": "google",
+ "model": "Pixel Tablet",
+ "device": "tangorpro",
+ "product": "tangorpro",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "encoderSurface was null when starting capture",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.startCapture(ScreenCastService.java:412)",
+ "at com.foxx.androidcast.sender.ScreenCastService.onStartCommand(ScreenCastService.java:205)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_017.json b/examples/crash_reporter/test_reports/crash_java_017.json
new file mode 100644
index 0000000..c9da4aa
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_017.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "c9e9926b-76fa-561d-aa17-46978c0e47f9",
+ "generated_at_epoch_ms": 1777668153571,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_204233.json",
+ "fingerprint": "b2c3d4e5f6a01codec",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777664867614,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_204233.json"
+ },
+ "device": {
+ "manufacturer": "Honor",
+ "brand": "HONOR",
+ "model": "Pad X8a",
+ "device": "HEY2",
+ "product": "HEY2",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "java": {
+ "thread": "EncoderThread-1",
+ "exception": "java.lang.IllegalStateException",
+ "message": "MediaCodec codec is released already",
+ "stack_frames": [
+ "at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)",
+ "at com.foxx.androidcast.encoder.H264Encoder.drain(H264Encoder.java:88)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_018.json b/examples/crash_reporter/test_reports/crash_java_018.json
new file mode 100644
index 0000000..91cd0fc
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_018.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "9505baac-56ab-5c01-af00-bee4b7f9c890",
+ "generated_at_epoch_ms": 1777666722712,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_201842.json",
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777664270872,
+ "last_activity": "CastSettingsActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_201842.json"
+ },
+ "device": {
+ "manufacturer": "Google",
+ "brand": "google",
+ "model": "Pixel Tablet",
+ "device": "tangorpro",
+ "product": "tangorpro",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "encoderSurface was null when starting capture",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.startCapture(ScreenCastService.java:412)",
+ "at com.foxx.androidcast.sender.ScreenCastService.onStartCommand(ScreenCastService.java:205)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_019.json b/examples/crash_reporter/test_reports/crash_java_019.json
new file mode 100644
index 0000000..00cae1f
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_019.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "73770992-8cb1-5e89-b4a8-4071aea02efd",
+ "generated_at_epoch_ms": 1777671482437,
+ "crash_type": "java",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260501_213802.json",
+ "fingerprint": "f6a01b02c03d04e05perm",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777669937160,
+ "last_activity": "MainActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_213802.json"
+ },
+ "device": {
+ "manufacturer": "Vivo",
+ "brand": "vivo",
+ "model": "Pad Air",
+ "device": "PA2353",
+ "product": "PA2353",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.SecurityException",
+ "message": "MediaProjection requires FOREGROUND_SERVICE_MEDIA_PROJECTION",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.acquireProjection(ScreenCastService.java:167)",
+ "at com.foxx.androidcast.ui.MainActivity.startCast(MainActivity.java:89)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_020.json b/examples/crash_reporter/test_reports/crash_java_020.json
new file mode 100644
index 0000000..3594320
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_020.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "4f69ca8b-dd03-5f07-8f93-835351975536",
+ "generated_at_epoch_ms": 1777671370829,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_213610.json",
+ "fingerprint": "b2c3d4e5f6a01codec",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777669067031,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_213610.json"
+ },
+ "device": {
+ "manufacturer": "Oppo",
+ "brand": "OPPO",
+ "model": "Pad Neo",
+ "device": "OPD2301",
+ "product": "OPD2301",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "EncoderThread-1",
+ "exception": "java.lang.IllegalStateException",
+ "message": "MediaCodec codec is released already",
+ "stack_frames": [
+ "at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)",
+ "at com.foxx.androidcast.encoder.H264Encoder.drain(H264Encoder.java:88)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_021.json b/examples/crash_reporter/test_reports/crash_java_021.json
new file mode 100644
index 0000000..b6613a3
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_021.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "216c116a-6d0e-597f-bdf3-03bd39c4ce4e",
+ "generated_at_epoch_ms": 1777672002596,
+ "crash_type": "java",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260501_214642.json",
+ "fingerprint": "f6a01b02c03d04e05perm",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777668703009,
+ "last_activity": "MainActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_214642.json"
+ },
+ "device": {
+ "manufacturer": "Asus",
+ "brand": "asus",
+ "model": "ZenPad 10",
+ "device": "P00C",
+ "product": "P00C",
+ "sdk_int": 29,
+ "release": "10",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.SecurityException",
+ "message": "MediaProjection requires FOREGROUND_SERVICE_MEDIA_PROJECTION",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.acquireProjection(ScreenCastService.java:167)",
+ "at com.foxx.androidcast.ui.MainActivity.startCast(MainActivity.java:89)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_022.json b/examples/crash_reporter/test_reports/crash_java_022.json
new file mode 100644
index 0000000..88f52e7
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_022.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "34c1ee1b-8907-55c5-b0a7-09f6bcd56772",
+ "generated_at_epoch_ms": 1777674255484,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_222415.json",
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777672968511,
+ "last_activity": "CastSettingsActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_222415.json"
+ },
+ "device": {
+ "manufacturer": "Vivo",
+ "brand": "vivo",
+ "model": "Pad Air",
+ "device": "PA2353",
+ "product": "PA2353",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "encoderSurface was null when starting capture",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.startCapture(ScreenCastService.java:412)",
+ "at com.foxx.androidcast.sender.ScreenCastService.onStartCommand(ScreenCastService.java:205)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_023.json b/examples/crash_reporter/test_reports/crash_java_023.json
new file mode 100644
index 0000000..f162c67
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_023.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "c419acfc-0ddf-5078-9e4a-f4911cd37c28",
+ "generated_at_epoch_ms": 1777675148668,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_223908.json",
+ "fingerprint": "b2c3d4e5f6a01codec",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777671602955,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_223908.json"
+ },
+ "device": {
+ "manufacturer": "Doogee",
+ "brand": "DOOGEE",
+ "model": "Tab G6 Max",
+ "device": "TabG6Max",
+ "product": "TabG6Max",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "java": {
+ "thread": "EncoderThread-1",
+ "exception": "java.lang.IllegalStateException",
+ "message": "MediaCodec codec is released already",
+ "stack_frames": [
+ "at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)",
+ "at com.foxx.androidcast.encoder.H264Encoder.drain(H264Encoder.java:88)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_024.json b/examples/crash_reporter/test_reports/crash_java_024.json
new file mode 100644
index 0000000..b1d09c0
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_024.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "6d7f8cdc-70d0-56e2-b759-5db3af4f5d9d",
+ "generated_at_epoch_ms": 1777677455341,
+ "crash_type": "java",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260501_231735.json",
+ "fingerprint": "f6a01b02c03d04e05perm",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777677176599,
+ "last_activity": "MainActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_231735.json"
+ },
+ "device": {
+ "manufacturer": "Acer",
+ "brand": "Acer",
+ "model": "Iconia Tab P10",
+ "device": "acer_p10",
+ "product": "acer_p10",
+ "sdk_int": 31,
+ "release": "12",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.SecurityException",
+ "message": "MediaProjection requires FOREGROUND_SERVICE_MEDIA_PROJECTION",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.acquireProjection(ScreenCastService.java:167)",
+ "at com.foxx.androidcast.ui.MainActivity.startCast(MainActivity.java:89)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_025.json b/examples/crash_reporter/test_reports/crash_java_025.json
new file mode 100644
index 0000000..3d78a77
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_025.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "5ce2bedf-456c-56fb-b52a-9803939195c2",
+ "generated_at_epoch_ms": 1777679299939,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_234819.json",
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777677955182,
+ "last_activity": "CastSettingsActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_234819.json"
+ },
+ "device": {
+ "manufacturer": "Asus",
+ "brand": "asus",
+ "model": "ZenPad 10",
+ "device": "P00C",
+ "product": "P00C",
+ "sdk_int": 29,
+ "release": "10",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "encoderSurface was null when starting capture",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.startCapture(ScreenCastService.java:412)",
+ "at com.foxx.androidcast.sender.ScreenCastService.onStartCommand(ScreenCastService.java:205)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_026.json b/examples/crash_reporter/test_reports/crash_java_026.json
new file mode 100644
index 0000000..9c76dc6
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_026.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "d7e67547-cf4f-5f36-8258-c564d06fe3b2",
+ "generated_at_epoch_ms": 1777680351805,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260502_000551.json",
+ "fingerprint": "d4e5f6a01b02c03net",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777679810598,
+ "last_activity": "MainActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260502_000551.json"
+ },
+ "device": {
+ "manufacturer": "Asus",
+ "brand": "asus",
+ "model": "ZenPad 10",
+ "device": "P00C",
+ "product": "P00C",
+ "sdk_int": 29,
+ "release": "10",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "UdpSender-1",
+ "exception": "java.net.SocketTimeoutException",
+ "message": "connect timed out",
+ "stack_frames": [
+ "at com.foxx.androidcast.network.udp.UdpCastTransport.send(UdpCastTransport.java:142)",
+ "at com.foxx.androidcast.sender.ScreenCastService.flushStats(ScreenCastService.java:455)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_027.json b/examples/crash_reporter/test_reports/crash_java_027.json
new file mode 100644
index 0000000..617e9b2
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_027.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "060694f6-1db5-5abe-88b0-b075e4df5340",
+ "generated_at_epoch_ms": 1777684548897,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260502_011548.json",
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777683703283,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260502_011548.json"
+ },
+ "device": {
+ "manufacturer": "Acer",
+ "brand": "Acer",
+ "model": "Iconia Tab P10",
+ "device": "acer_p10",
+ "product": "acer_p10",
+ "sdk_int": 31,
+ "release": "12",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "Attempt to invoke virtual method on a null object reference",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.onCreate(ScreenCastService.java:118)",
+ "at android.app.ActivityThread.handleCreateService(ActivityThread.java:5148)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_028.json b/examples/crash_reporter/test_reports/crash_java_028.json
new file mode 100644
index 0000000..037b684
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_028.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "93d50ff3-01c8-5730-a302-ae7ca81e5957",
+ "generated_at_epoch_ms": 1777684971194,
+ "crash_type": "java",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260502_012251.json",
+ "fingerprint": "f6a01b02c03d04e05perm",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777683058572,
+ "last_activity": "MainActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260502_012251.json"
+ },
+ "device": {
+ "manufacturer": "Lenovo",
+ "brand": "Lenovo",
+ "model": "Tab P12",
+ "device": "TB370FU",
+ "product": "TB370FU",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.SecurityException",
+ "message": "MediaProjection requires FOREGROUND_SERVICE_MEDIA_PROJECTION",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.acquireProjection(ScreenCastService.java:167)",
+ "at com.foxx.androidcast.ui.MainActivity.startCast(MainActivity.java:89)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_029.json b/examples/crash_reporter/test_reports/crash_java_029.json
new file mode 100644
index 0000000..94413c7
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_029.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "2a388a20-7176-5e15-815a-195946cd4329",
+ "generated_at_epoch_ms": 1777688175910,
+ "crash_type": "java",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260502_021615.json",
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777687798182,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260502_021615.json"
+ },
+ "device": {
+ "manufacturer": "Doogee",
+ "brand": "DOOGEE",
+ "model": "Tab G6 Max",
+ "device": "TabG6Max",
+ "product": "TabG6Max",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "Attempt to invoke virtual method on a null object reference",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.onCreate(ScreenCastService.java:118)",
+ "at android.app.ActivityThread.handleCreateService(ActivityThread.java:5148)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_030.json b/examples/crash_reporter/test_reports/crash_java_030.json
new file mode 100644
index 0000000..7efd24f
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_030.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "5d5760dd-5361-5b1a-83f9-db23254ee251",
+ "generated_at_epoch_ms": 1777689521981,
+ "crash_type": "java",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260502_023841.json",
+ "fingerprint": "c3d4e5f6a01b02oom",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777687702443,
+ "last_activity": "MainActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260502_023841.json"
+ },
+ "device": {
+ "manufacturer": "Amazon",
+ "brand": "Amazon",
+ "model": "Fire HD 10",
+ "device": "trona",
+ "product": "trona",
+ "sdk_int": 30,
+ "release": "11",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "pool-3-thread-2",
+ "exception": "java.lang.OutOfMemoryError",
+ "message": "Failed to allocate a 8294400 byte allocation with 524288 free bytes",
+ "stack_frames": [
+ "at android.graphics.Bitmap.createBitmap(Bitmap.java:1234)",
+ "at com.foxx.androidcast.capture.FrameRingBuffer.push(FrameRingBuffer.java:56)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_031.json b/examples/crash_reporter/test_reports/crash_java_031.json
new file mode 100644
index 0000000..4aa2c48
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_031.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "d4d7b8c2-c343-51c7-aa67-09d6ddf652ee",
+ "generated_at_epoch_ms": 1777691419279,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260502_031019.json",
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777688889307,
+ "last_activity": "CastSettingsActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260502_031019.json"
+ },
+ "device": {
+ "manufacturer": "Honor",
+ "brand": "HONOR",
+ "model": "Pad X8a",
+ "device": "HEY2",
+ "product": "HEY2",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "encoderSurface was null when starting capture",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.startCapture(ScreenCastService.java:412)",
+ "at com.foxx.androidcast.sender.ScreenCastService.onStartCommand(ScreenCastService.java:205)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_032.json b/examples/crash_reporter/test_reports/crash_java_032.json
new file mode 100644
index 0000000..0fdafeb
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_032.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "70ae76e3-e960-5b23-8fca-52f545543a64",
+ "generated_at_epoch_ms": 1777694253068,
+ "crash_type": "java",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260502_035733.json",
+ "fingerprint": "c3d4e5f6a01b02oom",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777690690282,
+ "last_activity": "MainActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260502_035733.json"
+ },
+ "device": {
+ "manufacturer": "TCL",
+ "brand": "TCL",
+ "model": "Tab 10 Gen2",
+ "device": "9081G",
+ "product": "9081G",
+ "sdk_int": 31,
+ "release": "12",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "java": {
+ "thread": "pool-3-thread-2",
+ "exception": "java.lang.OutOfMemoryError",
+ "message": "Failed to allocate a 8294400 byte allocation with 524288 free bytes",
+ "stack_frames": [
+ "at android.graphics.Bitmap.createBitmap(Bitmap.java:1234)",
+ "at com.foxx.androidcast.capture.FrameRingBuffer.push(FrameRingBuffer.java:56)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_033.json b/examples/crash_reporter/test_reports/crash_java_033.json
new file mode 100644
index 0000000..b5bcc73
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_033.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "13077573-3fca-55ce-a709-89858ffc58eb",
+ "generated_at_epoch_ms": 1777694523542,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260502_040203.json",
+ "fingerprint": "c3d4e5f6a01b02oom",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777694104868,
+ "last_activity": "MainActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260502_040203.json"
+ },
+ "device": {
+ "manufacturer": "Asus",
+ "brand": "asus",
+ "model": "ZenPad 10",
+ "device": "P00C",
+ "product": "P00C",
+ "sdk_int": 29,
+ "release": "10",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "pool-3-thread-2",
+ "exception": "java.lang.OutOfMemoryError",
+ "message": "Failed to allocate a 8294400 byte allocation with 524288 free bytes",
+ "stack_frames": [
+ "at android.graphics.Bitmap.createBitmap(Bitmap.java:1234)",
+ "at com.foxx.androidcast.capture.FrameRingBuffer.push(FrameRingBuffer.java:56)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_034.json b/examples/crash_reporter/test_reports/crash_java_034.json
new file mode 100644
index 0000000..a16c6f7
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_034.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "83b1155e-07e3-5529-b4cf-7db9cef67e9b",
+ "generated_at_epoch_ms": 1777694454405,
+ "crash_type": "java",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260502_040054.json",
+ "fingerprint": "a1b2c3d4e5f6npe01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777692361013,
+ "last_activity": "CastSettingsActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260502_040054.json"
+ },
+ "device": {
+ "manufacturer": "Motorola",
+ "brand": "motorola",
+ "model": "Tab G70",
+ "device": "scout",
+ "product": "scout",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "java": {
+ "thread": "main",
+ "exception": "java.lang.NullPointerException",
+ "message": "encoderSurface was null when starting capture",
+ "stack_frames": [
+ "at com.foxx.androidcast.sender.ScreenCastService.startCapture(ScreenCastService.java:412)",
+ "at com.foxx.androidcast.sender.ScreenCastService.onStartCommand(ScreenCastService.java:205)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_java_035.json b/examples/crash_reporter/test_reports/crash_java_035.json
new file mode 100644
index 0000000..561e36b
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_java_035.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "report_id": "67ec48ff-beee-59d5-aa7e-19365855f34a",
+ "generated_at_epoch_ms": 1777697828519,
+ "crash_type": "java",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260502_045708.json",
+ "fingerprint": "d4e5f6a01b02c03net",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777696674589,
+ "last_activity": "MainActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260502_045708.json"
+ },
+ "device": {
+ "manufacturer": "Realme",
+ "brand": "realme",
+ "model": "Pad 2",
+ "device": "RMX2201",
+ "product": "RMX2201",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "java": {
+ "thread": "UdpSender-1",
+ "exception": "java.net.SocketTimeoutException",
+ "message": "connect timed out",
+ "stack_frames": [
+ "at com.foxx.androidcast.network.udp.UdpCastTransport.send(UdpCastTransport.java:142)",
+ "at com.foxx.androidcast.sender.ScreenCastService.flushStats(ScreenCastService.java:455)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_001.json b/examples/crash_reporter/test_reports/crash_native_001.json
new file mode 100644
index 0000000..276f8ce
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_001.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "c526b61e-820c-5254-992c-cd4766f555ca",
+ "generated_at_epoch_ms": 1777637950372,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_121910.json",
+ "fingerprint": "nat_fpe_swr03",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777636032824,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_121910.json"
+ },
+ "device": {
+ "manufacturer": "Xiaomi",
+ "brand": "Xiaomi",
+ "model": "Redmi Pad SE",
+ "device": "xun",
+ "product": "xun",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "native": {
+ "signal": "SIGFPE",
+ "backtrace": [
+ "#00 pc 0006b2c4 /vendor/lib64/libswresample.so (resample_internal+196)",
+ "#01 pc 0004a018 /data/app/.../lib/arm64/libandroidcast_audio.so (AudioResampler::convert+80)",
+ "#02 pc 0001ac44 /data/app/.../lib/arm64/libandroidcast_jni.so (native_audio_tick+36)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_002.json b/examples/crash_reporter/test_reports/crash_native_002.json
new file mode 100644
index 0000000..3b3f533
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_002.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "72952232-109d-588b-a520-662591ba485b",
+ "generated_at_epoch_ms": 1777639901368,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_125141.json",
+ "fingerprint": "e5f6a01b02c03d04nat",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777638604183,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_125141.json"
+ },
+ "device": {
+ "manufacturer": "Amazon",
+ "brand": "Amazon",
+ "model": "Fire HD 10",
+ "device": "trona",
+ "product": "trona",
+ "sdk_int": 30,
+ "release": "11",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "native": {
+ "signal": "SIGSEGV",
+ "backtrace": [
+ "#00 pc 00012ab4 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (crash_hook_backtrace+64)",
+ "#01 pc 0003f210 /data/app/.../lib/arm64/libandroidcast_jni.so (Java_com_foxx_androidcast_native_CrashHook_notify+28)",
+ "#02 pc 00021c44 /system/lib64/libart.so (art_quick_generic_jni_trampoline+148)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_003.json b/examples/crash_reporter/test_reports/crash_native_003.json
new file mode 100644
index 0000000..6b65966
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_003.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "aa4956be-2153-50c5-85ce-981c4acaf4a1",
+ "generated_at_epoch_ms": 1777642392539,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_133312.json",
+ "fingerprint": "nat_bus_frb02",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777639939868,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_133312.json"
+ },
+ "device": {
+ "manufacturer": "Honor",
+ "brand": "HONOR",
+ "model": "Pad X8a",
+ "device": "HEY2",
+ "product": "HEY2",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "cafebabe"
+ },
+ "native": {
+ "signal": "SIGBUS",
+ "backtrace": [
+ "#00 pc 0000c210 /data/app/.../lib/arm64/libandroidcast_capture.so (FrameRingBuffer::slot_at+28)",
+ "#01 pc 0000d884 /data/app/.../lib/arm64/libandroidcast_capture.so (FrameRingBuffer::push_copy+112)",
+ "#02 pc 0002f1a0 /data/app/.../lib/arm64/libandroidcast_jni.so (native_on_frame+64)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_004.json b/examples/crash_reporter/test_reports/crash_native_004.json
new file mode 100644
index 0000000..47208b9
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_004.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "76bd7725-4c33-5e86-95bd-d0e864788736",
+ "generated_at_epoch_ms": 1777644518166,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_140838.json",
+ "fingerprint": "nat_ill_insn06",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777641260785,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_140838.json"
+ },
+ "device": {
+ "manufacturer": "Oppo",
+ "brand": "OPPO",
+ "model": "Pad Neo",
+ "device": "OPD2301",
+ "product": "OPD2301",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "native": {
+ "signal": "SIGILL",
+ "backtrace": [
+ "#00 pc 00004580 /data/app/.../lib/arm64/libh264_neon.so (neon_idct_invalid+8)",
+ "#01 pc 00012f40 /data/app/.../lib/arm64/libandroidcast_encoder.so (H264Encoder::decode_slice+128)",
+ "#02 pc 00008c00 /data/app/.../lib/arm64/libandroidcast_jni.so (encoder_worker+200)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_005.json b/examples/crash_reporter/test_reports/crash_native_005.json
new file mode 100644
index 0000000..056df78
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_005.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "5f9bd6e4-41ba-5791-92fd-fc1405490a3b",
+ "generated_at_epoch_ms": 1777646268225,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_143748.json",
+ "fingerprint": "nat_fpe_swr03",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777645932614,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_143748.json"
+ },
+ "device": {
+ "manufacturer": "Lenovo",
+ "brand": "Lenovo",
+ "model": "Tab P12",
+ "device": "TB370FU",
+ "product": "TB370FU",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "native": {
+ "signal": "SIGFPE",
+ "backtrace": [
+ "#00 pc 0006b2c4 /vendor/lib64/libswresample.so (resample_internal+196)",
+ "#01 pc 0004a018 /data/app/.../lib/arm64/libandroidcast_audio.so (AudioResampler::convert+80)",
+ "#02 pc 0001ac44 /data/app/.../lib/arm64/libandroidcast_jni.so (native_audio_tick+36)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_006.json b/examples/crash_reporter/test_reports/crash_native_006.json
new file mode 100644
index 0000000..dc8e638
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_006.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "6cfc9c6e-8b4d-5d49-bcc2-66fcf02b1716",
+ "generated_at_epoch_ms": 1777648880741,
+ "crash_type": "native",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260501_152120.json",
+ "fingerprint": "nat_abort01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777648347993,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_152120.json"
+ },
+ "device": {
+ "manufacturer": "Xiaomi",
+ "brand": "Xiaomi",
+ "model": "Redmi Pad SE",
+ "device": "xun",
+ "product": "xun",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "cafebabe"
+ },
+ "native": {
+ "signal": "SIGABRT",
+ "backtrace": [
+ "#00 pc 0008c4bc /apex/com.android.runtime/lib64/bionic/libc.so (abort+164)",
+ "#01 pc 00005120 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (crash_hook_abort+48)",
+ "#02 pc 0003a8f0 /data/app/.../lib/arm64/libandroidcast_jni.so (jni_fatal_callback+20)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_007.json b/examples/crash_reporter/test_reports/crash_native_007.json
new file mode 100644
index 0000000..2713888
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_007.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "556fa879-3b4a-5685-9dfb-ab4c35cd8d72",
+ "generated_at_epoch_ms": 1777649186965,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": ":crashwatcher",
+ "report_file": "crash_20260501_152626.json",
+ "fingerprint": "nat_trap_jni05",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777646381894,
+ "last_activity": "MainActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_152626.json"
+ },
+ "device": {
+ "manufacturer": "Motorola",
+ "brand": "motorola",
+ "model": "Tab G70",
+ "device": "scout",
+ "product": "scout",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "native": {
+ "signal": "SIGTRAP",
+ "backtrace": [
+ "#00 pc 00002d10 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (debug_trap_handler+16)",
+ "#01 pc 00019c80 /system/lib64/libart.so (art::Thread::DumpStack+320)",
+ "#02 pc 0000e4a8 /data/app/.../lib/arm64/libandroidcast_jni.so (CrashHook::selfTest+24)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_008.json b/examples/crash_reporter/test_reports/crash_native_008.json
new file mode 100644
index 0000000..31ccf5d
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_008.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "17f5426b-0c1c-555d-8655-a1219afbee42",
+ "generated_at_epoch_ms": 1777651861776,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_161101.json",
+ "fingerprint": "nat_fpe_swr03",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777650609201,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_161101.json"
+ },
+ "device": {
+ "manufacturer": "OnePlus",
+ "brand": "OnePlus",
+ "model": "Pad Go",
+ "device": "OPD2303",
+ "product": "OPD2303",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "native": {
+ "signal": "SIGFPE",
+ "backtrace": [
+ "#00 pc 0006b2c4 /vendor/lib64/libswresample.so (resample_internal+196)",
+ "#01 pc 0004a018 /data/app/.../lib/arm64/libandroidcast_audio.so (AudioResampler::convert+80)",
+ "#02 pc 0001ac44 /data/app/.../lib/arm64/libandroidcast_jni.so (native_audio_tick+36)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_009.json b/examples/crash_reporter/test_reports/crash_native_009.json
new file mode 100644
index 0000000..7323850
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_009.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "b03ab2b4-7488-558d-a50a-f0bc90d5ff56",
+ "generated_at_epoch_ms": 1777651475761,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_160435.json",
+ "fingerprint": "nat_stfg_omx01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777649872633,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_160435.json"
+ },
+ "device": {
+ "manufacturer": "Vivo",
+ "brand": "vivo",
+ "model": "Pad Air",
+ "device": "PA2353",
+ "product": "PA2353",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "native": {
+ "signal": "SIGSEGV",
+ "backtrace": [
+ "#00 pc 000a4120 /system/lib64/libstagefright.so (android::MediaCodec::onMessageReceived+312)",
+ "#01 pc 0004e8c4 /system/lib64/libhidlbase.so (android::hardware::media::omx::V1_0::IOmxNode::dispatchMessage+68)",
+ "#02 pc 0001d330 /data/app/.../lib/arm64/libandroidcast_encoder.so (AvcEncoder::drainNAL+44)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_010.json b/examples/crash_reporter/test_reports/crash_native_010.json
new file mode 100644
index 0000000..17187f7
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_010.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "6b948858-84a5-518f-8286-2f7e14b96274",
+ "generated_at_epoch_ms": 1777653157299,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_163237.json",
+ "fingerprint": "nat_abort01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777651309087,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_163237.json"
+ },
+ "device": {
+ "manufacturer": "Samsung",
+ "brand": "samsung",
+ "model": "Galaxy Tab A9+",
+ "device": "gta9pwifi",
+ "product": "gta9pwifi",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "native": {
+ "signal": "SIGABRT",
+ "backtrace": [
+ "#00 pc 0008c4bc /apex/com.android.runtime/lib64/bionic/libc.so (abort+164)",
+ "#01 pc 00005120 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (crash_hook_abort+48)",
+ "#02 pc 0003a8f0 /data/app/.../lib/arm64/libandroidcast_jni.so (jni_fatal_callback+20)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_011.json b/examples/crash_reporter/test_reports/crash_native_011.json
new file mode 100644
index 0000000..dcb8266
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_011.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "10fcd204-f8c5-5ba2-85a3-be27922d979a",
+ "generated_at_epoch_ms": 1777654532940,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_165532.json",
+ "fingerprint": "nat_fpe_swr03",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777652755681,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_165532.json"
+ },
+ "device": {
+ "manufacturer": "Huawei",
+ "brand": "HUAWEI",
+ "model": "MatePad 11",
+ "device": "BAH3",
+ "product": "BAH3",
+ "sdk_int": 31,
+ "release": "12",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "native": {
+ "signal": "SIGFPE",
+ "backtrace": [
+ "#00 pc 0006b2c4 /vendor/lib64/libswresample.so (resample_internal+196)",
+ "#01 pc 0004a018 /data/app/.../lib/arm64/libandroidcast_audio.so (AudioResampler::convert+80)",
+ "#02 pc 0001ac44 /data/app/.../lib/arm64/libandroidcast_jni.so (native_audio_tick+36)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_012.json b/examples/crash_reporter/test_reports/crash_native_012.json
new file mode 100644
index 0000000..f116049
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_012.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "ddc19d03-1386-5463-ab42-d121149515ef",
+ "generated_at_epoch_ms": 1777658169535,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_175609.json",
+ "fingerprint": "nat_fpe_swr03",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777654789261,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_175609.json"
+ },
+ "device": {
+ "manufacturer": "Acer",
+ "brand": "Acer",
+ "model": "Iconia Tab P10",
+ "device": "acer_p10",
+ "product": "acer_p10",
+ "sdk_int": 31,
+ "release": "12",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "native": {
+ "signal": "SIGFPE",
+ "backtrace": [
+ "#00 pc 0006b2c4 /vendor/lib64/libswresample.so (resample_internal+196)",
+ "#01 pc 0004a018 /data/app/.../lib/arm64/libandroidcast_audio.so (AudioResampler::convert+80)",
+ "#02 pc 0001ac44 /data/app/.../lib/arm64/libandroidcast_jni.so (native_audio_tick+36)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_013.json b/examples/crash_reporter/test_reports/crash_native_013.json
new file mode 100644
index 0000000..048a5af
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_013.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "825f1bb7-2ce1-584e-aed0-998a788a9c70",
+ "generated_at_epoch_ms": 1777660865516,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_184105.json",
+ "fingerprint": "e5f6a01b02c03d04nat",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777658753664,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_184105.json"
+ },
+ "device": {
+ "manufacturer": "Xiaomi",
+ "brand": "Xiaomi",
+ "model": "Redmi Pad SE",
+ "device": "xun",
+ "product": "xun",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "native": {
+ "signal": "SIGSEGV",
+ "backtrace": [
+ "#00 pc 00012ab4 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (crash_hook_backtrace+64)",
+ "#01 pc 0003f210 /data/app/.../lib/arm64/libandroidcast_jni.so (Java_com_foxx_androidcast_native_CrashHook_notify+28)",
+ "#02 pc 00021c44 /system/lib64/libart.so (art_quick_generic_jni_trampoline+148)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_014.json b/examples/crash_reporter/test_reports/crash_native_014.json
new file mode 100644
index 0000000..491a2ce
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_014.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "b822f590-a767-5daa-b7cf-922cc55a8e2e",
+ "generated_at_epoch_ms": 1777662111621,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_190151.json",
+ "fingerprint": "nat_stfg_omx01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777660533523,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_190151.json"
+ },
+ "device": {
+ "manufacturer": "Google",
+ "brand": "google",
+ "model": "Pixel Tablet",
+ "device": "tangorpro",
+ "product": "tangorpro",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "cafebabe"
+ },
+ "native": {
+ "signal": "SIGSEGV",
+ "backtrace": [
+ "#00 pc 000a4120 /system/lib64/libstagefright.so (android::MediaCodec::onMessageReceived+312)",
+ "#01 pc 0004e8c4 /system/lib64/libhidlbase.so (android::hardware::media::omx::V1_0::IOmxNode::dispatchMessage+68)",
+ "#02 pc 0001d330 /data/app/.../lib/arm64/libandroidcast_encoder.so (AvcEncoder::drainNAL+44)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_015.json b/examples/crash_reporter/test_reports/crash_native_015.json
new file mode 100644
index 0000000..f540ffa
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_015.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "a2e8b6a8-99c8-5748-bd6f-b00f0a2bb2ec",
+ "generated_at_epoch_ms": 1777664275146,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_193755.json",
+ "fingerprint": "nat_bus_frb02",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777663387589,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_193755.json"
+ },
+ "device": {
+ "manufacturer": "Oppo",
+ "brand": "OPPO",
+ "model": "Pad Neo",
+ "device": "OPD2301",
+ "product": "OPD2301",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "native": {
+ "signal": "SIGBUS",
+ "backtrace": [
+ "#00 pc 0000c210 /data/app/.../lib/arm64/libandroidcast_capture.so (FrameRingBuffer::slot_at+28)",
+ "#01 pc 0000d884 /data/app/.../lib/arm64/libandroidcast_capture.so (FrameRingBuffer::push_copy+112)",
+ "#02 pc 0002f1a0 /data/app/.../lib/arm64/libandroidcast_jni.so (native_on_frame+64)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_016.json b/examples/crash_reporter/test_reports/crash_native_016.json
new file mode 100644
index 0000000..5cfc158
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_016.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "d3089352-3954-5b40-ae17-e9305c8040af",
+ "generated_at_epoch_ms": 1777665414119,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_195654.json",
+ "fingerprint": "e5f6a01b02c03d04nat",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777662872545,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_195654.json"
+ },
+ "device": {
+ "manufacturer": "Google",
+ "brand": "google",
+ "model": "Pixel Tablet",
+ "device": "tangorpro",
+ "product": "tangorpro",
+ "sdk_int": 34,
+ "release": "14",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "native": {
+ "signal": "SIGSEGV",
+ "backtrace": [
+ "#00 pc 00012ab4 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (crash_hook_backtrace+64)",
+ "#01 pc 0003f210 /data/app/.../lib/arm64/libandroidcast_jni.so (Java_com_foxx_androidcast_native_CrashHook_notify+28)",
+ "#02 pc 00021c44 /system/lib64/libart.so (art_quick_generic_jni_trampoline+148)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_017.json b/examples/crash_reporter/test_reports/crash_native_017.json
new file mode 100644
index 0000000..65b8af8
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_017.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "c496da41-05ed-583b-9fc3-3b9f89b98275",
+ "generated_at_epoch_ms": 1777665065168,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": ":crashwatcher",
+ "report_file": "crash_20260501_195105.json",
+ "fingerprint": "e5f6a01b02c03d04nat",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777663543751,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_195105.json"
+ },
+ "device": {
+ "manufacturer": "Motorola",
+ "brand": "motorola",
+ "model": "Tab G70",
+ "device": "scout",
+ "product": "scout",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "native": {
+ "signal": "SIGSEGV",
+ "backtrace": [
+ "#00 pc 00008f20 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (unwind_stub+32)",
+ "#01 pc 00011a04 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (native_stub_write+96)",
+ "#02 pc 0002bc10 /apex/com.android.runtime/lib64/bionic/libc.so (__restore_rt)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_018.json b/examples/crash_reporter/test_reports/crash_native_018.json
new file mode 100644
index 0000000..b707e53
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_018.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "65038fa7-0791-5e19-8d80-2e489cc3b066",
+ "generated_at_epoch_ms": 1777668938569,
+ "crash_type": "native",
+ "scenario": "app_runtime",
+ "process": "main",
+ "report_file": "crash_20260501_205538.json",
+ "fingerprint": "nat_abort01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777666345594,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_205538.json"
+ },
+ "device": {
+ "manufacturer": "Amazon",
+ "brand": "Amazon",
+ "model": "Fire HD 10",
+ "device": "trona",
+ "product": "trona",
+ "sdk_int": 30,
+ "release": "11",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "cafebabe"
+ },
+ "native": {
+ "signal": "SIGABRT",
+ "backtrace": [
+ "#00 pc 0008c4bc /apex/com.android.runtime/lib64/bionic/libc.so (abort+164)",
+ "#01 pc 00005120 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (crash_hook_abort+48)",
+ "#02 pc 0003a8f0 /data/app/.../lib/arm64/libandroidcast_jni.so (jni_fatal_callback+20)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_019.json b/examples/crash_reporter/test_reports/crash_native_019.json
new file mode 100644
index 0000000..f95706a
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_019.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "43f0eaf8-e2ba-5354-9299-ea1797ecd1e7",
+ "generated_at_epoch_ms": 1777668794830,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_205314.json",
+ "fingerprint": "nat_fpe_swr03",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777666232562,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_205314.json"
+ },
+ "device": {
+ "manufacturer": "Nokia",
+ "brand": "HMD Global",
+ "model": "T21",
+ "device": "RON",
+ "product": "RON",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "native": {
+ "signal": "SIGFPE",
+ "backtrace": [
+ "#00 pc 0006b2c4 /vendor/lib64/libswresample.so (resample_internal+196)",
+ "#01 pc 0004a018 /data/app/.../lib/arm64/libandroidcast_audio.so (AudioResampler::convert+80)",
+ "#02 pc 0001ac44 /data/app/.../lib/arm64/libandroidcast_jni.so (native_audio_tick+36)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_020.json b/examples/crash_reporter/test_reports/crash_native_020.json
new file mode 100644
index 0000000..72565d9
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_020.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "5f2db805-2741-5055-8655-98c4b76968d7",
+ "generated_at_epoch_ms": 1777669941654,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": ":crashwatcher",
+ "report_file": "crash_20260501_211221.json",
+ "fingerprint": "nat_trap_jni05",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777666607883,
+ "last_activity": "MainActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_211221.json"
+ },
+ "device": {
+ "manufacturer": "Amazon",
+ "brand": "Amazon",
+ "model": "Fire HD 10",
+ "device": "trona",
+ "product": "trona",
+ "sdk_int": 30,
+ "release": "11",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "native": {
+ "signal": "SIGTRAP",
+ "backtrace": [
+ "#00 pc 00002d10 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (debug_trap_handler+16)",
+ "#01 pc 00019c80 /system/lib64/libart.so (art::Thread::DumpStack+320)",
+ "#02 pc 0000e4a8 /data/app/.../lib/arm64/libandroidcast_jni.so (CrashHook::selfTest+24)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_021.json b/examples/crash_reporter/test_reports/crash_native_021.json
new file mode 100644
index 0000000..88acd9c
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_021.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "cda272d4-c971-5663-a773-93204367cfb6",
+ "generated_at_epoch_ms": 1777673060868,
+ "crash_type": "native",
+ "scenario": "app_runtime",
+ "process": ":crashwatcher",
+ "report_file": "crash_20260501_220420.json",
+ "fingerprint": "nat_trap_jni05",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777671317090,
+ "last_activity": "MainActivity",
+ "sender_cast_active": false,
+ "receiver_cast_active": false,
+ "cast_active": false,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_220420.json"
+ },
+ "device": {
+ "manufacturer": "Asus",
+ "brand": "asus",
+ "model": "ZenPad 10",
+ "device": "P00C",
+ "product": "P00C",
+ "sdk_int": 29,
+ "release": "10",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "native": {
+ "signal": "SIGTRAP",
+ "backtrace": [
+ "#00 pc 00002d10 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (debug_trap_handler+16)",
+ "#01 pc 00019c80 /system/lib64/libart.so (art::Thread::DumpStack+320)",
+ "#02 pc 0000e4a8 /data/app/.../lib/arm64/libandroidcast_jni.so (CrashHook::selfTest+24)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_022.json b/examples/crash_reporter/test_reports/crash_native_022.json
new file mode 100644
index 0000000..96ee8bf
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_022.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "57db3ba8-967d-5b5c-9c1f-817818bb2746",
+ "generated_at_epoch_ms": 1777675665245,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_224745.json",
+ "fingerprint": "nat_abort01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777673525589,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_224745.json"
+ },
+ "device": {
+ "manufacturer": "Motorola",
+ "brand": "motorola",
+ "model": "Tab G70",
+ "device": "scout",
+ "product": "scout",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "native": {
+ "signal": "SIGABRT",
+ "backtrace": [
+ "#00 pc 0008c4bc /apex/com.android.runtime/lib64/bionic/libc.so (abort+164)",
+ "#01 pc 00005120 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (crash_hook_abort+48)",
+ "#02 pc 0003a8f0 /data/app/.../lib/arm64/libandroidcast_jni.so (jni_fatal_callback+20)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_023.json b/examples/crash_reporter/test_reports/crash_native_023.json
new file mode 100644
index 0000000..f6dcae8
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_023.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "68146db0-7eef-525c-b766-09018be3373b",
+ "generated_at_epoch_ms": 1777676969621,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260501_230929.json",
+ "fingerprint": "e5f6a01b02c03d04nat",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777673914387,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260501_230929.json"
+ },
+ "device": {
+ "manufacturer": "Asus",
+ "brand": "asus",
+ "model": "ZenPad 10",
+ "device": "P00C",
+ "product": "P00C",
+ "sdk_int": 29,
+ "release": "10",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "native": {
+ "signal": "SIGSEGV",
+ "backtrace": [
+ "#00 pc 00012ab4 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (crash_hook_backtrace+64)",
+ "#01 pc 0003f210 /data/app/.../lib/arm64/libandroidcast_jni.so (Java_com_foxx_androidcast_native_CrashHook_notify+28)",
+ "#02 pc 00021c44 /system/lib64/libart.so (art_quick_generic_jni_trampoline+148)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_024.json b/examples/crash_reporter/test_reports/crash_native_024.json
new file mode 100644
index 0000000..953e65e
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_024.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "314c59be-c63a-5fbb-b24a-23e9275ccc7e",
+ "generated_at_epoch_ms": 1777678301197,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": ":crashwatcher",
+ "report_file": "crash_20260501_233141.json",
+ "fingerprint": "e5f6a01b02c03d04nat",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777676865364,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260501_233141.json"
+ },
+ "device": {
+ "manufacturer": "OnePlus",
+ "brand": "OnePlus",
+ "model": "Pad Go",
+ "device": "OPD2303",
+ "product": "OPD2303",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "native": {
+ "signal": "SIGSEGV",
+ "backtrace": [
+ "#00 pc 00008f20 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (unwind_stub+32)",
+ "#01 pc 00011a04 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (native_stub_write+96)",
+ "#02 pc 0002bc10 /apex/com.android.runtime/lib64/bionic/libc.so (__restore_rt)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_025.json b/examples/crash_reporter/test_reports/crash_native_025.json
new file mode 100644
index 0000000..2749888
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_025.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "159c7878-a641-5d95-8751-7462e861477d",
+ "generated_at_epoch_ms": 1777680848900,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260502_001408.json",
+ "fingerprint": "nat_bus_frb02",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777677570321,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260502_001408.json"
+ },
+ "device": {
+ "manufacturer": "TCL",
+ "brand": "TCL",
+ "model": "Tab 10 Gen2",
+ "device": "9081G",
+ "product": "9081G",
+ "sdk_int": 31,
+ "release": "12",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "deadbeef"
+ },
+ "native": {
+ "signal": "SIGBUS",
+ "backtrace": [
+ "#00 pc 0000c210 /data/app/.../lib/arm64/libandroidcast_capture.so (FrameRingBuffer::slot_at+28)",
+ "#01 pc 0000d884 /data/app/.../lib/arm64/libandroidcast_capture.so (FrameRingBuffer::push_copy+112)",
+ "#02 pc 0002f1a0 /data/app/.../lib/arm64/libandroidcast_jni.so (native_on_frame+64)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_026.json b/examples/crash_reporter/test_reports/crash_native_026.json
new file mode 100644
index 0000000..ff6c7eb
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_026.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "9f7265e7-4639-5784-9a53-9f3b22b1f8ca",
+ "generated_at_epoch_ms": 1777683021539,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260502_005021.json",
+ "fingerprint": "nat_bus_frb02",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777681133749,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260502_005021.json"
+ },
+ "device": {
+ "manufacturer": "Realme",
+ "brand": "realme",
+ "model": "Pad 2",
+ "device": "RMX2201",
+ "product": "RMX2201",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "deadbeef"
+ },
+ "native": {
+ "signal": "SIGBUS",
+ "backtrace": [
+ "#00 pc 0000c210 /data/app/.../lib/arm64/libandroidcast_capture.so (FrameRingBuffer::slot_at+28)",
+ "#01 pc 0000d884 /data/app/.../lib/arm64/libandroidcast_capture.so (FrameRingBuffer::push_copy+112)",
+ "#02 pc 0002f1a0 /data/app/.../lib/arm64/libandroidcast_jni.so (native_on_frame+64)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_027.json b/examples/crash_reporter/test_reports/crash_native_027.json
new file mode 100644
index 0000000..ac43d3f
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_027.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "cf206696-9e1e-5400-9df5-63a912e1a886",
+ "generated_at_epoch_ms": 1777682272559,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260502_003752.json",
+ "fingerprint": "nat_bus_frb02",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777679114435,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260502_003752.json"
+ },
+ "device": {
+ "manufacturer": "Oppo",
+ "brand": "OPPO",
+ "model": "Pad Neo",
+ "device": "OPD2301",
+ "product": "OPD2301",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.2.0-dev",
+ "version_code": 120
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "a1b2c3d4"
+ },
+ "native": {
+ "signal": "SIGBUS",
+ "backtrace": [
+ "#00 pc 0000c210 /data/app/.../lib/arm64/libandroidcast_capture.so (FrameRingBuffer::slot_at+28)",
+ "#01 pc 0000d884 /data/app/.../lib/arm64/libandroidcast_capture.so (FrameRingBuffer::push_copy+112)",
+ "#02 pc 0002f1a0 /data/app/.../lib/arm64/libandroidcast_jni.so (native_on_frame+64)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_028.json b/examples/crash_reporter/test_reports/crash_native_028.json
new file mode 100644
index 0000000..24012b2
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_028.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "e6e264d0-e701-51a8-a220-9a3bcb2e59dd",
+ "generated_at_epoch_ms": 1777687156463,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260502_015916.json",
+ "fingerprint": "nat_stfg_omx01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777685716746,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260502_015916.json"
+ },
+ "device": {
+ "manufacturer": "OnePlus",
+ "brand": "OnePlus",
+ "model": "Pad Go",
+ "device": "OPD2303",
+ "product": "OPD2303",
+ "sdk_int": 33,
+ "release": "13",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": true,
+ "git_commit": "cafebabe"
+ },
+ "native": {
+ "signal": "SIGSEGV",
+ "backtrace": [
+ "#00 pc 000a4120 /system/lib64/libstagefright.so (android::MediaCodec::onMessageReceived+312)",
+ "#01 pc 0004e8c4 /system/lib64/libhidlbase.so (android::hardware::media::omx::V1_0::IOmxNode::dispatchMessage+68)",
+ "#02 pc 0001d330 /data/app/.../lib/arm64/libandroidcast_encoder.so (AvcEncoder::drainNAL+44)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_029.json b/examples/crash_reporter/test_reports/crash_native_029.json
new file mode 100644
index 0000000..01f0049
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_029.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "b3b37e98-a05b-58de-a6f1-80c7b1b3eec1",
+ "generated_at_epoch_ms": 1777685947705,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260502_013907.json",
+ "fingerprint": "nat_ill_insn06",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777683221308,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": true,
+ "last_session_file": "session_send_20260502_013907.json"
+ },
+ "device": {
+ "manufacturer": "Acer",
+ "brand": "Acer",
+ "model": "Iconia Tab P10",
+ "device": "acer_p10",
+ "product": "acer_p10",
+ "sdk_int": 31,
+ "release": "12",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.0",
+ "version_code": 100
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "deadbeef"
+ },
+ "native": {
+ "signal": "SIGILL",
+ "backtrace": [
+ "#00 pc 00004580 /data/app/.../lib/arm64/libh264_neon.so (neon_idct_invalid+8)",
+ "#01 pc 00012f40 /data/app/.../lib/arm64/libandroidcast_encoder.so (H264Encoder::decode_slice+128)",
+ "#02 pc 00008c00 /data/app/.../lib/arm64/libandroidcast_jni.so (encoder_worker+200)"
+ ]
+ }
+}
diff --git a/examples/crash_reporter/test_reports/crash_native_030.json b/examples/crash_reporter/test_reports/crash_native_030.json
new file mode 100644
index 0000000..6a6a66b
--- /dev/null
+++ b/examples/crash_reporter/test_reports/crash_native_030.json
@@ -0,0 +1,49 @@
+{
+ "schema_version": 1,
+ "report_id": "47e5cfc9-d568-5177-8db2-0c12a52d70aa",
+ "generated_at_epoch_ms": 1777690239513,
+ "crash_type": "native",
+ "scenario": "cast_session",
+ "process": "main",
+ "report_file": "crash_20260502_025039.json",
+ "fingerprint": "nat_abort01",
+ "runtime_context": {
+ "app_started_epoch_ms": 1777690003074,
+ "last_activity": "ScreenCastActivity",
+ "sender_cast_active": true,
+ "receiver_cast_active": false,
+ "cast_active": true,
+ "session_stats_active": false,
+ "last_session_file": "session_send_20260502_025039.json"
+ },
+ "device": {
+ "manufacturer": "TCL",
+ "brand": "TCL",
+ "model": "Tab 10 Gen2",
+ "device": "9081G",
+ "product": "9081G",
+ "sdk_int": 31,
+ "release": "12",
+ "abis": [
+ "arm64-v8a",
+ "armeabi-v7a"
+ ]
+ },
+ "app": {
+ "package": "com.foxx.androidcast",
+ "version_name": "0.1.1",
+ "version_code": 101
+ },
+ "build": {
+ "debug": false,
+ "git_commit": "cafebabe"
+ },
+ "native": {
+ "signal": "SIGABRT",
+ "backtrace": [
+ "#00 pc 0008c4bc /apex/com.android.runtime/lib64/bionic/libc.so (abort+164)",
+ "#01 pc 00005120 /data/app/.../lib/arm64/libandroidcast_crash_hook.so (crash_hook_abort+48)",
+ "#02 pc 0003a8f0 /data/app/.../lib/arm64/libandroidcast_jni.so (jni_fatal_callback+20)"
+ ]
+ }
+}