Android crashes: logs and symbols
Distinguish Java/Kotlin exceptions, managed C# exceptions and native crashes first: they require different stacks. “The app closes” without logs cannot identify
Distinguish Java/Kotlin exceptions, managed C# exceptions and native crashes first: they require different stacks. “The app closes” without logs cannot identify a cause.
Collect evidence
- Record package identifier, version code, ABI, device, OS and exact APK/AAB build. Retain the artifact itself.
- Connect the device and capture
adb logcatduring one reproduction. Keep the exception beginning and fullCaused bychain, or the native crash/tombstone block, rather than the final few lines. - Obfuscated Java/Kotlin release code requires that release’s mapping file.
- Native stacks require symbols matching those SO files and ABI. Source builds create a native-symbol archive when both
debug_symbolsandseparate_debug_symbolsare enabled. This code does not establish an archive already published or installed. - For C#, retain the managed stack and matching .NET artifacts. Native symbols cannot automatically recover managed method names.
Locate the cause
ClassNotFoundException concerns Java packaging or shrinking; UnsatisfiedLinkError concerns ABI, missing SO files or dependencies. A native signal requires symbolization and the first-failure stack; ANR requires thread stacks and blocking duration rather than only crash logs.
After a fix, repeat the same scenario in the same release/debug variant. Symbols from a similar build can produce a plausible but incorrect stack. No device run, symbolization or crash reproduction was executed here.