Skip to content

build: Align SDK modules to one version through sentry-bom - #6466

Merged
romtsn merged 2 commits into
mainfrom
build/align-modules-via-bom
Nov 6, 2026
Merged

romtsn merged 2 commits into
mainfrom
build/align-modules-via-bom

Conversation

@romtsn

@romtsn romtsn commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

📜 Description

Every published SDK module now depends on sentry-bom as a platform. In Gradle builds, this makes all Sentry modules of a consumer resolve to one version: the highest one present. Today, Gradle resolves each module on its own, so a build can mix versions.

For example, a new sentry-android-core with an sentry-android-fragment that the Gradle plugin or another library pulled in:

before:  io.sentry:sentry-android-fragment:8.50.0
after:   io.sentry:sentry-android-fragment:8.50.0 -> 8.99.0

How it is wired:

  • The publish conventions add the platform. io.sentry.publish adds it for java-library and Android library modules, and io.sentry.publish.multiplatform adds it to commonMainApi.
  • The two BOMs are java-platform projects, so they never depend on themselves.
  • The dependency is declared by path, without access to the BOM project's model, so it stays compatible with Isolated Projects.
  • sentry-bom now also constrains sentry-android-distribution, which is released with the SDK. Before, it was left out.

The published metadata changes like this:

  • .module: a sentry-bom dependency with org.gradle.category: platform.
  • .pom: a sentry-bom import in <dependencyManagement>. Maven does not apply a dependency's <dependencyManagement> to the consumer, so Maven builds resolve as before. Maven users keep importing the BOM themselves.

The BOM only contains constraints, so the module → BOM → module edge is not a resolution cycle. Jackson and kotlinx publish their modules the same way.

💡 Motivation and Context

Mixed module versions keep causing runtime crashes: NoSuchMethodError, ClassNotFoundException, or the "mix of versions" check from #4277. These come from the Gradle plugin's auto-installation, from hybrid SDKs, or from third-party libraries that pull in a different sentry-android. Examples:

The new sentry-android-ndk-outproc module (#6347) makes this worse. It calls internal sentry-android-core APIs, and it registers its package only after the mixed versions check has run, so a mismatch would show up while a native crash is being processed.

Alignment only starts once a build contains at least one module from a release with this change. Builds with only older artifacts behave as before.

Closes #5105
Closes getsentry/sentry-kotlin-multiplatform#450
Closes getsentry/sentry-kotlin-multiplatform#506
Closes getsentry/sentry-android-gradle-plugin#833
Closes getsentry/sentry-android-gradle-plugin#329

💚 How did you test it?

  • In the build: dependency resolution works for JVM, Android (including unit-test classpaths), KMP and sentry-android-distribution. sentry-opentelemetry-bom gets no platform dependency. spotlessApply updateKotlinAbi produces no .api changes.
  • Published metadata: I published all modules to a local repo as 8.99.0-align and checked the .module and .pom of a JVM module, an Android module, sentry-android-distribution, the KMP Android variant, the shaded OpenTelemetry agent (correctly no platform dependency) and both BOMs. sentry-bom has 58 constraints and no dependency on itself.
  • Gradle consumers, mixing the local 8.99.0-align with released 8.50.0 artifacts:
    • new sentry with old sentry-logback: sentry-logback moves to 8.99.0-align;
    • new sentry-logback with old sentry and old sentry-okhttp: both move up;
    • Android app with new sentry-android-core and old sentry-android-fragment (AGP 9.4): the fragment module moves up;
    • only released artifacts: unchanged.
  • Maven consumer (Maven 3.9.9): dependency:tree passes with no warnings, the BOM import resolves, and versions follow Maven's usual "nearest wins" rule, as before.

📝 Checklist

  • I added GH Issue ID & Linear ID
  • I added tests to verify the changes.
  • No new PII added or SDK only sends newly added PII if sendDefaultPII is enabled.
  • I updated the docs if needed.
  • I updated the wizard if needed.
  • Review from the native team if needed.
  • No breaking change or entry added to the changelog.
  • No breaking change for hybrid SDKs or communicated to hybrid SDKs.
  • Public API changes reviewed by another Mobile SDK team member or implemented according to the develop docs spec.

🔮 Next steps

  • Tell the hybrid SDK teams (React Native, Flutter, Unity, KMP). If an app pulls in a newer Sentry module than the version a hybrid SDK pins, the hybrid SDK's sentry-android now moves up with it, instead of staying behind and failing the mixed versions check. Apps that use local AAR files (Unity, Unreal) are not affected.
  • KMP: release a new sentry-kotlin-multiplatform version once it bumps to the sentry-java release with this change, so KMP users get the alignment.
  • Docs: the mixed-versions troubleshooting page can mention that Gradle builds now align on their own.

🤖 Generated with Claude Code

@sentry

sentry Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

📲 Install Builds

Android

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

⚙️ sentry-android Build Distribution Settings

@romtsn
romtsn force-pushed the build/align-modules-via-bom branch from eda7a13 to 7847a46 Compare November 5, 2026 11:29
@romtsn
romtsn changed the base branch from main to refactor/apply-plugins-per-module November 5, 2026 11:29
@romtsn
romtsn marked this pull request as ready for review November 5, 2026 12:43
@romtsn
romtsn requested review from a team and adinauer as code owners November 5, 2026 12:43
@romtsn
romtsn requested review from markushi and runningcode and removed request for a team November 5, 2026 12:43

@runningcode runningcode left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

YESSS

Base automatically changed from refactor/apply-plugins-per-module to main November 6, 2026 08:33
romtsn and others added 2 commits November 6, 2026 12:31
Gradle resolves version conflicts per module, so a build could mix SDK modules
of different versions, for example a newer sentry-android-core with an older
sentry-android-fragment that the Gradle plugin or another library pulled in.
That fails at runtime with NoSuchMethodError or the mixed versions check.

The publish conventions now add sentry-bom as a platform to every published
library module. Gradle then moves all SDK modules of a consumer to the highest
version present. Maven does not apply the dependencyManagement of a
dependency's POM, so Maven builds resolve as before. The BOM now also
constrains sentry-android-distribution, which is released with the SDK.

Refs #5105

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@romtsn
romtsn force-pushed the build/align-modules-via-bom branch from 7847a46 to 52cb967 Compare November 6, 2026 11:34
@romtsn
romtsn enabled auto-merge (squash) November 6, 2026 11:36
@romtsn
romtsn merged commit 2ac3550 into main Nov 6, 2026
44 checks passed
@romtsn
romtsn deleted the build/align-modules-via-bom branch November 6, 2026 11:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants