Skip to content

dex_desugar_aspect fails to traverse proto runtime deps under --incompatible_enable_proto_toolchain_resolution #497

@willxiao-amzn

Description

@willxiao-amzn

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:liteliblite.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

  1. Create a proto_library + java_lite_proto_library target
  2. Depend on it (transitively or directly) from an android_binary
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions