Add resources class jar to compile time classpath for direct dependencies of aar_import targets
Fixes https://github.com/bazelbuild/bazel/issues/8109
RELNOTES: Added support for compiling against fully qualified R classes from aar_import dependencies.
PiperOrigin-RevId: 244946625
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
index 58e9011..77aff83 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
@@ -158,6 +158,10 @@
new JavaCompilationArtifacts.Builder()
.addRuntimeJar(mergedJar)
.addCompileTimeJarAsFullJar(mergedJar)
+ // Allow direct dependents to compile against un-merged R classes
+ .addCompileTimeJarAsFullJar(
+ ruleContext.getImplicitOutputArtifact(
+ AndroidRuleClasses.ANDROID_RESOURCES_CLASS_JAR))
.setCompileTimeDependencies(jdepsArtifact)
.build());
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
index bc71088..e37d41c 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
@@ -32,6 +32,7 @@
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
+import com.google.devtools.build.lib.rules.java.JavaCompilationInfoProvider;
import com.google.devtools.build.lib.rules.java.JavaConfiguration.ImportDepsCheckingLevel;
import com.google.devtools.build.lib.rules.java.JavaInfo;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
@@ -253,9 +254,9 @@
ensureArgumentsHaveClassEntryOptionWithSuffix(
arguments, "/intermediate/classes_and_libs_merged.jar");
assertThat(arguments.stream().filter(arg -> "--classpath_entry".equals(arg)).count())
- .isEqualTo(5); // transitive classpath
+ .isEqualTo(9); // transitive classpath
assertThat(arguments.stream().filter(arg -> "--directdep".equals(arg)).count())
- .isEqualTo(1); // 1 declared dep
+ .isEqualTo(2); // 1 declared dep
}
@Test
@@ -530,4 +531,17 @@
Label.parseAbsolute("//a:foo", ImmutableMap.of()),
Label.parseAbsolute("//java:baz", ImmutableMap.of()));
}
+
+ @Test
+ public void testRClassFromAarImportInCompileClasspath() throws Exception {
+ NestedSet<Artifact> compilationClasspath =
+ JavaInfo.getProvider(JavaCompilationInfoProvider.class, getConfiguredTarget("//a:library"))
+ .getCompilationClasspath();
+
+ assertThat(
+ compilationClasspath.toList().stream()
+ .filter(artifact -> artifact.getFilename().equalsIgnoreCase("foo_resources.jar"))
+ .count())
+ .isEqualTo(1);
+ }
}