diff options
author | Andrew Pellegrini <apell@google.com> | 2015-07-28 18:16:21 +0000 |
---|---|---|
committer | Lukacs Berki <lberki@google.com> | 2015-07-29 16:00:27 +0000 |
commit | c3bca87818351cc9c85e47ac59732c9cbf378724 (patch) | |
tree | 78dbd20f4e44780e35201f1e30dfd461d8bb2570 /src/main/java/com/google/devtools/build/lib/rules/android | |
parent | c86cd0bd3fa4c6700a71c9f516afe3214c976df9 (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
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java | 24 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarProvider.java | 58 |
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); + } } } |