Skip to content

[Bug]: Production SIGABRT in arm64 native code (Play 2.2.0 / build 181) #982

@piotr-iohk

Description

@piotr-iohk

What happened?

Google Play Console reports a top production crash cluster: SIGABRT in split_config.arm64_v8a.apk for package to.bitkit (mainnet).

  • Native abort() (typical of Rust panic / fatal native assert in release).
  • Stack frames Android - Project setup #1Scan and camera #29 show only raw program counters — not symbolicated to libldk_node.so / libbitkit_core.so in Play Vitals, despite native-debug-symbols.zip (25.7 MB) on bundle 181.aab (2.2.0).
  • Native worker thread (__pthread_start / __start_thread), not main/UI thread.
  • Play Vitals (60-day): ~38% of crash events in top cluster (~60 events, ~22 users); heavily version 181 (2.2.0); mostly foreground; Android 13–16, multiple OEMs.
  • User-perceived crash rate elevated since native Bitkit 2.0 (Feb 2026).

Expected behavior

App must not crash with SIGABRT during normal wallet/Lightning use on production mainnet. Play or local symbolication should resolve native PCs to function names for triage.

Steps to Reproduce

  1. Mainnet wallet, notifications enabled (LightningNodeService running).
  2. Use app in foreground: sync, activity, send/receive Lightning, channels.
  3. Optional: rapid background/foreground, large wallet, post-migration state.
  4. Capture adb logcat around crash.

No deterministic repro confirmed yet.

Logs / Screenshots / Recordings

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 10374 >>> to.bitkit <<<

backtrace:
  #00  pc 0x0000000000077980  /apex/com.android.runtime/lib64/bionic/libc.so (abort+160)
  #01  pc 0x0000000000ceaff0  /data/app/.../split_config.arm64_v8a.apk
  #02  pc 0x0000000000cf22cc  /data/app/.../split_config.arm64_v8a.apk
  #03  pc 0x0000000000cddf58  /data/app/.../split_config.arm64_v8a.apk
  #04  pc 0x00000000009ca2f4  /data/app/.../split_config.arm64_v8a.apk
  #05  pc 0x0000000000cddebc  /data/app/.../split_config.arm64_v8a.apk
  #06  pc 0x0000000000cf35a0  /data/app/.../split_config.arm64_v8a.apk
  #07  pc 0x0000000000cf3208  /data/app/.../split_config.arm64_v8a.apk
  #08  pc 0x0000000000cedf98  /data/app/.../split_config.arm64_v8a.apk
  #09  pc 0x0000000000cde028  /data/app/.../split_config.arm64_v8a.apk
  #10  pc 0x0000000000d25798  /data/app/.../split_config.arm64_v8a.apk
  #11  pc 0x000000000079ad48  /data/app/.../split_config.arm64_v8a.apk
  #12  pc 0x00000000006c3a84  /data/app/.../split_config.arm64_v8a.apk
  #13  pc 0x00000000006c6a18  /data/app/.../split_config.arm64_v8a.apk
  #14  pc 0x00000000006c8aac  /data/app/.../split_config.arm64_v8a.apk
  #15  pc 0x00000000006cb1ec  /data/app/.../split_config.arm64_v8a.apk
  #16  pc 0x0000000000ba6208  /data/app/.../split_config.arm64_v8a.apk
  #17  pc 0x0000000000ba3fb4  /data/app/.../split_config.arm64_v8a.apk
  #18  pc 0x0000000000ba3798  /data/app/.../split_config.arm64_v8a.apk
  #19  pc 0x0000000000ba487c  /data/app/.../split_config.arm64_v8a.apk
  #20  pc 0x0000000000ba5bd0  /data/app/.../split_config.arm64_v8a.apk
  #21  pc 0x000000000057f000  /data/app/.../split_config.arm64_v8a.apk
  #22  pc 0x00000000006c396c  /data/app/.../split_config.arm64_v8a.apk
  #23  pc 0x00000000006c5ac4  /data/app/.../split_config.arm64_v8a.apk
  #24  pc 0x00000000006c6d64  /data/app/.../split_config.arm64_v8a.apk
  #25  pc 0x00000000006cb0b4  /data/app/.../split_config.arm64_v8a.apk
  #26  pc 0x0000000000ba08ec  /data/app/.../split_config.arm64_v8a.apk
  #27  pc 0x0000000000b9a4c8  /data/app/.../split_config.arm64_v8a.apk
  #28  pc 0x0000000000b9b33c  /data/app/.../split_config.arm64_v8a.apk
  #29  pc 0x0000000000cec490  /data/app/.../split_config.arm64_v8a.apk
  #30  pc 0x000000000008a714  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+180)
  #31  pc 0x000000000007b3b4  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+68)

Attach Play vitals screenshots. Symbol zip: rebuild from tag v2.2.0 (app/build/outputs/native-debug-symbols/mainnetRelease/native-debug-symbols.zip) — Play lists symbols on bundle 181 but does not offer download.

Play report: https://play.google.com/console/u/1/developers/5690237613698939049/app/4973032799696771282/vitals/crashes/025a57b3db54dc722bb0cbed27ed8e12/details?isUserPerceived=true&days=60

Bitkit Version

2.2.0 (version code 181), mainnet to.bitkit. Tag v2.2.0 (2026-04-07). Native deps at tag: ldk-node-android 0.7.0-rc.36, bitkit-core-android 0.1.56.

Device / OS

Android 13–16 (SDK 33–36), multiple OEMs (HMD, Pixel, OPPO, Samsung A24, etc.).

Reproducibility

Sometimes (<50%)

Additional context

Engineering triage:

  1. Local symbolication with native-debug-symbols.zip from v2.2.0 build (ndk-stack / llvm-addr2line on arm64-v8a libs).
  2. Likely ldk-node / bitkit-core Rust on background thread; confirm after symbolication.
  3. Archive symbol zip with every release.

Separate FGS clusters: #980, #981. Related: #443.

Metadata

Metadata

Assignees

Labels

prio:highFix it as a patch on the current release.

Type

No fields configured for Bug.

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions