Problem
Any android_binary with a transitive dependency on java_lite_proto_library fails at analysis time when --incompatible_enable_proto_toolchain_resolution is enabled (the Bazel 9 default):
Error in fail: Dependencies on .jar artifacts are not allowed in Android binaries,
please use a java_import to depend on ../protobuf+/java/core/liblite.jar.
If this is an implicit dependency then the rule that introduces it will need to be fixed to account for it correctly.
Root Cause
dex_desugar_aspect traverses dependencies via the attributes listed in _ATTR_ASPECTS (rules/dex_desugar_aspect.bzl). This list includes _aspect_proto_toolchain_for_javalite and _proto_toolchain_for_javalite, which are the legacy (pre-toolchain-resolution) attributes that java_lite_proto_library used to wire in the proto runtime.
With --incompatible_enable_proto_toolchain_resolution, proto runtime dependencies are resolved via Bazel's toolchain mechanism (@protobuf//bazel/private:javalite_toolchain_type) instead of those explicit rule attributes. The runtime jar (@protobuf//java/core:lite → liblite.jar) is still added to JavaInfo.transitive_runtime_jars by java_lite_proto_library, so it appears on the classpath. But because the dex_desugar_aspect never traversed it, the jar is absent from dex_archives_dict.
In _to_dexed_classpath (rules/dex.bzl), any classpath jar missing from both dex_archives_dict and runtime_jars_dict triggers a fail().
How to Reproduce
- Create a
proto_library + java_lite_proto_library target
- Depend on it (transitively or directly) from an
android_binary
- Build with
--incompatible_enable_proto_toolchain_resolution (Bazel 9 default)
bazel build --incompatible_enable_proto_toolchain_resolution //my:android_app
Environment
- Bazel 9.1.0
- protobuf 33.4
- rules_android 0.7.2
Expected Behavior
The dex_desugar_aspect should handle proto runtime jars resolved via toolchain resolution the same way it handles those discovered through legacy rule attributes.
Workaround
Setting --noincompatible_enable_proto_toolchain_resolution restores the legacy behavior, but this flag is deprecated in Bazel 9.
Problem
Any
android_binarywith a transitive dependency onjava_lite_proto_libraryfails at analysis time when--incompatible_enable_proto_toolchain_resolutionis enabled (the Bazel 9 default):Root Cause
dex_desugar_aspecttraverses dependencies via the attributes listed in_ATTR_ASPECTS(rules/dex_desugar_aspect.bzl). This list includes_aspect_proto_toolchain_for_javaliteand_proto_toolchain_for_javalite, which are the legacy (pre-toolchain-resolution) attributes thatjava_lite_proto_libraryused to wire in the proto runtime.With
--incompatible_enable_proto_toolchain_resolution, proto runtime dependencies are resolved via Bazel's toolchain mechanism (@protobuf//bazel/private:javalite_toolchain_type) instead of those explicit rule attributes. The runtime jar (@protobuf//java/core:lite→liblite.jar) is still added toJavaInfo.transitive_runtime_jarsbyjava_lite_proto_library, so it appears on the classpath. But because thedex_desugar_aspectnever traversed it, the jar is absent fromdex_archives_dict.In
_to_dexed_classpath(rules/dex.bzl), any classpath jar missing from bothdex_archives_dictandruntime_jars_dicttriggers afail().How to Reproduce
proto_library+java_lite_proto_librarytargetandroid_binary--incompatible_enable_proto_toolchain_resolution(Bazel 9 default)Environment
Expected Behavior
The
dex_desugar_aspectshould handle proto runtime jars resolved via toolchain resolution the same way it handles those discovered through legacy rule attributes.Workaround
Setting
--noincompatible_enable_proto_toolchain_resolutionrestores the legacy behavior, but this flag is deprecated in Bazel 9.