aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Andrew Pellegrini <apell@google.com>2015-07-28 18:16:21 +0000
committerGravatar Lukacs Berki <lberki@google.com>2015-07-29 16:00:27 +0000
commitc3bca87818351cc9c85e47ac59732c9cbf378724 (patch)
tree78dbd20f4e44780e35201f1e30dfd461d8bb2570
parentc86cd0bd3fa4c6700a71c9f516afe3214c976df9 (diff)
Switches AndroidRobolectricTest to using .aars to provide transitive resources to the test runner instead of ResourceContainers. Update AndroidLibraryAarProvider to contain transitive closure of .aars. Provides an ~4x speed improvement in test startup time.
RELNOTES: android_resources is no longer allowed as a dep for android_robolectric_test. -- MOS_MIGRATED_REVID=99296321
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarProvider.java58
2 files changed, 71 insertions, 11 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java
index fa40809201..25b3ef560b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java
@@ -30,6 +30,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.Type;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
+import com.google.devtools.build.lib.rules.android.AndroidLibraryAarProvider.Aar;
import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceContainer;
import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceType;
import com.google.devtools.build.lib.rules.cpp.LinkerInput;
@@ -67,6 +68,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
checkIdlRootImport(ruleContext);
NestedSet<AndroidResourcesProvider.ResourceContainer> transitiveResources =
collectTransitiveResources(ruleContext);
+ NestedSetBuilder<Aar> transitiveAars = collectTransitiveAars(ruleContext);
NestedSet<LinkerInput> transitiveNativeLibraries =
AndroidCommon.collectTransitiveNativeLibraries(deps);
NestedSet<Artifact> transitiveProguardConfigs =
@@ -122,6 +124,8 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
.setAAROut(aarOut)
.build(ruleContext);
+ Aar aar = new Aar(aarOut, applicationManifest.getManifest());
+
RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext);
androidCommon.addTransitiveInfoProviders(builder);
androidSemantics.addTransitiveInfoProviders(
@@ -139,8 +143,8 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
.add(AndroidCcLinkParamsProvider.class,
new AndroidCcLinkParamsProvider(androidCommon.getCcLinkParamsStore()))
.add(ProguardSpecProvider.class, new ProguardSpecProvider(transitiveProguardConfigs))
- .add(AndroidLibraryAarProvider.class, new AndroidLibraryAarProvider(aarOut,
- applicationManifest.getManifest()))
+ .add(AndroidLibraryAarProvider.class, new AndroidLibraryAarProvider(aar,
+ transitiveAars.add(aar).build()))
.addOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL, transitiveProguardConfigs)
.build();
} catch (RuleConfigurationException e) {
@@ -193,8 +197,10 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
if (AndroidCommon.getAndroidResources(ruleContext) != null) {
primaryResources = Iterables.getOnlyElement(
AndroidCommon.getAndroidResources(ruleContext).getTransitiveAndroidResources());
+
+ Aar aar = new Aar(aarOut, primaryResources.getManifest());
targetBuilder.add(AndroidLibraryAarProvider.class, new AndroidLibraryAarProvider(
- aarOut, primaryResources.getManifest()));
+ aar, transitiveAars.add(aar).build()));
} else {
// there are no local resources and resources attribute was not specified either
ApplicationManifest applicationManifest =
@@ -235,6 +241,9 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
ruleContext.getConfiguration().getCompilationMode() != CompilationMode.OPT)
.setWorkingDirectory(ruleContext.getUniqueDirectory("_resources"))
.build(ruleContext);
+
+ targetBuilder.add(AndroidLibraryAarProvider.class, new AndroidLibraryAarProvider(
+ null, transitiveAars.build()));
}
new AarGeneratorBuilder(ruleContext)
@@ -339,6 +348,15 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
return builder.build();
}
+ private NestedSetBuilder<Aar> collectTransitiveAars(RuleContext ruleContext) {
+ NestedSetBuilder<Aar> builder = NestedSetBuilder.naiveLinkOrder();
+ for (AndroidLibraryAarProvider library :
+ ruleContext.getPrerequisites("deps", Mode.TARGET, AndroidLibraryAarProvider.class)) {
+ builder.addTransitive(library.getTransitiveAars());
+ }
+ return builder;
+ }
+
private boolean hasExplicitlySpecifiedIdlImportRoot(RuleContext ruleContext) {
return ruleContext.getRule().isAttributeValueExplicitlySpecified("idl_import_root");
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarProvider.java
index 59402defd8..f4f16bd96f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarProvider.java
@@ -16,8 +16,11 @@ package com.google.devtools.build.lib.rules.android;
import com.google.common.base.Preconditions;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import java.util.Objects;
+
/**
* A target that can provide the aar artifact of Android libraries and all the manifests that are
* merged into the main aar manifest.
@@ -25,19 +28,58 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
@Immutable
public final class AndroidLibraryAarProvider implements TransitiveInfoProvider {
- private final Artifact aar;
- private final Artifact manifest;
+ private final Aar aar;
+ private final NestedSet<Aar> transitiveAars;
- public AndroidLibraryAarProvider(Artifact aar, Artifact manifest) {
- this.aar = Preconditions.checkNotNull(aar);
- this.manifest = Preconditions.checkNotNull(manifest);
+ public AndroidLibraryAarProvider(Aar aar, NestedSet<Aar> transitiveAars) {
+ this.aar = aar;
+ this.transitiveAars = transitiveAars;
}
- public Artifact getAar() {
+ public Aar getAar() {
return aar;
}
- public Artifact getManifest() {
- return manifest;
+ public NestedSet<Aar> getTransitiveAars() {
+ return transitiveAars;
+ }
+
+ /**
+ * The .aar file and associated AndroidManifest.xml contributed by a single target.
+ */
+ @Immutable
+ public static final class Aar {
+ private final Artifact aar;
+ private final Artifact manifest;
+
+ public Aar(Artifact aar, Artifact manifest) {
+ this.aar = Preconditions.checkNotNull(aar);
+ this.manifest = Preconditions.checkNotNull(manifest);
+ }
+
+ public Artifact getAar() {
+ return aar;
+ }
+
+ public Artifact getManifest() {
+ return manifest;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(aar, manifest);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof Aar)) {
+ return false;
+ }
+ Aar other = (Aar) obj;
+ return aar.equals(other.aar) && manifest.equals(other.manifest);
+ }
}
}