fix(android-fragment): support detach/attach navigation in fragment tracing#5660
Open
romtsn wants to merge 7 commits into
Open
fix(android-fragment): support detach/attach navigation in fragment tracing#5660romtsn wants to merge 7 commits into
romtsn wants to merge 7 commits into
Conversation
…racing For detach/attach tab navigation (manual tab switching, ViewPager v1 with FragmentPagerAdapter, custom navigation frameworks), onFragmentCreated is skipped for off-screen fragments that are re-attached. Previously this left ui.load spans open until the 30s activity transaction deadline, producing inflated performance data. Fix by calling startTracing in onFragmentViewCreated as well as onFragmentCreated. startTracing is idempotent (no-op if a span is already running), so the normal onFragmentCreated -> onFragmentViewCreated path is unaffected. Add matching stopTracing calls in onFragmentResumed (covers the detach/attach path where onFragmentStarted may be skipped) and onFragmentViewDestroyed (failsafe for fragments destroyed before reaching STARTED or RESUMED). stopTracing is also idempotent, so the normal path is unaffected. Co-Authored-By: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com>
📲 Install BuildsAndroid
|
Contributor
Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 1edbdfa | 364.77 ms | 450.29 ms | 85.52 ms |
| a416a65 | 333.78 ms | 410.37 ms | 76.59 ms |
| d15471f | 302.62 ms | 353.84 ms | 51.22 ms |
| 22f4345 | 314.79 ms | 375.02 ms | 60.23 ms |
| 6b019b7 | 343.31 ms | 417.23 ms | 73.91 ms |
| 22f4345 | 312.78 ms | 347.40 ms | 34.62 ms |
| d217708 | 411.22 ms | 430.86 ms | 19.63 ms |
| 319f256 | 315.96 ms | 372.96 ms | 57.00 ms |
| e2dce0b | 308.96 ms | 360.10 ms | 51.14 ms |
| 8558cac | 306.16 ms | 355.24 ms | 49.09 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 1edbdfa | 1.58 MiB | 2.20 MiB | 635.34 KiB |
| a416a65 | 1.58 MiB | 2.12 MiB | 555.26 KiB |
| d15471f | 1.58 MiB | 2.13 MiB | 559.54 KiB |
| 22f4345 | 1.58 MiB | 2.29 MiB | 719.83 KiB |
| 6b019b7 | 0 B | 0 B | 0 B |
| 22f4345 | 1.58 MiB | 2.29 MiB | 719.83 KiB |
| d217708 | 1.58 MiB | 2.10 MiB | 532.97 KiB |
| 319f256 | 1.58 MiB | 2.19 MiB | 619.79 KiB |
| e2dce0b | 0 B | 0 B | 0 B |
| 8558cac | 0 B | 0 B | 0 B |
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ment onFragmentCreated is skipped during detach/attach navigation, so the screen name was never updated for re-attached fragments. Mirror the screen tracking into onFragmentViewCreated to cover that path. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes a silent data quality issue where detach/attach tab navigation (and similar patterns) left
ui.loadspans open until the 30-second activity transaction deadline, producing badly inflated performance data.Root cause
SentryFragmentLifecycleCallbacksstarted spans inonFragmentCreatedand stopped them inonFragmentStarted(a concession to ViewPager2 which locks background fragments to STARTED). For detach/attach navigation — manual tab switching (transaction.detach(current).attach(next).commit()), ViewPager v1 withFragmentPagerAdapter, and custom navigation frameworks that preserve fragment state —onFragmentCreatedis never called for off-screen fragments. Spans would hang silently until the deadline.Fix
Three targeted changes, all leveraging the fact that
startTracing/stopTracingare already idempotent:onFragmentViewCreatedstartTracingviewCreated → resumedspan for detach/attach paths. No-op ifonFragmentCreatedalready started a span.onFragmentResumedstopTracingonFragmentStartedmay not fire. No-op for the normal path whereonFragmentStartedalready closed the span.onFragmentViewDestroyedstopTracingThe normal lifecycle path (
onFragmentCreated → onFragmentViewCreated → onFragmentStarted → onFragmentResumed) is completely unaffected — still produces exactly oneui.loadspan, closed atonFragmentStarted.What's new for customers
Apps using detach/attach navigation will now see correct, narrower
ui.loadspans (viewCreated → resumed) instead of timeout-inflated spans.Tests
Five new unit tests covering:
onFragmentViewCreatedstarts a span when tracing enabledonFragmentViewCreatedis a no-op when span already runningonFragmentResumedstops the spanonFragmentResumeddoes not double-finish afteronFragmentStartedonFragmentViewDestroyedstops a span that never reached STARTED/RESUMEDExample trace: https://sentry-sdks.sentry.io/explore/traces/trace/edb7de2bba454d70a4c13eee5bce660c/
As you can see TabFragmentB now correctly shows up after re-attaching (but wouldn't have without this fix):

Not verified
./gradlew spotlessApply apiDumpcould not run (no JDK in sandbox) — CI will apply formatting and regenerate.apifiles if needed.