aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-09-19 17:23:31 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-09-20 08:59:49 +0200
commitc034dfd487bdba6b6b2f3f7851415a312ae10f53 (patch)
tree21f86c663ac79bd7c0e634690190bf99a6ed2ee4 /src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
parent088f6113007d1a341893d915a87b93a4aed9898e (diff)
Include library R classes in runtime classpath for library but not binary
In general, R classes for Android libraries are used for compilation of those libraries and then thrown away. They are replaced by the R classes from the binary. Removing the unused android_library R classes will make binaries smaller. RELNOTES: none PiperOrigin-RevId: 169244068
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java36
1 files changed, 24 insertions, 12 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
index 0bb79d7e22..1385b16a7b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
@@ -311,6 +311,16 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
boolean shrinkResources = shouldShrinkResources(ruleContext);
+ NestedSet<Artifact> excludedRuntimeArtifacts = null;
+ if (!androidConfig.includeLibraryResourceJars()) {
+ // Remove the library resource JARs from the binary's runtime classpath.
+ // Resource classes from android_library dependencies are replaced by the binary's resource
+ // class. We remove them only at the top level so that resources included by a library that is
+ // a dependency of a java_library are still included, since these resources are propagated via
+ // android-specific providers and won't show up when we collect the library resource JARs.
+ excludedRuntimeArtifacts = getLibraryResourceJars(ruleContext);
+ }
+
JavaTargetAttributes resourceClasses = androidCommon.init(
javaSemantics,
androidSemantics,
@@ -318,7 +328,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext.getConfiguration().isCodeCoverageEnabled(),
true /* collectJavaCompilationArgs */,
true, /* isBinary */
- androidConfig.includeLibraryResourceJars());
+ excludedRuntimeArtifacts);
ruleContext.assertNoErrors();
Function<Artifact, Artifact> derivedJarFunction =
@@ -689,19 +699,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
// The resources jars from android_library rules contain stub ids, so filter those out of the
// transitive jars.
- Iterable<AndroidLibraryResourceClassJarProvider> libraryResourceJarProviders =
- AndroidCommon.getTransitivePrerequisites(
- ruleContext, Mode.TARGET, AndroidLibraryResourceClassJarProvider.class);
-
- NestedSetBuilder<Artifact> libraryResourceJarsBuilder = NestedSetBuilder.naiveLinkOrder();
- for (AndroidLibraryResourceClassJarProvider provider : libraryResourceJarProviders) {
- libraryResourceJarsBuilder.addTransitive(provider.getResourceClassJars());
- }
- NestedSet<Artifact> libraryResourceJars = libraryResourceJarsBuilder.build();
-
Iterable<Artifact> filteredJars =
Streams.stream(jars)
- .filter(not(in(libraryResourceJars.toSet())))
+ .filter(not(in(getLibraryResourceJars(ruleContext).toSet())))
.collect(toImmutableList());
AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext);
@@ -720,6 +720,18 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext.registerAction(manifestAction);
}
+ private static NestedSet<Artifact> getLibraryResourceJars(RuleContext ruleContext) {
+ Iterable<AndroidLibraryResourceClassJarProvider> libraryResourceJarProviders =
+ AndroidCommon.getTransitivePrerequisites(
+ ruleContext, Mode.TARGET, AndroidLibraryResourceClassJarProvider.class);
+
+ NestedSetBuilder<Artifact> libraryResourceJarsBuilder = NestedSetBuilder.naiveLinkOrder();
+ for (AndroidLibraryResourceClassJarProvider provider : libraryResourceJarProviders) {
+ libraryResourceJarsBuilder.addTransitive(provider.getResourceClassJars());
+ }
+ return libraryResourceJarsBuilder.build();
+ }
+
/** Generates an uncompressed _deploy.jar of all the runtime jars. */
public static Artifact createDeployJar(
RuleContext ruleContext,