fix(flutter): Avoid JNI callbacks for Android scope sync#3676
Conversation
Moves Android beforeSend tagging and context sync updates from Dart-backed JNI callbacks to Kotlin static methods. This avoids long-lived or short-lived Java→Dart proxy callbacks in the affected scope-sync path while preserving existing event origin/environment tagging and context behavior.
🚨 Detected changes in high risk code 🚨High-risk code has higher potential to break the SDK and may be hard to test. To prevent severe bugs, apply the rollout process for releasing such changes and be extra careful when changing and reviewing these files:
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #3676 +/- ##
==========================================
+ Coverage 86.80% 91.90% +5.09%
==========================================
Files 335 105 -230
Lines 11934 3729 -8205
==========================================
- Hits 10359 3427 -6932
+ Misses 1575 302 -1273
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
📲 Install BuildsAndroid
|
iOS Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 1fff351 | 1265.77 ms | 1256.06 ms | -9.70 ms |
| d2356d0 | 1257.04 ms | 1257.94 ms | 0.89 ms |
| c002f00 | 1252.47 ms | 1258.78 ms | 6.31 ms |
| cf443d2 | 1255.79 ms | 1248.38 ms | -7.40 ms |
| 3f47ea3 | 1263.90 ms | 1263.87 ms | -0.02 ms |
| 1ce780b | 1252.49 ms | 1256.17 ms | 3.68 ms |
| 0929dbf | 1275.89 ms | 1282.22 ms | 6.33 ms |
| 6b69699 | 1254.80 ms | 1273.31 ms | 18.52 ms |
| a10aff4 | 1241.67 ms | 1255.02 ms | 13.35 ms |
| fd88186 | 1255.06 ms | 1252.76 ms | -2.30 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 1fff351 | 5.73 MiB | 6.17 MiB | 455.43 KiB |
| d2356d0 | 5.66 MiB | 6.09 MiB | 448.38 KiB |
| c002f00 | 5.65 MiB | 6.09 MiB | 448.38 KiB |
| cf443d2 | 5.53 MiB | 6.00 MiB | 479.99 KiB |
| 3f47ea3 | 5.53 MiB | 5.96 MiB | 444.81 KiB |
| 1ce780b | 5.66 MiB | 6.10 MiB | 451.58 KiB |
| 0929dbf | 7.86 MiB | 9.54 MiB | 1.69 MiB |
| 6b69699 | 7.86 MiB | 9.44 MiB | 1.58 MiB |
| a10aff4 | 5.53 MiB | 6.00 MiB | 486.71 KiB |
| fd88186 | 5.53 MiB | 6.00 MiB | 479.94 KiB |
Android Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| c97f488 | 502.43 ms | 492.47 ms | -9.97 ms |
| 3801d52 | 397.53 ms | 378.87 ms | -18.66 ms |
| 0929dbf | 462.82 ms | 492.76 ms | 29.94 ms |
| 426fbfd | 368.10 ms | 353.23 ms | -14.87 ms |
| 0e2b9b0 | 368.00 ms | 356.72 ms | -11.28 ms |
| cf443d2 | 464.64 ms | 479.04 ms | 14.40 ms |
| 396cb30 | 405.70 ms | 427.56 ms | 21.86 ms |
| ce5c42b | 401.52 ms | 394.63 ms | -6.90 ms |
| c8596a6 | 474.00 ms | 492.96 ms | 18.96 ms |
| 2d34233 | 470.54 ms | 558.90 ms | 88.36 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| c97f488 | 14.31 MiB | 15.49 MiB | 1.19 MiB |
| 3801d52 | 14.31 MiB | 15.49 MiB | 1.19 MiB |
| 0929dbf | 6.54 MiB | 7.70 MiB | 1.17 MiB |
| 426fbfd | 13.93 MiB | 15.06 MiB | 1.13 MiB |
| 0e2b9b0 | 14.30 MiB | 15.49 MiB | 1.19 MiB |
| cf443d2 | 13.93 MiB | 15.00 MiB | 1.06 MiB |
| 396cb30 | 13.93 MiB | 15.06 MiB | 1.13 MiB |
| ce5c42b | 14.31 MiB | 15.49 MiB | 1.19 MiB |
| c8596a6 | 6.54 MiB | 7.53 MiB | 1015.27 KiB |
| 2d34233 | 6.54 MiB | 7.55 MiB | 1.01 MiB |
Semver Impact of This PR🟢 Patch (bug fixes) 📋 Changelog PreviewThis is how your changes will appear in the changelog. Features
FixesDart
Flutter
Enhancements
DependenciesDeps
Internal ChangesDeps
Other
Other
🤖 This preview updates automatically when you update the PR. |
📜 Description
Moves Android beforeSend tagging and context sync updates from Dart-backed JNI callbacks to Kotlin static methods. This avoids long-lived or short-lived Java→Dart proxy callbacks in the affected scope-sync path while preserving existing event origin/environment tagging and context behavior.
Since we cannot bump JNI, which may have a fix in v 1.0.0, we go with this workaround.
Also called a sample app launch/close in a loop, but could not re-produce the issue reported. So this is a best effort by moving the most likley affected parts of the code.
💡 Motivation and Context
Fixes #3658
Fixes #3601
💚 How did you test it?
Added temp logs to sample app and called the methods in question:
Console/logcat output:
📝 Checklist
sendDefaultPiiis enabled🔮 Next steps
We also have JNI dart side callbacks for replay, but since the original issue is about scope sync, i focused on those first.