diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android')
18 files changed, 403 insertions, 393 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java index 776f2152cd..4a42915da3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java @@ -25,9 +25,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext; import com.google.devtools.build.lib.analysis.actions.CommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; -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.android.ResourceContainer.ResourceType; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java index acf004d3b0..55253a0296 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java @@ -25,16 +25,13 @@ import com.google.devtools.build.lib.analysis.actions.CommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.actions.SpawnAction.Builder; import com.google.devtools.build.lib.analysis.config.CompilationMode; -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.android.ResourceContainer.ResourceType; import com.google.devtools.build.lib.vfs.PathFragment; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; - import javax.annotation.Nullable; /** @@ -70,7 +67,7 @@ public final class AndroidAaptActionHelper { inputs.add(AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar()); inputs.add(manifest); Iterables.addAll(inputs, Iterables.concat(Iterables.transform(resourceContainers, - new Function<AndroidResourcesProvider.ResourceContainer, Iterable<Artifact>>() { + new Function<ResourceContainer, Iterable<Artifact>>() { @Override public Iterable<Artifact> apply(ResourceContainer container) { return container.getArtifacts(); @@ -207,7 +204,7 @@ public final class AndroidAaptActionHelper { args.add(outputPath.getPathString()); // First make sure path elements are unique Collection<String> paths = new LinkedHashSet<>(); - for (AndroidResourcesProvider.ResourceContainer container : resourceContainers) { + for (ResourceContainer container : resourceContainers) { for (Artifact artifact : container.getArtifacts(resourceType)) { paths.add(artifact.getExecPathString()); } @@ -238,7 +235,7 @@ public final class AndroidAaptActionHelper { List<String> dirArgs = new ArrayList<>(); Collection<String> paths = new LinkedHashSet<>(); // First make sure roots are unique - for (AndroidResourcesProvider.ResourceContainer container : resourceContainers) { + for (ResourceContainer container : resourceContainers) { for (PathFragment root : container.getRoots(resourceType)) { paths.add(outputPath.getRelative(root).getPathString()); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java index a3fda94283..2b483800f9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java @@ -40,9 +40,8 @@ import com.google.devtools.build.lib.packages.AggregatingAttributeMapper; import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.Rule; -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.android.AndroidRuleClasses.MultidexMode; +import com.google.devtools.build.lib.rules.android.ResourceContainer.ResourceType; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore; @@ -821,7 +820,7 @@ public class AndroidCommon { public static PathFragment getAssetDir(RuleContext ruleContext) { return new PathFragment(ruleContext.attributes().get( - AndroidResourcesProvider.ResourceType.ASSETS.getAttribute() + "_dir", + ResourceType.ASSETS.getAttribute() + "_dir", Type.STRING)); } 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 8d37d2d12c..c3e0fab4c7 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 @@ -27,8 +27,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.BuildType; 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.android.ResourceContainer.ResourceType; import com.google.devtools.build.lib.rules.cpp.LinkerInput; import com.google.devtools.build.lib.rules.java.JavaCommon; import com.google.devtools.build.lib.rules.java.JavaNeverlinkInfoProvider; @@ -39,7 +38,6 @@ import com.google.devtools.build.lib.rules.java.JavaTargetAttributes; import com.google.devtools.build.lib.rules.java.ProguardLibrary; import com.google.devtools.build.lib.rules.java.ProguardSpecProvider; import com.google.devtools.build.lib.syntax.Type; -import com.google.devtools.build.lib.vfs.PathFragment; /** * An implementation for the "android_library" rule. @@ -153,20 +151,15 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { String javaPackage = AndroidCommon.getJavaPackage(ruleContext); - ResourceContainer resourceContainer = ResourceContainer.create(ruleContext.getLabel(), - javaPackage, - null /* renameManifestPackage */, - false /* inlinedConstants */, - null /* resourceApk -- not needed for library */, - applicationManifest.getManifest(), - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR), - null /* javaClassJar -- compiled separately from resource processing */, - ImmutableList.<Artifact>of(), - ImmutableList.<Artifact>of(), - ImmutableList.<PathFragment>of(), - ImmutableList.<PathFragment>of(), - ruleContext.attributes().get("exports_manifest", Type.BOOLEAN), - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT), null); + ResourceContainer resourceContainer = ResourceContainer.builder() + .setLabel(ruleContext.getLabel()) + .setJavaPackageFromString(javaPackage) + .setManifest(applicationManifest.getManifest()) + .setJavaSourceJar( + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR)) + .setManifestExported(ruleContext.attributes().get("exports_manifest", Type.BOOLEAN)) + .setRTxt(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT)) + .build(); primaryResources = new AndroidResourcesProcessorBuilder(ruleContext) .setLibrary(true) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceContainerBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceContainerBuilder.java deleted file mode 100644 index a148311b18..0000000000 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceContainerBuilder.java +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2015 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package com.google.devtools.build.lib.rules.android; - -import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.analysis.RuleContext; -import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceContainer; -import com.google.devtools.build.lib.rules.java.JavaUtil; -import com.google.devtools.build.lib.syntax.Type; -import com.google.devtools.build.lib.util.Preconditions; - -import javax.annotation.Nullable; - -/** - * Encapsulates the process of building {@link ResourceContainer}. - */ -public final class AndroidResourceContainerBuilder { - private LocalResourceContainer data; - private Artifact manifest; - private Artifact rOutput; - private boolean inlineConstants = false; - private Artifact symbolsFile; - private boolean useJavaPackageFromManifest = false; - - /** Provides the resources and assets for the ResourceContainer. */ - public AndroidResourceContainerBuilder withData(LocalResourceContainer data) { - this.data = data; - return this; - } - - public AndroidResourceContainerBuilder withManifest(Artifact manifest) { - this.manifest = manifest; - return this; - } - - public AndroidResourceContainerBuilder withROutput(Artifact rOutput) { - this.rOutput = rOutput; - return this; - } - - public AndroidResourceContainerBuilder withInlinedConstants(boolean inlineContants) { - this.inlineConstants = inlineContants; - return this; - } - - public AndroidResourceContainerBuilder useJavaPackageFromManifest( - boolean useJavaPackageFromManifest) { - this.useJavaPackageFromManifest = useJavaPackageFromManifest; - return this; - } - - /** Creates a {@link ResourceContainer} from a {@link RuleContext}. - * @throws InterruptedException */ - public ResourceContainer buildFromRule(RuleContext ruleContext, @Nullable Artifact apk) - throws InterruptedException { - return buildFromRule(ruleContext, apk, false); - } - - /** Creates a {@link ResourceContainer} from a {@link RuleContext}. - * @throws InterruptedException */ - public ResourceContainer buildFromRule(RuleContext ruleContext, @Nullable Artifact apk, - boolean alwaysExportManifest) - throws InterruptedException { - Preconditions.checkNotNull(this.manifest); - Preconditions.checkNotNull(this.data); - Artifact rJavaSrcJar = ruleContext.getImplicitOutputArtifact( - AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR); - return AndroidResourcesProvider.ResourceContainer.create( - ruleContext.getLabel(), - getJavaPackage(ruleContext, rJavaSrcJar), - getRenameManifestPackage(ruleContext), - inlineConstants, - apk, - manifest, - rJavaSrcJar, - null, /* javaClassJar -- compile from source jar unless generated directly by a tool */ - data.getAssets(), - data.getResources(), - data.getAssetRoots(), - data.getResourceRoots(), - alwaysExportManifest || getExportsManifest(ruleContext), - rOutput, - symbolsFile); - } - - private String getJavaPackage(RuleContext ruleContext, Artifact rJavaSrcJar) { - if (useJavaPackageFromManifest) { - return null; - } - if (hasCustomPackage(ruleContext)) { - return ruleContext.attributes().get("custom_package", Type.STRING); - } - // TODO(bazel-team): JavaUtil.getJavaPackageName does not check to see if the path is valid. - // So we need to check for the JavaRoot. - if (JavaUtil.getJavaRoot(rJavaSrcJar.getExecPath()) == null) { - ruleContext.ruleError("The location of your BUILD file determines the Java package used for " - + "Android resource processing. A directory named \"java\" or \"javatests\" will be used " - + "as your Java source root and the path of your BUILD file relative to the Java source " - + "root will be used as the package for Android resource processing. The Java source " - + "root could not be determined for \"" + ruleContext.getPackageDirectory() + "\". " - + "Move your BUILD file under a java or javatests directory, or set the 'custom_package' " - + "attribute."); - } - return JavaUtil.getJavaPackageName(rJavaSrcJar.getExecPath()); - } - - private boolean hasCustomPackage(RuleContext ruleContext) { - return ruleContext.attributes().isAttributeValueExplicitlySpecified("custom_package"); - } - - private boolean getExportsManifest(RuleContext ruleContext) { - // AndroidLibraryBaseRule has exports_manifest but AndroidBinaryBaseRule does not. - // ResourceContainers are built for both, so we must check if exports_manifest is present. - return ruleContext.attributes().has("exports_manifest", Type.BOOLEAN) - && ruleContext.attributes().get("exports_manifest", Type.BOOLEAN); - } - - @Nullable - private String getRenameManifestPackage(RuleContext ruleContext) { - return ruleContext.attributes().isAttributeValueExplicitlySpecified("rename_manifest_package") - ? ruleContext.attributes().get("rename_manifest_package", Type.STRING) - : null; - } - - public AndroidResourceContainerBuilder withSymbolsFile(Artifact symbolsFile) { - this.symbolsFile = symbolsFile; - return this; - } -} diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java index c79fd21629..5c737851a4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java @@ -23,8 +23,6 @@ import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; -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.android.ResourceContainerConverter.Builder.SeparatorType; import java.util.ArrayList; import java.util.List; @@ -168,21 +166,11 @@ class AndroidResourceMergingActionBuilder { .build(context)); // Return the full set of processed transitive dependencies. - return ResourceContainer.create( - primary.getLabel(), - primary.getJavaPackage(), - primary.getRenameManifestPackage(), - primary.getConstantsInlined(), - primary.getApk(), - manifestOut != null ? manifestOut : primary.getManifest(), - primary.getJavaSourceJar(), - classJarOut, - primary.getArtifacts(ResourceType.ASSETS), - primary.getArtifacts(ResourceType.RESOURCES), - primary.getRoots(ResourceType.ASSETS), - primary.getRoots(ResourceType.RESOURCES), - primary.isManifestExported(), - primary.getRTxt(), - primary.getSymbolsTxt()); + ResourceContainer.Builder result = primary.toBuilder() + .setJavaClassJar(classJarOut); + if (manifestOut != null) { + result.setManifest(manifestOut); + } + return result.build(); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java index 5a822b4168..3419076a2c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java @@ -23,8 +23,6 @@ import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; -import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceContainer; -import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceType; import java.util.ArrayList; import java.util.List; @@ -152,21 +150,9 @@ class AndroidResourceValidatorActionBuilder { .build(context)); // Return the full set of validated transitive dependencies. - return ResourceContainer.create( - primary.getLabel(), - primary.getJavaPackage(), - primary.getRenameManifestPackage(), - primary.getConstantsInlined(), - primary.getApk(), - primary.getManifest(), - sourceJarOut, - primary.getJavaClassJar(), - primary.getArtifacts(ResourceType.ASSETS), - primary.getArtifacts(ResourceType.RESOURCES), - primary.getRoots(ResourceType.ASSETS), - primary.getRoots(ResourceType.RESOURCES), - primary.isManifestExported(), - rTxtOut, - primary.getSymbolsTxt()); + return primary.toBuilder() + .setJavaSourceJar(sourceJarOut) + .setRTxt(rTxtOut) + .build(); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java index bbbc9b052a..0ef11f0877 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java @@ -22,8 +22,6 @@ import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; -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.android.ResourceContainerConverter.Builder.SeparatorType; import java.util.ArrayList; import java.util.Collections; @@ -323,25 +321,21 @@ public class AndroidResourcesProcessorBuilder { .build(context)); // Return the full set of processed transitive dependencies. - return ResourceContainer.create(primary.getLabel(), - primary.getJavaPackage(), - primary.getRenameManifestPackage(), - primary.getConstantsInlined(), - // If there is no apk to be generated, use the apk from the primary resources. - // All android_binary ResourceContainers have to have an apk, but if a new one is not - // requested to be built for this resource processing action (in case of just creating an - // R.txt or proguard merging), reuse the primary resource from the dependencies. - apkOut != null ? apkOut : primary.getApk(), - manifestOut != null ? manifestOut : primary.getManifest(), - sourceJarOut, - primary.getJavaClassJar(), - primary.getArtifacts(ResourceType.ASSETS), - primary.getArtifacts(ResourceType.RESOURCES), - primary.getRoots(ResourceType.ASSETS), - primary.getRoots(ResourceType.RESOURCES), - primary.isManifestExported(), - rTxtOut, - symbolsTxt); + ResourceContainer.Builder result = primary.toBuilder() + .setJavaSourceJar(sourceJarOut) + .setRTxt(rTxtOut) + .setSymbolsTxt(symbolsTxt); + // If there is an apk to be generated, use it, else reuse the apk from the primary resources. + // All android_binary ResourceContainers have to have an apk, but if a new one is not + // requested to be built for this resource processing action (in case of just creating an + // R.txt or proguard merging), reuse the primary resource from the dependencies. + if (apkOut != null) { + result.setApk(apkOut); + } + if (manifestOut != null) { + result.setManifest(manifestOut); + } + return result.build(); } public AndroidResourcesProcessorBuilder setJavaPackage(String customJavaPackage) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProvider.java index dd117d9697..0bc2391640 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProvider.java @@ -14,16 +14,10 @@ package com.google.devtools.build.lib.rules.android; import com.google.auto.value.AutoValue; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.lib.vfs.PathFragment; -import java.util.Objects; -import javax.annotation.Nullable; /** A provider that supplies ResourceContainers from its transitive closure. */ @AutoValue @@ -49,116 +43,5 @@ public abstract class AndroidResourcesProvider implements TransitiveInfoProvider /** Returns the immediate ResourceContainers for the label. */ public abstract NestedSet<ResourceContainer> getDirectAndroidResources(); - - /** - * The type of resource in question: either asset or a resource. - */ - public enum ResourceType { - ASSETS("assets"), - RESOURCES("resources"); - - private final String attribute; - - private ResourceType(String attribute) { - this.attribute = attribute; - } - - public String getAttribute() { - return attribute; - } - } - - /** - * The resources contributed by a single target. - */ - @AutoValue - @Immutable - public abstract static class ResourceContainer { - - public static ResourceContainer create( - Label label, - @Nullable String javaPackage, - @Nullable String renameManifestPackage, - boolean constantsInlined, - @Nullable Artifact apk, - Artifact manifest, - @Nullable Artifact javaSourceJar, - @Nullable Artifact javaClassJar, - ImmutableList<Artifact> assets, - ImmutableList<Artifact> resources, - ImmutableList<PathFragment> assetsRoots, - ImmutableList<PathFragment> resourcesRoots, - boolean manifestExported, - @Nullable Artifact rTxt, - @Nullable Artifact symbolsTxt) { - return new AutoValue_AndroidResourcesProvider_ResourceContainer( - label, - javaPackage, - renameManifestPackage, - constantsInlined, - apk, - manifest, - javaSourceJar, - javaClassJar, - assets, - resources, - assetsRoots, - resourcesRoots, - manifestExported, - rTxt, - symbolsTxt); - } - - public abstract Label getLabel(); - @Nullable public abstract String getJavaPackage(); - @Nullable public abstract String getRenameManifestPackage(); - public abstract boolean getConstantsInlined(); - @Nullable public abstract Artifact getApk(); - public abstract Artifact getManifest(); - @Nullable public abstract Artifact getJavaSourceJar(); - @Nullable public abstract Artifact getJavaClassJar(); - - abstract ImmutableList<Artifact> getAssets(); - abstract ImmutableList<Artifact> getResources(); - - public ImmutableList<Artifact> getArtifacts(ResourceType resourceType) { - return resourceType == ResourceType.ASSETS ? getAssets() : getResources(); - } - - public Iterable<Artifact> getArtifacts() { - return Iterables.concat(getAssets(), getResources()); - } - - abstract ImmutableList<PathFragment> getAssetsRoots(); - abstract ImmutableList<PathFragment> getResourcesRoots(); - public ImmutableList<PathFragment> getRoots(ResourceType resourceType) { - return resourceType == ResourceType.ASSETS ? getAssetsRoots() : getResourcesRoots(); - } - - public abstract boolean isManifestExported(); - @Nullable public abstract Artifact getRTxt(); - @Nullable public abstract Artifact getSymbolsTxt(); - - // TODO(somebody) evaluate if we can just use hashCode and equals from AutoValue - @Override - public int hashCode() { - return Objects.hash(getLabel(), getRTxt(), getSymbolsTxt()); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof ResourceContainer)) { - return false; - } - ResourceContainer other = (ResourceContainer) obj; - return Objects.equals(getLabel(), other.getLabel()) - && Objects.equals(getRTxt(), other.getRTxt()) - && Objects.equals(getSymbolsTxt(), other.getSymbolsTxt()); - } - } - AndroidResourcesProvider() {} } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java index ed7ee96853..29fc66407c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java @@ -21,8 +21,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.collect.nestedset.Order; import com.google.devtools.build.lib.rules.SkylarkApiProvider; -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.android.ResourceContainer.ResourceType; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java index 3922c544e7..808611041e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java @@ -32,8 +32,8 @@ import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.config.CompilationMode; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidManifestMerger; -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.android.ResourceContainer.Builder.JavaPackageSource; +import com.google.devtools.build.lib.rules.android.ResourceContainer.ResourceType; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.PathFragment; @@ -305,11 +305,12 @@ public final class ApplicationManifest { true, /* crunchPng */ ImmutableList.<String>of(), /* densities */ incremental, - new AndroidResourceContainerBuilder() - .withData(data) - .withManifest(getManifest()) - .withROutput(rTxt) - .buildFromRule(ruleContext, resourceApk), + ResourceContainer.builderFromRule(ruleContext) + .setAssetsAndResourcesFrom(data) + .setManifest(getManifest()) + .setRTxt(rTxt) + .setApk(resourceApk) + .build(), data, proguardCfg, null, /* Artifact mainDexProguardCfg */ @@ -331,6 +332,16 @@ public final class ApplicationManifest { if (ruleContext.hasErrors()) { return null; } + ResourceContainer.Builder resourceContainer = + ResourceContainer.builderFromRule(ruleContext) + .setAssetsAndResourcesFrom(data) + .setManifest(getManifest()) + .setRTxt(rTxt) + .setSymbolsTxt(symbolsTxt) + .setJavaPackageFrom(JavaPackageSource.MANIFEST); + if (alwaysExportManifest) { + resourceContainer.setManifestExported(true); + } return createApk( ruleContext, true, /* isLibrary */ @@ -340,13 +351,7 @@ public final class ApplicationManifest { false, /* crunchPng */ ImmutableList.<String>of(), /* List<String> densities */ false, /* incremental */ - new AndroidResourceContainerBuilder() - .withData(data) - .withManifest(getManifest()) - .withROutput(rTxt) - .withSymbolsFile(symbolsTxt) - .useJavaPackageFromManifest(true) - .buildFromRule(ruleContext, null, alwaysExportManifest), + resourceContainer.build(), data, null, /* Artifact proguardCfg */ null, /* Artifact mainDexProguardCfg */ @@ -398,12 +403,13 @@ public final class ApplicationManifest { crunchPng, densities, incremental, - new AndroidResourceContainerBuilder() - .withData(data) - .withManifest(getManifest()) - .withROutput(rTxt) - .withSymbolsFile(symbolsTxt) - .buildFromRule(ruleContext, resourceApk), + ResourceContainer.builderFromRule(ruleContext) + .setAssetsAndResourcesFrom(data) + .setManifest(getManifest()) + .setRTxt(rTxt) + .setSymbolsTxt(symbolsTxt) + .setApk(resourceApk) + .build(), data, proguardCfg, mainDexProguardCfg, @@ -618,21 +624,14 @@ public final class ApplicationManifest { aaptActionHelper.createGenerateApkAction(resourceApk, resourceContainer.getRenameManifestPackage(), additionalAaptOpts.build(), densities); - ResourceContainer updatedResources = ResourceContainer.create( - ruleContext.getLabel(), - resourceContainer.getJavaPackage(), - resourceContainer.getRenameManifestPackage(), - resourceContainer.getConstantsInlined(), - resourceApk, - getManifest(), - javaSourcesJar, - null, /* javaClassJar */ - resourceContainer.getArtifacts(ResourceType.ASSETS), - resourceContainer.getArtifacts(ResourceType.RESOURCES), - resourceContainer.getRoots(ResourceType.ASSETS), - resourceContainer.getRoots(ResourceType.RESOURCES), - resourceContainer.isManifestExported(), - resourceContainer.getRTxt(), null); + ResourceContainer updatedResources = resourceContainer.toBuilder() + .setLabel(ruleContext.getLabel()) + .setApk(resourceApk) + .setManifest(getManifest()) + .setJavaSourceJar(javaSourcesJar) + .setJavaClassJar(null) + .setSymbolsTxt(null) + .build(); aaptActionHelper.createGenerateProguardAction(proguardCfg, mainDexProguardCfg); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java b/src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java index 05d60a8eb4..d4a15834e8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/LocalResourceContainer.java @@ -25,7 +25,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; -import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceType; +import com.google.devtools.build.lib.rules.android.ResourceContainer.ResourceType; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.Collection; diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java index 933790a9c0..4d56a06f11 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java @@ -27,7 +27,6 @@ import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; -import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceContainer; import java.util.ArrayList; import java.util.List; import javax.annotation.Nullable; diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java index 8ba6ca6838..136c404bf4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java @@ -16,8 +16,6 @@ package com.google.devtools.build.lib.rules.android; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceContainer; - import javax.annotation.Nullable; /** @@ -103,14 +101,14 @@ public final class ResourceApk { /** * Creates an provider from the resources in the ResourceApk. - * + * * <p>If the ResourceApk was created from transitive resources, the provider will effectively * contain the "forwarded" resources: The merged transitive and merged direct dependencies of this * library. - * + * * <p>If the ResourceApk was generated from a "resources" attribute, it will contain the * "resources" container in the direct dependencies and the rest as transitive. - * + * * <p>If the ResourceApk was generated from local resources, that will be the direct dependencies and * the rest will be transitive. */ diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java new file mode 100644 index 0000000000..0dca5ac607 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java @@ -0,0 +1,321 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.android; + +import com.google.auto.value.AutoValue; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.rules.java.JavaUtil; +import com.google.devtools.build.lib.syntax.Type; +import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.lib.vfs.PathFragment; +import java.util.Objects; +import javax.annotation.Nullable; + +/** The resources contributed by a single target. */ +@AutoValue +@Immutable +public abstract class ResourceContainer { + /** The type of resource in question: either asset or a resource. */ + public enum ResourceType { + ASSETS("assets"), + RESOURCES("resources"); + + private final String attribute; + + private ResourceType(String attribute) { + this.attribute = attribute; + } + + public String getAttribute() { + return attribute; + } + } + + public abstract Label getLabel(); + + @Nullable + public abstract String getJavaPackage(); + + @Nullable + public abstract String getRenameManifestPackage(); + + public abstract boolean getConstantsInlined(); + + @Nullable + public abstract Artifact getApk(); + + public abstract Artifact getManifest(); + + @Nullable + public abstract Artifact getJavaSourceJar(); + + @Nullable + public abstract Artifact getJavaClassJar(); + + abstract ImmutableList<Artifact> getAssets(); + + abstract ImmutableList<Artifact> getResources(); + + public ImmutableList<Artifact> getArtifacts(ResourceType resourceType) { + return resourceType == ResourceType.ASSETS ? getAssets() : getResources(); + } + + public Iterable<Artifact> getArtifacts() { + return Iterables.concat(getAssets(), getResources()); + } + + abstract ImmutableList<PathFragment> getAssetsRoots(); + + abstract ImmutableList<PathFragment> getResourcesRoots(); + + public ImmutableList<PathFragment> getRoots(ResourceType resourceType) { + return resourceType == ResourceType.ASSETS ? getAssetsRoots() : getResourcesRoots(); + } + + public abstract boolean isManifestExported(); + + @Nullable + public abstract Artifact getRTxt(); + + @Nullable + public abstract Artifact getSymbolsTxt(); + + // The limited hashCode and equals behavior is necessary to avoid duplication when building with + // fat_apk_cpu set. Artifacts generated in different configurations will naturally be different + // and non-equal objects, causing the ResourceContainer not to be automatically deduplicated at + // the android_binary level. + // TODO(bazel-team): deduplicate explicitly and remove hashCode and equals overrides to avoid + // breaking "equals means interchangeable" + @Override + public int hashCode() { + return Objects.hash(getLabel(), getRTxt(), getSymbolsTxt()); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof ResourceContainer)) { + return false; + } + ResourceContainer other = (ResourceContainer) obj; + return Objects.equals(getLabel(), other.getLabel()) + && Objects.equals(getRTxt(), other.getRTxt()) + && Objects.equals(getSymbolsTxt(), other.getSymbolsTxt()); + } + + /** Converts this container back into a builder to create a modified copy. */ + public abstract Builder toBuilder(); + + /** Creates a new builder with default values. */ + public static Builder builder() { + return new AutoValue_ResourceContainer.Builder() + .setJavaPackageFrom(Builder.JavaPackageSource.MANIFEST) + .setConstantsInlined(false) + .setAssets(ImmutableList.<Artifact>of()) + .setResources(ImmutableList.<Artifact>of()) + .setAssetsRoots(ImmutableList.<PathFragment>of()) + .setResourcesRoots(ImmutableList.<PathFragment>of()); + } + + /** + * Creates a new builder with the label, Java package, manifest package override, Java source jar, + * and manifest-export switch set according to the given rule. + */ + public static Builder builderFromRule(RuleContext ruleContext) throws InterruptedException { + return builder().forRuleContext(ruleContext); + } + + /** Builder to construct resource containers. */ + @AutoValue.Builder + public abstract static class Builder { + /** Enum to determine what to do if a package hasn't been manually set. */ + public enum JavaPackageSource { + /** + * Uses the package from the manifest, i.e., the generated ResourceContainer will return null + * from {@link ResourceContainer#getJavaPackage()}. + */ + MANIFEST, + /** + * Uses the package from the path to the source jar (or, if the rule context has it set, + * the {@code custom_package} attribute). If the source jar is not under a valid Java root, + * this will result in an error being added to the rule context. This can only be used if the + * builder was created by {@link ResourceContainer#builderFromRule(RuleContext)}. + */ + SOURCE_JAR_PATH + } + + @Nullable private RuleContext ruleContext; + @Nullable private JavaPackageSource javaPackageSource; + + private Builder forRuleContext(RuleContext ruleContext) throws InterruptedException { + Preconditions.checkNotNull(ruleContext); + this.ruleContext = ruleContext; + return this.setLabel(ruleContext.getLabel()) + .setRenameManifestPackage(getRenameManifestPackage(ruleContext)) + .setJavaSourceJar( + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR)) + .setJavaPackageFrom(JavaPackageSource.SOURCE_JAR_PATH) + .setManifestExported(getExportsManifest(ruleContext)); + } + + /** + * Sets the Java package from the given source. Overrides earlier calls to + * {@link #setJavaPackageFrom(JavaPackageSource)} or {@link #setJavaPackageFromString(String)}. + * + * <p>To set the package from {@link JavaPackageSource#SOURCE_JAR_PATH}, this instance must have + * been created using {@link ResourceContainer#builderFromRule(RuleContext)}. Also in this case, + * the source jar must be set non-{@code null} when the {@link #build()} method is called. + * It defaults to the source jar implicit output when creating a builder out of a rule context. + */ + public Builder setJavaPackageFrom(JavaPackageSource javaPackageSource) { + Preconditions.checkNotNull(javaPackageSource); + Preconditions.checkArgument( + !(javaPackageSource == JavaPackageSource.SOURCE_JAR_PATH && ruleContext == null), + "setJavaPackageFrom(SOURCE_JAR_PATH) is only permitted when using builderFromRule."); + this.javaPackageSource = javaPackageSource; + return this.setJavaPackage(null); + } + + /** + * Sets the Java package from the given string. Overrides earlier calls to + * {@link #setJavaPackageFrom(JavaPackageSource)} or {@link #setJavaPackageFromString(String)}. + * + * <p>To make {@link ResourceContainer#getJavaPackage()} return {@code null}, call + * {@code setJavaPackageFrom(MANIFEST)} instead. + */ + public Builder setJavaPackageFromString(String javaPackageOverride) { + Preconditions.checkNotNull(javaPackageOverride); + this.javaPackageSource = null; + return this.setJavaPackage(javaPackageOverride); + } + + /** + * Sets the assets, resources, asset roots, and resource roots from the given local resource + * container. + * + * <p>This will override any of these values which were previously set directly. + */ + public Builder setAssetsAndResourcesFrom(LocalResourceContainer data) { + return this.setAssets(data.getAssets()) + .setResources(data.getResources()) + .setAssetsRoots(data.getAssetRoots()) + .setResourcesRoots(data.getResourceRoots()); + } + + public abstract Builder setLabel(Label label); + + abstract Builder setJavaPackage(@Nullable String javaPackage); + + public abstract Builder setRenameManifestPackage(@Nullable String renameManifestPackage); + + public abstract Builder setConstantsInlined(boolean constantsInlined); + + public abstract Builder setApk(@Nullable Artifact apk); + + public abstract Builder setManifest(Artifact manifest); + + @Nullable + abstract Artifact getJavaSourceJar(); + + public abstract Builder setJavaSourceJar(@Nullable Artifact javaSourceJar); + + public abstract Builder setJavaClassJar(@Nullable Artifact javaClassJar); + + public abstract Builder setAssets(ImmutableList<Artifact> assets); + + public abstract Builder setResources(ImmutableList<Artifact> resources); + + public abstract Builder setAssetsRoots(ImmutableList<PathFragment> assetsRoots); + + public abstract Builder setResourcesRoots(ImmutableList<PathFragment> resourcesRoots); + + public abstract Builder setManifestExported(boolean manifestExported); + + public abstract Builder setRTxt(@Nullable Artifact rTxt); + + public abstract Builder setSymbolsTxt(@Nullable Artifact symbolsTxt); + + abstract ResourceContainer autoBuild(); + + /** + * Builds and returns the ResourceContainer. + * + * <p>May result in the rule context adding a rule error if the Java package was to be set from + * the source jar path, but the source jar does not have an acceptable Java package. + */ + public ResourceContainer build() { + if (javaPackageSource == JavaPackageSource.SOURCE_JAR_PATH) { + Preconditions.checkState( + !(javaPackageSource == JavaPackageSource.SOURCE_JAR_PATH && ruleContext == null), + "setJavaPackageFrom(SOURCE_JAR_PATH) is only permitted when using builderFromRule."); + Preconditions.checkState( + getJavaSourceJar() != null, + "setJavaPackageFrom(SOURCE_JAR_PATH) was called, but no source jar was set."); + setJavaPackage(getJavaPackageFromSourceJarPath()); + } + return autoBuild(); + } + + @Nullable + private String getJavaPackageFromSourceJarPath() { + if (javaPackageSource != JavaPackageSource.SOURCE_JAR_PATH) { + return null; + } + if (hasCustomPackage(ruleContext)) { + return ruleContext.attributes().get("custom_package", Type.STRING); + } + Artifact rJavaSrcJar = getJavaSourceJar(); + // TODO(bazel-team): JavaUtil.getJavaPackageName does not check to see if the path is valid. + // So we need to check for the JavaRoot. + if (JavaUtil.getJavaRoot(rJavaSrcJar.getExecPath()) == null) { + ruleContext.ruleError( + "The location of your BUILD file determines the Java package used for " + + "Android resource processing. A directory named \"java\" or \"javatests\" will " + + "be used as your Java source root and the path of your BUILD file relative to " + + "the Java source root will be used as the package for Android resource " + + "processing. The Java source root could not be determined for \"" + + ruleContext.getPackageDirectory() + + "\". Move your BUILD file under a java or javatests directory, or set the " + + "'custom_package' attribute."); + } + return JavaUtil.getJavaPackageName(rJavaSrcJar.getExecPath()); + } + + private static boolean hasCustomPackage(RuleContext ruleContext) { + return ruleContext.attributes().isAttributeValueExplicitlySpecified("custom_package"); + } + + private static boolean getExportsManifest(RuleContext ruleContext) { + // AndroidLibraryBaseRule has exports_manifest but AndroidBinaryBaseRule does not. + // ResourceContainers are built for both, so we must check if exports_manifest is present. + return ruleContext.attributes().has("exports_manifest", Type.BOOLEAN) + && ruleContext.attributes().get("exports_manifest", Type.BOOLEAN); + } + + @Nullable + private static String getRenameManifestPackage(RuleContext ruleContext) { + return ruleContext.attributes().isAttributeValueExplicitlySpecified("rename_manifest_package") + ? ruleContext.attributes().get("rename_manifest_package", Type.STRING) + : null; + } + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java index d86ada91c5..4e1f9a8624 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java @@ -27,8 +27,7 @@ import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; -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.android.ResourceContainer.ResourceType; import javax.annotation.Nullable; /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java index 269769a6b1..b64570a97c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java @@ -23,7 +23,6 @@ import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.BuildType; -import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceContainer; /** * Represents a container for the {@link ResourceContainer}s for a given library. This is diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java index 63525e97e3..beb7370d5a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java @@ -22,8 +22,6 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.config.CompilationMode; -import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceContainer; - import java.util.Collections; import java.util.List; |