Skip to content

fix(android): Preserve custom Throwable identities - #5881

Open
sentry-junior[bot] wants to merge 2 commits into
mainfrom
fix/android-preserve-throwable-identities
Open

fix(android): Preserve custom Throwable identities#5881
sentry-junior[bot] wants to merge 2 commits into
mainfrom
fix/android-preserve-throwable-identities

Conversation

@sentry-junior

@sentry-junior sentry-junior Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Prevent R8 horizontal class merging from collapsing unrelated custom Throwable subclasses into one runtime type. This keeps captured exception types aligned with retraced constructor frames and avoids incorrect issue titles or grouping.

Consumer ProGuard rule

sentry-android-core now exports a broad rule that preserves distinct throwable class identities while still allowing unused classes to be removed and retained classes to be obfuscated:

-keep,allowshrinking,allowobfuscation class * extends java.lang.Throwable

The rule follows the mitigation recommended by the R8 maintainers.

Requested by Roman Zavarnitsyn.

--

View Junior Session Sentry

sentry-junior Bot and others added 2 commits July 31, 2026 07:47
Co-Authored-By: Roman Zavarnitsyn <roman.zavarnitsyn@sentry.io>
@sentry

sentry Bot commented Jul 31, 2026

Copy link
Copy Markdown

📲 Install Builds

Android

🔗 App Name App ID Version Configuration
SDK Size io.sentry.tests.size 8.51.0 (1) release

⚙️ sentry-android Build Distribution Settings

@romtsn
romtsn marked this pull request as ready for review July 31, 2026 07:58
@romtsn romtsn added the ship-it PR is ready to merge from a reviewer perspective label Jul 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Performance metrics 🚀

  Plain With Sentry Diff
Startup time 382.20 ms 455.94 ms 73.74 ms
Size 0 B 0 B 0 B

Baseline results on branch: main

Startup times

Revision Plain With Sentry Diff
6b019b7 343.31 ms 417.23 ms 73.91 ms
d15471f 342.08 ms 415.44 ms 73.35 ms
8687935 332.52 ms 362.23 ms 29.71 ms
5b1a06b 352.27 ms 413.70 ms 61.43 ms
91bb874 314.47 ms 440.00 ms 125.53 ms
0ee65e9 321.06 ms 361.24 ms 40.18 ms
e63ad34 323.67 ms 390.33 ms 66.67 ms
33a08cc 267.08 ms 340.45 ms 73.37 ms
27d7cf8 397.90 ms 498.65 ms 100.75 ms
ee747ae 405.43 ms 485.70 ms 80.28 ms

App size

Revision Plain With Sentry Diff
6b019b7 0 B 0 B 0 B
d15471f 1.58 MiB 2.13 MiB 559.54 KiB
8687935 1.58 MiB 2.19 MiB 619.17 KiB
5b1a06b 0 B 0 B 0 B
91bb874 1.58 MiB 2.13 MiB 559.07 KiB
0ee65e9 0 B 0 B 0 B
e63ad34 0 B 0 B 0 B
33a08cc 1.58 MiB 2.12 MiB 555.28 KiB
27d7cf8 1.58 MiB 2.12 MiB 549.42 KiB
ee747ae 1.58 MiB 2.10 MiB 530.95 KiB

# Preserve distinct runtime identities for custom Throwables. R8 horizontal class merging can
# otherwise merge unrelated exception classes, causing the runtime type and retraced frames to
# disagree. Unused Throwables may still be removed, and retained Throwables may still be obfuscated.
-keep,allowshrinking,allowobfuscation class * extends java.lang.Throwable

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be just -keepnames (which should be short for Short for -keep,allowshrinking)?

Suggested change
-keep,allowshrinking,allowobfuscation class * extends java.lang.Throwable
-keepnames class * extends java.lang.Throwable

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the idea here is to allow obfuscating the class as well, and keepnames would disable that

# Preserve distinct runtime identities for custom Throwables. R8 horizontal class merging can
# otherwise merge unrelated exception classes, causing the runtime type and retraced frames to
# disagree. Unused Throwables may still be removed, and retained Throwables may still be obfuscated.
-keep,allowshrinking,allowobfuscation class * extends java.lang.Throwable

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We definitely need to check that R8 doesn't flag us here

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it likely does, but there's no other way to work this around, so 🤷 every crash reporter is prone to this issue. But I will check with the R8 config analyzer

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ship-it PR is ready to merge from a reviewer perspective

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants