bazelbuild / bazelbuild/rules_android

Protobuf gencode/runtime version mismatch in ResourceProcessorBusyBox when protobuf module resolves to any version > 33.4

Open
#498 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
203
Forks
95
PR merge metrics
No merged PRs in 30d

Description

### Problem

When the Bazel module graph resolves `protobuf` to any version newer than `33.4` (e.g., `34.0`, `35.0`, etc.) via MVS, the `ResourceProcessorBusyBox` tool fails at runtime with a `ProtobufRuntimeVersionException`:

```
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.google.devtools.build.android.DataResourceXml$1.(DataResourceXml.java:199)
...
Caused by: com.google.protobuf.RuntimeVersion$ProtobufRuntimeVersionException:
Detected incompatible Protobuf Gencode/Runtime versions when loading XmlType:
gencode 4.34.0, runtime 4.33.4. Runtime version cannot be older than the linked gencode version.
at com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersionImpl(RuntimeVersion.java:153)
at com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(RuntimeVersion.java:72)
at com.google.devtools.build.android.proto.SerializeFormat$DataValueXml$XmlType.(SerializeFormat.java:4134)
```

### Root Cause

`rules_android` declares `bazel_dep(name = "protobuf", version = "33.4")` in its `MODULE.bazel`, and hardcodes `com.google.protobuf:protobuf-java:4.33.4` in both its `rules_android_maven` and `android_ide_common_30_1_3` Maven installs.

However, the `serialize_format_java_pb` target in `//src/tools/java/com/google/devtools/build/android/proto` is compiled using `@com_google_protobuf//bazel:java_proto_library.bzl`, which uses whatever version of protobuf the module graph ultimately resolves to via MVS. Since `rules_android` does not control the final resolved version, **any other module in the graph that requires protobuf > 33.4 will trigger this failure.**

This creates a mismatch:
- **Proto compiler (gencode):** Uses the MVS-resolved protobuf version (e.g., `34.0`, `35.0`, etc.) → generates Java code stamped with that version
- **Runtime jar:** `@rules_android_maven//:com_google_protobuf_protobuf_java` is pinned to `4.33.4`

Since protobuf enforces `runtime >= gencode`, the tool crashes whenever the resolved protobuf module is newer than 33.4.

### Affected Targets

Any `aar_import` or Android resource merging action that invokes `ResourceProcessorBusyBox`.

### Reproduction

This will occur whenever any module in the dependency graph transitively requires `protobuf > 33.4`. This is increasingly common as many BCR modules have already updated their protobuf dependency. Examples of modules that pull in `protobuf@34.0`:
- `rules_swift@3.5.0`

### Suggested Fix

Bump the `bazel_dep` for protobuf and the corresponding `protobuf-java` / `protobuf-java-util` Maven pins in `rules_android`'s `MODULE.bazel` to a current version (e.g., `34.0` / `4.34.0`).

### Workaround

Users can work around this by using `single_version_override` on `protobuf`, but this has chances of breaking other libraries that depend on the newer version.

### Environment

- Bazel 9.1.0
- `rules_android` 0.7.2
- `protobuf` resolved to `34.0.bcr.1` via MVS (any version > 33.4 triggers the issue)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.