Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: getsentry/sentry-java
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 8.4.0
Choose a base ref
...
head repository: getsentry/sentry-java
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 8.5.0
Choose a head ref
  • 15 commits
  • 185 files changed
  • 12 contributors

Commits on Mar 14, 2025

  1. Merge branch 'release/8.4.0'

    getsentry-bot committed Mar 14, 2025

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    e5b840c View commit details
  2. Reduce excessive CPU usage when serializing breadcrumbs to disk (#4181)

    * WIP
    
    * WIP
    
    * Remove redundant line
    
    * Add Tests
    
    * api dump
    
    * Formatting
    
    * REset scope cache on new init
    
    * Clean up
    
    * Comment
    
    * Changelog
    
    * Workaround square/tape#173
    
    * Add a comment to setBreadcrumbs
    
    * Address PR review
    
    * Update CHANGELOG.md
    romtsn authored Mar 14, 2025
    Copy the full SHA
    b61429a View commit details
  3. Bump JamesIves/github-pages-deploy-action from 4.7.2 to 4.7.3 (#4194)

    Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.7.2 to 4.7.3.
    - [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases)
    - [Commits](JamesIves/github-pages-deploy-action@15de0f0...6c2d9db)
    
    ---
    updated-dependencies:
    - dependency-name: JamesIves/github-pages-deploy-action
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    dependabot[bot] authored Mar 14, 2025
    Copy the full SHA
    cd913d1 View commit details
  4. Bump github/codeql-action from 3.28.9 to 3.28.11 (#4242)

    Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.28.9 to 3.28.11.
    - [Release notes](https://github.com/github/codeql-action/releases)
    - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
    - [Commits](github/codeql-action@9e8d078...6bb031a)
    
    ---
    updated-dependencies:
    - dependency-name: github/codeql-action
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    dependabot[bot] authored Mar 14, 2025
    Copy the full SHA
    d364b90 View commit details
  5. Bump actions/create-github-app-token from 1.11.5 to 1.11.6 (#4220)

    Bumps [actions/create-github-app-token](https://github.com/actions/create-github-app-token) from 1.11.5 to 1.11.6.
    - [Release notes](https://github.com/actions/create-github-app-token/releases)
    - [Commits](actions/create-github-app-token@0d56448...21cfef2)
    
    ---
    updated-dependencies:
    - dependency-name: actions/create-github-app-token
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    dependabot[bot] authored Mar 14, 2025
    Copy the full SHA
    4a6043e View commit details
  6. Bump codecov/codecov-action from 5.3.1 to 5.4.0 (#4219)

    Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.3.1 to 5.4.0.
    - [Release notes](https://github.com/codecov/codecov-action/releases)
    - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
    - [Commits](codecov/codecov-action@13ce06b...0565863)
    
    ---
    updated-dependencies:
    - dependency-name: codecov/codecov-action
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    dependabot[bot] authored Mar 14, 2025
    Copy the full SHA
    01e3845 View commit details
  7. Bump gradle/actions (#4243)

    Bumps [gradle/actions](https://github.com/gradle/actions) from aa23778d2dc6f6556fcc7164e99babbd8c3134e4 to 4504a95ca57b383b150e5f64cece035031420365.
    - [Release notes](https://github.com/gradle/actions/releases)
    - [Commits](gradle/actions@aa23778...4504a95)
    
    ---
    updated-dependencies:
    - dependency-name: gradle/actions
      dependency-type: direct:production
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    dependabot[bot] authored Mar 14, 2025
    Copy the full SHA
    11bd630 View commit details
  8. chore(deps): update Gradle to v8.13.0 (#4209)

    * chore: update scripts/update-gradle.sh to v8.13.0
    
    * Do not use identityPath as it doesn't exist anymore
    
    ---------
    
    Co-authored-by: GitHub <noreply@github.com>
    Co-authored-by: Roman Zavarnitsyn <rom4ek93@gmail.com>
    3 people authored Mar 14, 2025
    Copy the full SHA
    1b7c68d View commit details

Commits on Mar 17, 2025

  1. Fix Ensure app start type is set, even when ActivityLifecycleIntegrat…

    …ion is not running (#4250)
    
    * Fix Ensure app start type is set, even when ActivityLifecycleIntegration is not running (#4216)
    
    * Ensure app start type is set, even when ActivityLifecycleIntegration is not activated
    
    * Update Changelog
    
    * Add proper tests
    
    * Add code comments
    
    * Unify handling
    
    * Move all app start handling to AppStartMetrics
    
    * Make tests happy
    
    * Fix flaky RateLimiter test (#4100)
    
    * changed RateLimiterTest `close cancels the timer` to use reflection
    
    * Update sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java
    
    Co-authored-by: Stefano <stefano.siano@sentry.io>
    
    * Address PR feedback
    
    * Fix post-merge conflict
    
    * Format code
    
    * Address PR feedback
    
    * Address PR feedback
    
    * Update sentry-android-core/src/main/java/io/sentry/android/core/performance/AppStartMetrics.java
    
    ---------
    
    Co-authored-by: Stefano <stefano.siano@sentry.io>
    Co-authored-by: Sentry Github Bot <bot+github-bot@sentry.io>
    
    * Fix properly reset application/content-provider timespans
    
    * Update Changelog
    
    * Fix tests
    
    ---------
    
    Co-authored-by: Stefano <stefano.siano@sentry.io>
    Co-authored-by: Sentry Github Bot <bot+github-bot@sentry.io>
    3 people authored Mar 17, 2025
    Copy the full SHA
    0e7364a View commit details
  2. Drop device name (#4179)

    * Drop device name
    
    * Update Changelog
    
    * Update Changelog
    markushi authored Mar 17, 2025
    Copy the full SHA
    70c11a0 View commit details
  3. Enable symbolication of native stack frames in ANR events (#4061)

    * Add native ANR button to sentry-samples-android
    
    Add a button to trigger ANR by holding a lock too long in native
    code. This can be used to test native stack frames in ANR events.
    
    * Improve native stack frame parsing
    
    Handle offsets and deleted files, recognize "???" as a marker for
    unknown functions. Use named capturing groups for better readability
    and editability.
    
    * Add PC value and platform to native stack frames
    
    * Mark JNI method frames as "native"
    
    Use the "native" attribute of stack frames to indicate JNI
    invocation frames, like SentryStackTraceFactory does.
    
    * Add debug images to ANR events
    
    The images are parsed from the build ids and filenames in the thread
    dump's stack frames.
    
    * Add addr_mode attributes to ANR stack frames
    
    The instruction addresses of native stack frames in thread dumps are
    relative to the image file from which the code is loaded, and there
    are no absolute mapping addresses of images available. So explicitly
    inform the Sentry server about the correct images by using a relative
    "addr_mode" attribute.
    
    Also add the attribute to the SentryStackFrame class since it was not
    yet supported by it. The field documentation is converted from
    event.schema.json in the sentry server repo.
    
    * Add ChangeLog entry for ANR native symbolication
    
    * Fix code formatting, make API 21 level compatible, minor improvements
    
    * Add ADDR_MODE entries to sentry.api
    
    * Update sentry-android-core/src/main/java/io/sentry/android/core/internal/threaddump/ThreadDumpParser.java
    
    * Update sentry-android-core/src/main/java/io/sentry/android/core/internal/threaddump/ThreadDumpParser.java
    
    ---------
    
    Co-authored-by: Lauri Alanko <ext-lauri.alanko@supercell.com>
    Co-authored-by: Markus Hintersteiner <markus.hintersteiner@sentry.io>
    Co-authored-by: Roman Zavarnitsyn <rom4ek93@gmail.com>
    4 people authored Mar 17, 2025
    Copy the full SHA
    6be3488 View commit details

Commits on Mar 18, 2025

  1. Use SpringServletTransactionNameProvider as fallback for Spring Web…

    …MVC (#4263)
    
    * Assume http.client for span op if not a root span
    
    * changelog
    
    * Use SpringServletTransactionNameProvider as fallback
    
    * changelog
    
    * review changes
    
    * Format code
    
    ---------
    
    Co-authored-by: Sentry Github Bot <bot+github-bot@sentry.io>
    adinauer and getsentry-bot authored Mar 18, 2025
    Copy the full SHA
    64d302b View commit details
  2. Add Continuous Profiling support (v8) (#3710)

    * added IContinuousProfiler and implementations
    * made AndroidProfiler's executor nullable, as timeout will be handled differently for continuous profiling
    
    Change payload for Continuous Profiling v8 (p2) (#3711)
    * added profile_chunk envelope create
    * added IHub.captureProfileChunk and ISentryClient.captureProfileChunk
    * added profilerId and chunkId reset logic to AndroidContinuousProfiler
    * added absolute timestamps to ProfileMeasurementValue
    * added ProfileContext to Contexts
    * removed timestampMillis from MemoryCollectionData and CpuCollectionData, now it uses timestamp.nanotime() to achieve same result
    * continuous profiler doesn't stop anymore when an error occurs, but continue scheduling restart
    
    Instantiate continuous profiling v8 (p3) (#3725)
    * added profile context to SentryTracer
    * removed isProfilingEnabled from AndroidContinuousProfiler, as it's useless
    * added continuous profiler to SentryOptions
    * added DefaultTransactionPerformanceCollector to AndroidContinuousProfiler
    * updated DefaultTransactionPerformanceCollector to work with string ids other than transactions
    * fixed ProfileChunk measurements being modifiable from other code
    * added thread id and name to SpanContext.data
    * added profiler_id to span data
    * close continuous profiler on scopes close
    * renamed TransactionPerformanceCollector to CompositePerformanceCollector
    * added SpanContext.data ser/deser
    
    Handle App Start Continuous Profiling v8 (p4) (#3730)
    * create app start continuous profiler instead of transaction profiler, based on config
    * updated SentryAppStartProfilingOptions with isContinuousProfilingEnabled flag
    * updated SentryOptions with isContinuousProfilingEnabled() method
    * cut profiler setup out in a specific function to improve readability of AndroidOptionsInitializer
    
    Add new APIs for Continuous Profiling v8 (p5) (#3844)
    * AndroidContinuousProfiler now retrieve the scopes on start()
    * removed profilesSampleRate from sample app to enable continuous profiling
    * added Sentry.startProfiler and Sentry.stopProfiler APIs
    
    Add rate limit for Continuous Profiling v8 (p6) (#3926)
    * continuous profiler now doesn't start if offline or rate limited
    * continuous profiler stops when rate limited
    * continuous profiler prevents sending chunks after being closed
    * added profile_chunk rate limit
    * continuous profiler now reset its id when rate limited or offline
    
    Add continuousProfilesSampleRate (#4013)
    * added SentryOptions.continuousProfilesSampleRate
    * now continuous profiling is disabled if continuousProfilesSampleRate is 0
    * profiles directory is created when continuous profiling is enabled, too
    * continuous profiling decision is passed to SentryAppStartProfilingOptions
    * app start continuous profiling is sampled, too
    
    Wrap up continuous profiling  (#4069)
    * Set continuousProfilesSampleRate and startProfiler() and stopProfiler() as experimental
    * Added chunk start timestamp to ProfileChunk
    * increased continuous profiling chunk duration to 1 minute
    
    Change continuous profiling to session sample rate (#4180)
    * Moved setContinuousProfilesSampleRate into ExperimentalOptions
    * increased chunk duration to 1 minute
    * replaced continuousProfilesSampleRate with profileSessionSampleRate (Default null)
    * sample rate is now evaluated inside AndroidContinuousProfiler and every time a session finishes
    
    Rename continuous profiling APIs (#4182)
    * renamed Sentry.startProfiler with Sentry.startProfileSession and Sentry.stopProfiler with Sentry.stopProfileSession
    
    Add continuous profiling ProfileLifecycle (#4202)
    * Added ProfileLifecycle
    * Sentry.startProfileSession() will work only in MANUAL mode
    * Tracer start will start profiler only in TRACE mode
    * Tracer and spans now attach profilerId only when sampled
    
    Add Continuous Profiling isStartProfilerOnAppStart option (#4226)
    * added isStartProfilerOnAppStart experimental option
    stefanosiano authored Mar 18, 2025
    Copy the full SHA
    84bf981 View commit details
  3. Changed continuous profiling names: (#4265)

    Renamed
    Sentry.startProfileSession -> Sentry.startProfiler
    Sentry.stopProfileSession -> Sentry.stopProfiler
    stefanosiano authored Mar 18, 2025
    Copy the full SHA
    c83e427 View commit details
  4. release: 8.5.0

    getsentry-bot committed Mar 18, 2025
    Copy the full SHA
    9a4f372 View commit details
Showing with 8,049 additions and 914 deletions.
  1. +1 −1 .github/workflows/agp-matrix.yml
  2. +2 −2 .github/workflows/build.yml
  3. +3 −3 .github/workflows/codeql-analysis.yml
  4. +1 −1 .github/workflows/enforce-license-compliance.yml
  5. +2 −2 .github/workflows/generate-javadocs.yml
  6. +2 −2 .github/workflows/integration-tests-benchmarks.yml
  7. +1 −1 .github/workflows/integration-tests-ui-critical.yml
  8. +1 −1 .github/workflows/integration-tests-ui.yml
  9. +1 −1 .github/workflows/release-build.yml
  10. +1 −1 .github/workflows/release.yml
  11. +1 −1 .github/workflows/system-tests-backend.yml
  12. +69 −0 CHANGELOG.md
  13. +1 −0 buildSrc/src/main/java/Config.kt
  14. +1 −1 gradle.properties
  15. BIN gradle/wrapper/gradle-wrapper.jar
  16. +2 −1 gradle/wrapper/gradle-wrapper.properties
  17. +1 −2 gradlew
  18. +17 −3 sentry-android-core/api/sentry-android-core.api
  19. +1 −28 sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java
  20. +373 −0 sentry-android-core/src/main/java/io/sentry/android/core/AndroidContinuousProfiler.java
  21. +2 −1 sentry-android-core/src/main/java/io/sentry/android/core/AndroidCpuCollector.java
  22. +3 −2 sentry-android-core/src/main/java/io/sentry/android/core/AndroidMemoryCollector.java
  23. +74 −21 sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java
  24. +28 −16 sentry-android-core/src/main/java/io/sentry/android/core/AndroidProfiler.java
  25. +1 −0 sentry-android-core/src/main/java/io/sentry/android/core/AndroidTransactionProfiler.java
  26. +27 −23 sentry-android-core/src/main/java/io/sentry/android/core/AnrV2EventProcessor.java
  27. +21 −3 sentry-android-core/src/main/java/io/sentry/android/core/AnrV2Integration.java
  28. +0 −10 sentry-android-core/src/main/java/io/sentry/android/core/ContextUtils.java
  29. +0 −4 sentry-android-core/src/main/java/io/sentry/android/core/DeviceInfoUtil.java
  30. +47 −8 sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java
  31. +1 −1 sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroid.java
  32. +84 −33 sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java
  33. +103 −26 sentry-android-core/src/main/java/io/sentry/android/core/internal/threaddump/ThreadDumpParser.java
  34. +5 −0 sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidThreadChecker.java
  35. +121 −66 sentry-android-core/src/main/java/io/sentry/android/core/performance/AppStartMetrics.java
  36. +10 −178 sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt
  37. +552 −0 sentry-android-core/src/test/java/io/sentry/android/core/AndroidContinuousProfilerTest.kt
  38. +1 −1 sentry-android-core/src/test/java/io/sentry/android/core/AndroidCpuCollectorTest.kt
  39. +1 −1 sentry-android-core/src/test/java/io/sentry/android/core/AndroidMemoryCollectorTest.kt
  40. +117 −6 sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt
  41. +6 −3 sentry-android-core/src/test/java/io/sentry/android/core/AndroidProfilerTest.kt
  42. +3 −3 sentry-android-core/src/test/java/io/sentry/android/core/AndroidTransactionProfilerTest.kt
  43. +14 −2 sentry-android-core/src/test/java/io/sentry/android/core/AnrV2EventProcessorTest.kt
  44. +9 −0 sentry-android-core/src/test/java/io/sentry/android/core/AnrV2IntegrationTest.kt
  45. +0 −26 sentry-android-core/src/test/java/io/sentry/android/core/DeviceInfoUtilTest.kt
  46. +93 −0 sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt
  47. +2 −1 sentry-android-core/src/test/java/io/sentry/android/core/PerformanceAndroidEventProcessorTest.kt
  48. +34 −22 sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidTest.kt
  49. +115 −7 sentry-android-core/src/test/java/io/sentry/android/core/SentryPerformanceProviderTest.kt
  50. +5 −0 sentry-android-core/src/test/java/io/sentry/android/core/SessionTrackingIntegrationTest.kt
  51. +72 −5 sentry-android-core/src/test/java/io/sentry/android/core/internal/threaddump/ThreadDumpParserTest.kt
  52. +20 −0 sentry-android-core/src/test/java/io/sentry/android/core/internal/util/AndroidThreadCheckerTest.kt
  53. +211 −49 sentry-android-core/src/test/java/io/sentry/android/core/performance/AppStartMetricsTest.kt
  54. +5 −3 sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt
  55. +13 −9 sentry-android-replay/src/test/java/io/sentry/android/replay/ReplayIntegrationTest.kt
  56. +2 −0 sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SQLiteSpanManagerTest.kt
  57. +1 −1 sentry-opentelemetry/sentry-opentelemetry-bootstrap/api/sentry-opentelemetry-bootstrap.api
  58. +2 −2 ...lemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelSpanFactory.java
  59. +8 −4 sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml
  60. +25 −0 sentry-samples/sentry-samples-android/src/main/cpp/native-sample.cpp
  61. +25 −0 sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java
  62. +2 −0 sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MyApplication.java
  63. +3 −0 sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/NativeSample.java
  64. +6 −0 sentry-samples/sentry-samples-android/src/main/res/layout/activity_main.xml
  65. +1 −0 sentry-samples/sentry-samples-android/src/main/res/values/strings.xml
  66. +1 −3 sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry/build.gradle.kts
  67. +1 −3 sentry-samples/sentry-samples-spring-boot-opentelemetry/build.gradle.kts
  68. +6 −1 sentry-spring-boot-jakarta/src/main/java/io/sentry/spring/boot/jakarta/SentryAutoConfiguration.java
  69. +6 −1 sentry-spring-boot/src/main/java/io/sentry/spring/boot/SentryAutoConfiguration.java
  70. +14 −0 sentry-spring-jakarta/api/sentry-spring-jakarta.api
  71. +55 −0 ...pring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/CombinedTransactionNameProvider.java
  72. +5 −3 sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentryTracingFilter.java
  73. +8 −0 sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/TransactionNameProvider.java
  74. +27 −0 sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/TransactionNameWithSource.java
  75. +6 −0 sentry-spring-jakarta/src/test/kotlin/io/sentry/spring/jakarta/tracing/SentryTracingFilterTest.kt
  76. +1 −1 ...spring-jakarta/src/test/kotlin/io/sentry/spring/jakarta/webflux/SentryWebFluxTracingFilterTest.kt
  77. +14 −0 sentry-spring/api/sentry-spring.api
  78. +55 −0 sentry-spring/src/main/java/io/sentry/spring/tracing/CombinedTransactionNameProvider.java
  79. +5 −3 sentry-spring/src/main/java/io/sentry/spring/tracing/SentryTracingFilter.java
  80. +8 −0 sentry-spring/src/main/java/io/sentry/spring/tracing/TransactionNameProvider.java
  81. +27 −0 sentry-spring/src/main/java/io/sentry/spring/tracing/TransactionNameWithSource.java
  82. +1 −0 sentry-spring/src/test/kotlin/io/sentry/spring/tracing/SentryTracingFilterTest.kt
  83. +1 −1 sentry-spring/src/test/kotlin/io/sentry/spring/webflux/SentryWebFluxTracingFilterTest.kt
  84. +260 −39 sentry/api/sentry.api
  85. +1 −0 sentry/build.gradle.kts
  86. +10 −1 ...c/main/java/io/sentry/{TransactionPerformanceCollector.java → CompositePerformanceCollector.java}
  87. +6 −5 sentry/src/main/java/io/sentry/CpuCollectionData.java
  88. +1 −0 sentry/src/main/java/io/sentry/DataCategory.java
  89. +28 −8 .../sentry/{DefaultTransactionPerformanceCollector.java → DefaultCompositePerformanceCollector.java}
  90. +2 −2 sentry/src/main/java/io/sentry/DefaultSpanFactory.java
  91. +72 −0 sentry/src/main/java/io/sentry/ExperimentalOptions.java
  92. +16 −0 sentry/src/main/java/io/sentry/HubAdapter.java
  93. +15 −0 sentry/src/main/java/io/sentry/HubScopesWrapper.java
  94. +24 −0 sentry/src/main/java/io/sentry/IContinuousProfiler.java
  95. +14 −0 sentry/src/main/java/io/sentry/IScopes.java
  96. +11 −0 sentry/src/main/java/io/sentry/ISentryClient.java
  97. +1 −1 sentry/src/main/java/io/sentry/ISpanFactory.java
  98. +2 −2 sentry/src/main/java/io/sentry/JavaMemoryCollector.java
  99. +2 −0 sentry/src/main/java/io/sentry/JsonSerializer.java
  100. +2 −29 sentry/src/main/java/io/sentry/MainEventProcessor.java
  101. +8 −7 sentry/src/main/java/io/sentry/MemoryCollectionData.java
  102. +13 −5 ...ava/io/sentry/{NoOpTransactionPerformanceCollector.java → NoOpCompositePerformanceCollector.java}
  103. +39 −0 sentry/src/main/java/io/sentry/NoOpContinuousProfiler.java
  104. +11 −0 sentry/src/main/java/io/sentry/NoOpHub.java
  105. +11 −0 sentry/src/main/java/io/sentry/NoOpScopes.java
  106. +6 −0 sentry/src/main/java/io/sentry/NoOpSentryClient.java
  107. +1 −1 sentry/src/main/java/io/sentry/NoOpSpanFactory.java
  108. +336 −0 sentry/src/main/java/io/sentry/ProfileChunk.java
  109. +120 −0 sentry/src/main/java/io/sentry/ProfileContext.java
  110. +18 −0 sentry/src/main/java/io/sentry/ProfileLifecycle.java
  111. +4 −0 sentry/src/main/java/io/sentry/Scope.java
  112. +103 −14 sentry/src/main/java/io/sentry/Scopes.java
  113. +15 −0 sentry/src/main/java/io/sentry/ScopesAdapter.java
  114. +35 −4 sentry/src/main/java/io/sentry/Sentry.java
  115. +114 −7 sentry/src/main/java/io/sentry/SentryAppStartProfilingOptions.java
  116. +38 −2 sentry/src/main/java/io/sentry/SentryClient.java
  117. +59 −3 sentry/src/main/java/io/sentry/SentryEnvelopeItem.java
  118. +1 −0 sentry/src/main/java/io/sentry/SentryItemType.java
  119. +106 −18 sentry/src/main/java/io/sentry/SentryOptions.java
  120. +31 −19 sentry/src/main/java/io/sentry/SentryTracer.java
  121. +16 −0 sentry/src/main/java/io/sentry/SpanContext.java
  122. +1 −0 sentry/src/main/java/io/sentry/SpanDataConvention.java
  123. +5 −0 sentry/src/main/java/io/sentry/TracesSampler.java
  124. +4 −13 sentry/src/main/java/io/sentry/cache/CacheUtils.java
  125. +136 −12 sentry/src/main/java/io/sentry/cache/PersistingScopeObserver.java
  126. +52 −0 sentry/src/main/java/io/sentry/cache/tape/EmptyObjectQueue.java
  127. +148 −0 sentry/src/main/java/io/sentry/cache/tape/FileObjectQueue.java
  128. +108 −0 sentry/src/main/java/io/sentry/cache/tape/ObjectQueue.java
  129. +817 −0 sentry/src/main/java/io/sentry/cache/tape/QueueFile.java
  130. +3 −0 sentry/src/main/java/io/sentry/clientreport/ClientReportRecorder.java
  131. +40 −3 sentry/src/main/java/io/sentry/profilemeasurements/ProfileMeasurementValue.java
  132. +15 −0 sentry/src/main/java/io/sentry/protocol/Contexts.java
  133. +38 −0 sentry/src/main/java/io/sentry/protocol/DebugMeta.java
  134. +29 −0 sentry/src/main/java/io/sentry/protocol/SentryStackFrame.java
  135. +1 −1 sentry/src/main/java/io/sentry/protocol/SentryTransaction.java
  136. +2 −0 sentry/src/main/java/io/sentry/transport/RateLimiter.java
  137. +4 −0 sentry/src/main/java/io/sentry/util/SampleRateUtils.java
  138. +8 −0 sentry/src/main/java/io/sentry/util/thread/IThreadChecker.java
  139. +5 −0 sentry/src/main/java/io/sentry/util/thread/NoOpThreadChecker.java
  140. +5 −0 sentry/src/main/java/io/sentry/util/thread/ThreadChecker.java
  141. +4 −1 sentry/src/test/java/io/sentry/CheckInSerializationTest.kt
  142. +63 −6 ...try/{DefaultTransactionPerformanceCollectorTest.kt → DefaultCompositePerformanceCollectorTest.kt}
  143. +16 −0 sentry/src/test/java/io/sentry/HubAdapterTest.kt
  144. +1 −1 sentry/src/test/java/io/sentry/JavaMemoryCollectorTest.kt
  145. +267 −25 sentry/src/test/java/io/sentry/JsonSerializerTest.kt
  146. +38 −0 sentry/src/test/java/io/sentry/NoOpContinuousProfilerTest.kt
  147. +10 −0 sentry/src/test/java/io/sentry/NoOpHubTest.kt
  148. +4 −0 sentry/src/test/java/io/sentry/NoOpSentryClientTest.kt
  149. +1 −0 sentry/src/test/java/io/sentry/OutboxSenderTest.kt
  150. +10 −5 sentry/src/test/java/io/sentry/PerformanceCollectionDataTest.kt
  151. +52 −0 sentry/src/test/java/io/sentry/ScopeTest.kt
  152. +16 −0 sentry/src/test/java/io/sentry/ScopesAdapterTest.kt
  153. +188 −2 sentry/src/test/java/io/sentry/ScopesTest.kt
  154. +56 −1 sentry/src/test/java/io/sentry/SentryClientTest.kt
  155. +88 −0 sentry/src/test/java/io/sentry/SentryEnvelopeItemTest.kt
  156. +95 −14 sentry/src/test/java/io/sentry/SentryOptionsTest.kt
  157. +139 −1 sentry/src/test/java/io/sentry/SentryTest.kt
  158. +129 −13 sentry/src/test/java/io/sentry/SentryTracerTest.kt
  159. +9 −1 sentry/src/test/java/io/sentry/SpanContextTest.kt
  160. +27 −0 sentry/src/test/java/io/sentry/TracesSamplerTest.kt
  161. +10 −0 sentry/src/test/java/io/sentry/cache/CacheUtilsTest.kt
  162. +39 −32 sentry/src/test/java/io/sentry/cache/PersistingScopeObserverTest.kt
  163. +43 −0 sentry/src/test/java/io/sentry/cache/tape/CorruptQueueFileTest.kt
  164. +252 −0 sentry/src/test/java/io/sentry/cache/tape/ObjectQueueTest.kt
  165. +730 −0 sentry/src/test/java/io/sentry/cache/tape/QueueFileTest.kt
  166. +6 −0 sentry/src/test/java/io/sentry/protocol/ContextsTest.kt
  167. +72 −0 sentry/src/test/java/io/sentry/protocol/DebugMetaTest.kt
  168. +1 −0 sentry/src/test/java/io/sentry/protocol/SentryStackFrameSerializationTest.kt
  169. +3 −0 sentry/src/test/java/io/sentry/protocol/SpanContextSerializationTest.kt
  170. +22 −1 sentry/src/test/java/io/sentry/transport/RateLimiterTest.kt
  171. +40 −0 sentry/src/test/java/io/sentry/util/SampleRateUtilTest.kt
  172. +8 −0 sentry/src/test/java/io/sentry/util/thread/ThreadCheckerTest.kt
  173. BIN sentry/src/test/resources/corrupt_queue_file.txt
  174. +6 −1 sentry/src/test/resources/json/checkin_crontab.json
  175. +6 −1 sentry/src/test/resources/json/checkin_interval.json
  176. +3 −1 sentry/src/test/resources/json/contexts.json
  177. +3 −1 sentry/src/test/resources/json/sentry_base_event.json
  178. +3 −1 sentry/src/test/resources/json/sentry_base_event_with_null_extra.json
  179. +3 −1 sentry/src/test/resources/json/sentry_event.json
  180. +3 −1 sentry/src/test/resources/json/sentry_replay_event.json
  181. +1 −0 sentry/src/test/resources/json/sentry_stack_frame.json
  182. +3 −1 sentry/src/test/resources/json/sentry_transaction.json
  183. +3 −1 sentry/src/test/resources/json/sentry_transaction_legacy_date_format.json
  184. +3 −1 sentry/src/test/resources/json/sentry_transaction_no_measurement_unit.json
  185. +3 −1 sentry/src/test/resources/json/span_context.json
2 changes: 1 addition & 1 deletion .github/workflows/agp-matrix.yml
Original file line number Diff line number Diff line change
@@ -39,7 +39,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
uses: gradle/actions/setup-gradle@4a417b5b1a01db0b076987546b67f8de18e7d340 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
4 changes: 2 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -37,7 +37,7 @@ jobs:
key: build-logic-${{ hashFiles('buildSrc/src/**', 'buildSrc/build.gradle.kts','buildSrc/settings.gradle.kts') }}

- name: Setup Gradle
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
uses: gradle/actions/setup-gradle@4a417b5b1a01db0b076987546b67f8de18e7d340 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
@@ -46,7 +46,7 @@ jobs:
run: make preMerge

- name: Upload coverage to Codecov
uses: codecov/codecov-action@13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3 # pin@v4
uses: codecov/codecov-action@0565863a31f2c772f9f0395002a31e3f06189574 # pin@v4
with:
name: sentry-java
fail_ci_if_error: false
6 changes: 3 additions & 3 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
@@ -34,13 +34,13 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
uses: gradle/actions/setup-gradle@4a417b5b1a01db0b076987546b67f8de18e7d340 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}

- name: Initialize CodeQL
uses: github/codeql-action/init@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # pin@v2
uses: github/codeql-action/init@6bb031afdd8eb862ea3fc1848194185e076637e5 # pin@v2
with:
languages: 'java'

@@ -49,4 +49,4 @@ jobs:
./gradlew buildForCodeQL
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # pin@v2
uses: github/codeql-action/analyze@6bb031afdd8eb862ea3fc1848194185e076637e5 # pin@v2
2 changes: 1 addition & 1 deletion .github/workflows/enforce-license-compliance.yml
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Gradle
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
uses: gradle/actions/setup-gradle@4a417b5b1a01db0b076987546b67f8de18e7d340 # pin@v3
with:
gradle-home-cache-cleanup: true

4 changes: 2 additions & 2 deletions .github/workflows/generate-javadocs.yml
Original file line number Diff line number Diff line change
@@ -20,15 +20,15 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
uses: gradle/actions/setup-gradle@4a417b5b1a01db0b076987546b67f8de18e7d340 # pin@v3
with:
gradle-home-cache-cleanup: true

- name: Generate Aggregate Javadocs
run: |
./gradlew aggregateJavadocs
- name: Deploy
uses: JamesIves/github-pages-deploy-action@15de0f09300eea763baee31dff6c6184995c5f6a # pin@4.7.2
uses: JamesIves/github-pages-deploy-action@6c2d9db40f9296374acc17b90404b6e8864128c8 # pin@4.7.3
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH: gh-pages
4 changes: 2 additions & 2 deletions .github/workflows/integration-tests-benchmarks.yml
Original file line number Diff line number Diff line change
@@ -38,7 +38,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
uses: gradle/actions/setup-gradle@4a417b5b1a01db0b076987546b67f8de18e7d340 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
@@ -89,7 +89,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
uses: gradle/actions/setup-gradle@4a417b5b1a01db0b076987546b67f8de18e7d340 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
2 changes: 1 addition & 1 deletion .github/workflows/integration-tests-ui-critical.yml
Original file line number Diff line number Diff line change
@@ -36,7 +36,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
uses: gradle/actions/setup-gradle@4a417b5b1a01db0b076987546b67f8de18e7d340 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
2 changes: 1 addition & 1 deletion .github/workflows/integration-tests-ui.yml
Original file line number Diff line number Diff line change
@@ -33,7 +33,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
uses: gradle/actions/setup-gradle@4a417b5b1a01db0b076987546b67f8de18e7d340 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
2 changes: 1 addition & 1 deletion .github/workflows/release-build.yml
Original file line number Diff line number Diff line change
@@ -26,7 +26,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
uses: gradle/actions/setup-gradle@4a417b5b1a01db0b076987546b67f8de18e7d340 # pin@v3
with:
gradle-home-cache-cleanup: true

2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -19,7 +19,7 @@ jobs:
steps:
- name: Get auth token
id: token
uses: actions/create-github-app-token@0d564482f06ca65fa9e77e2510873638c82206f2 # v1.11.5
uses: actions/create-github-app-token@21cfef2b496dd8ef5b904c159339626a10ad380e # v1.11.6
with:
app-id: ${{ vars.SENTRY_RELEASE_BOT_CLIENT_ID }}
private-key: ${{ secrets.SENTRY_RELEASE_BOT_PRIVATE_KEY }}
2 changes: 1 addition & 1 deletion .github/workflows/system-tests-backend.yml
Original file line number Diff line number Diff line change
@@ -57,7 +57,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
uses: gradle/actions/setup-gradle@4a417b5b1a01db0b076987546b67f8de18e7d340 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
69 changes: 69 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,74 @@
# Changelog

## 8.5.0

### Features

- Add native stack frame address information and debug image metadata to ANR events ([#4061](https://github.com/getsentry/sentry-java/pull/4061))
- This enables symbolication for stripped native code in ANRs
- Add Continuous Profiling Support ([#3710](https://github.com/getsentry/sentry-java/pull/3710))

To enable Continuous Profiling use the `Sentry.startProfiler` and `Sentry.stopProfiler` experimental APIs. Sampling rate can be set through `options.profileSessionSampleRate`, which defaults to null (disabled).
Note: Both `options.profilesSampler` and `options.profilesSampleRate` must **not** be set to enable Continuous Profiling.

```java
import io.sentry.ProfileLifecycle;
import io.sentry.android.core.SentryAndroid;

SentryAndroid.init(context) { options ->

// Currently under experimental options:
options.getExperimental().setProfileSessionSampleRate(1.0);
// In manual mode, you need to start and stop the profiler manually using Sentry.startProfiler and Sentry.stopProfiler
// In trace mode, the profiler will start and stop automatically whenever a sampled trace starts and finishes
options.getExperimental().setProfileLifecycle(ProfileLifecycle.MANUAL);
}
// Start profiling
Sentry.startProfiler();

// After all profiling is done, stop the profiler. Profiles can last indefinitely if not stopped.
Sentry.stopProfiler();
```
```kotlin
import io.sentry.ProfileLifecycle
import io.sentry.android.core.SentryAndroid

SentryAndroid.init(context) { options ->

// Currently under experimental options:
options.experimental.profileSessionSampleRate = 1.0
// In manual mode, you need to start and stop the profiler manually using Sentry.startProfiler and Sentry.stopProfiler
// In trace mode, the profiler will start and stop automatically whenever a sampled trace starts and finishes
options.experimental.profileLifecycle = ProfileLifecycle.MANUAL
}
// Start profiling
Sentry.startProfiler()

// After all profiling is done, stop the profiler. Profiles can last indefinitely if not stopped.
Sentry.stopProfiler()
```

To learn more visit [Sentry's Continuous Profiling](https://docs.sentry.io/product/explore/profiling/transaction-vs-continuous-profiling/#continuous-profiling-mode) documentation page.

### Fixes

- Reduce excessive CPU usage when serializing breadcrumbs to disk for ANRs ([#4181](https://github.com/getsentry/sentry-java/pull/4181))
- Ensure app start type is set, even when ActivityLifecycleIntegration is not running ([#4250](https://github.com/getsentry/sentry-java/pull/4250))
- Use `SpringServletTransactionNameProvider` as fallback for Spring WebMVC ([#4263](https://github.com/getsentry/sentry-java/pull/4263))
- In certain cases the SDK was not able to provide a transaction name automatically and thus did not finish the transaction for the request.
- We now first try `SpringMvcTransactionNameProvider` which would provide the route as transaction name.
- If that does not return anything, we try `SpringServletTransactionNameProvider` next, which returns the URL of the request.

### Behavioral Changes

- The user's `device.name` is not reported anymore via the device context, even if `options.isSendDefaultPii` is enabled ([#4179](https://github.com/getsentry/sentry-java/pull/4179))

### Dependencies

- Bump Gradle from v8.12.1 to v8.13.0 ([#4209](https://github.com/getsentry/sentry-java/pull/4209))
- [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v8130)
- [diff](https://github.com/gradle/gradle/compare/v8.12.1...v8.13.0)

## 8.4.0

### Fixes
1 change: 1 addition & 0 deletions buildSrc/src/main/java/Config.kt
Original file line number Diff line number Diff line change
@@ -213,6 +213,7 @@ object Config {
val msgpack = "org.msgpack:msgpack-core:0.9.8"
val leakCanaryInstrumentation = "com.squareup.leakcanary:leakcanary-android-instrumentation:2.14"
val composeUiTestJunit4 = "androidx.compose.ui:ui-test-junit4:1.6.8"
val okio = "com.squareup.okio:okio:1.13.0"
}

object QualityPlugins {
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -14,7 +14,7 @@ org.gradle.workers.max=2
android.useAndroidX=true

# Release information
versionName=8.4.0
versionName=8.5.0

# Override the SDK name on native crashes on Android
sentryAndroidSdkName=sentry.native.android
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
3 changes: 2 additions & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#Mon Mar 17 13:40:54 CET 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
3 changes: 1 addition & 2 deletions gradlew
Original file line number Diff line number Diff line change
@@ -86,8 +86,7 @@ done
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
20 changes: 17 additions & 3 deletions sentry-android-core/api/sentry-android-core.api
Original file line number Diff line number Diff line change
@@ -40,6 +40,18 @@ public final class io/sentry/android/core/ActivityLifecycleIntegration : android
public fun register (Lio/sentry/IScopes;Lio/sentry/SentryOptions;)V
}

public class io/sentry/android/core/AndroidContinuousProfiler : io/sentry/IContinuousProfiler, io/sentry/transport/RateLimiter$IRateLimitObserver {
public fun <init> (Lio/sentry/android/core/BuildInfoProvider;Lio/sentry/android/core/internal/util/SentryFrameMetricsCollector;Lio/sentry/ILogger;Ljava/lang/String;ILio/sentry/ISentryExecutorService;)V
public fun close ()V
public fun getProfilerId ()Lio/sentry/protocol/SentryId;
public fun getRootSpanCounter ()I
public fun isRunning ()Z
public fun onRateLimitChanged (Lio/sentry/transport/RateLimiter;)V
public fun reevaluateSampling ()V
public fun startProfiler (Lio/sentry/ProfileLifecycle;Lio/sentry/TracesSampler;)V
public fun stopProfiler (Lio/sentry/ProfileLifecycle;)V
}

public final class io/sentry/android/core/AndroidCpuCollector : io/sentry/IPerformanceSnapshotCollector {
public fun <init> (Lio/sentry/ILogger;)V
public fun collect (Lio/sentry/PerformanceCollectionData;)V
@@ -460,6 +472,7 @@ public class io/sentry/android/core/performance/AppStartMetrics : io/sentry/andr
public fun clear ()V
public fun createProcessInitSpan ()Lio/sentry/android/core/performance/TimeSpan;
public fun getActivityLifecycleTimeSpans ()Ljava/util/List;
public fun getAppStartContinuousProfiler ()Lio/sentry/IContinuousProfiler;
public fun getAppStartProfiler ()Lio/sentry/ITransactionProfiler;
public fun getAppStartSamplingDecision ()Lio/sentry/TracesSamplingDecision;
public fun getAppStartTimeSpan ()Lio/sentry/android/core/performance/TimeSpan;
@@ -471,16 +484,17 @@ public class io/sentry/android/core/performance/AppStartMetrics : io/sentry/andr
public static fun getInstance ()Lio/sentry/android/core/performance/AppStartMetrics;
public fun getSdkInitTimeSpan ()Lio/sentry/android/core/performance/TimeSpan;
public fun isAppLaunchedInForeground ()Z
public fun isColdStartValid ()Z
public fun onActivityCreated (Landroid/app/Activity;Landroid/os/Bundle;)V
public fun onActivityDestroyed (Landroid/app/Activity;)V
public fun onActivityStarted (Landroid/app/Activity;)V
public fun onAppStartSpansSent ()V
public static fun onApplicationCreate (Landroid/app/Application;)V
public static fun onApplicationPostCreate (Landroid/app/Application;)V
public static fun onContentProviderCreate (Landroid/content/ContentProvider;)V
public static fun onContentProviderPostCreate (Landroid/content/ContentProvider;)V
public fun registerApplicationForegroundCheck (Landroid/app/Application;)V
public fun restartAppStart (J)V
public fun registerLifecycleCallbacks (Landroid/app/Application;)V
public fun setAppLaunchedInForeground (Z)V
public fun setAppStartContinuousProfiler (Lio/sentry/IContinuousProfiler;)V
public fun setAppStartProfiler (Lio/sentry/ITransactionProfiler;)V
public fun setAppStartSamplingDecision (Lio/sentry/TracesSamplingDecision;)V
public fun setAppStartType (Lio/sentry/android/core/performance/AppStartMetrics$AppStartType;)V
Original file line number Diff line number Diff line change
@@ -9,7 +9,6 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.SystemClock;
import io.sentry.FullyDisplayedReporter;
import io.sentry.IScope;
import io.sentry.IScopes;
@@ -83,7 +82,6 @@ public final class ActivityLifecycleIntegration
private final @NotNull WeakHashMap<Activity, ActivityLifecycleSpanHelper> activitySpanHelpers =
new WeakHashMap<>();
private @NotNull SentryDate lastPausedTime = new SentryNanotimeDate(new Date(0), 0);
private long lastPausedUptimeMillis = 0;
private @Nullable Future<?> ttfdAutoCloseFuture = null;

// WeakHashMap isn't thread safe but ActivityLifecycleCallbacks is only called from the
@@ -400,7 +398,6 @@ public void onActivityPreCreated(
scopes != null
? scopes.getOptions().getDateProvider().now()
: AndroidDateUtils.getCurrentSentryDateTime();
lastPausedUptimeMillis = SystemClock.uptimeMillis();
helper.setOnCreateStartTimestamp(lastPausedTime);
}

@@ -411,7 +408,6 @@ public void onActivityCreated(
onActivityPreCreated(activity, savedInstanceState);
}
try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) {
setColdStart(savedInstanceState);
if (scopes != null && options != null && options.isEnableScreenTracking()) {
final @Nullable String activityClassName = ClassUtil.getClassName(activity);
scopes.configureScope(scope -> scope.setScreen(activityClassName));
@@ -516,7 +512,6 @@ public void onActivityPrePaused(@NotNull Activity activity) {
scopes != null
? scopes.getOptions().getDateProvider().now()
: AndroidDateUtils.getCurrentSentryDateTime();
lastPausedUptimeMillis = SystemClock.uptimeMillis();
}

@Override
@@ -577,7 +572,7 @@ public void onActivityDestroyed(final @NotNull Activity activity) {
// if the activity is opened again and not in memory, transactions will be created normally.
activitiesWithOngoingTransactions.remove(activity);

if (activitiesWithOngoingTransactions.isEmpty()) {
if (activitiesWithOngoingTransactions.isEmpty() && !activity.isChangingConfigurations()) {
clear();
}
}
@@ -586,7 +581,6 @@ public void onActivityDestroyed(final @NotNull Activity activity) {
private void clear() {
firstActivityCreated = false;
lastPausedTime = new SentryNanotimeDate(new Date(0), 0);
lastPausedUptimeMillis = 0;
activitySpanHelpers.clear();
}

@@ -728,27 +722,6 @@ WeakHashMap<Activity, ISpan> getTtfdSpanMap() {
return ttfdSpanMap;
}

private void setColdStart(final @Nullable Bundle savedInstanceState) {
if (!firstActivityCreated) {
final @NotNull TimeSpan appStartSpan = AppStartMetrics.getInstance().getAppStartTimeSpan();
// If the app start span already started and stopped, it means the app restarted without
// killing the process, so we are in a warm start
// If the app has an invalid cold start, it means it was started in the background, like
// via BroadcastReceiver, so we consider it a warm start
if ((appStartSpan.hasStarted() && appStartSpan.hasStopped())
|| (!AppStartMetrics.getInstance().isColdStartValid())) {
AppStartMetrics.getInstance().restartAppStart(lastPausedUptimeMillis);
AppStartMetrics.getInstance().setAppStartType(AppStartMetrics.AppStartType.WARM);
} else {
AppStartMetrics.getInstance()
.setAppStartType(
savedInstanceState == null
? AppStartMetrics.AppStartType.COLD
: AppStartMetrics.AppStartType.WARM);
}
}
}

private @NotNull String getTtidDesc(final @NotNull String activityName) {
return activityName + " initial display";
}
Loading