aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar asteinb <asteinb@google.com>2018-04-18 07:46:20 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-04-18 07:47:34 -0700
commit9e76d242beb562e8337caf5529f0e6a151399b28 (patch)
tree05e47c8e94e4749a69c21596af41cb76e8e79243 /src
parent83da8ccd5716f5be19f9be8e36949c58a3f741eb (diff)
Ability to stop using ResourceContainer in various actions
Now that we support decoupled asset and resource processing in the basic pipeline, we can also support it in these actions. ResourceShrinker actions, by design, does not use assets, so the change is trivial. For the AarGenerator, things get a bit more complex: - Simplify needlessly complex code around AAR generation - Move around special resource processing to generate AAR inputs in the case where there are no local resources to go next to normal resource processing - Also, clean up that code - ResourceApk wrapper class has some fields which are non-null even in the case where resources are inherited - Always pass assets and resources seperately to the AarGenerator action RELNOTES: none PiperOrigin-RevId: 193355790
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java51
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java55
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidAssets.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java113
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/StampedAndroidManifest.java7
10 files changed, 178 insertions, 96 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 f259a48cd1..351f66ddf5 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
@@ -13,11 +13,8 @@
// limitations under the License.
package com.google.devtools.build.lib.rules.android;
-import com.google.common.base.Functions;
-import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
-import com.google.common.collect.Iterators;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.CommandLine;
@@ -27,7 +24,6 @@ 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.SpawnAction;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
-import com.google.devtools.build.lib.rules.android.ResourceContainer.ResourceType;
import com.google.devtools.build.lib.util.OS;
import java.util.ArrayList;
import java.util.List;
@@ -35,7 +31,9 @@ import java.util.List;
/** Builder for creating aar generator action. */
public class AarGeneratorBuilder {
- private ResourceContainer primary;
+ private AndroidResources primaryResources;
+ private AndroidAssets primaryAssets;
+
private Artifact manifest;
private Artifact rTxt;
private Artifact classes;
@@ -57,8 +55,13 @@ public class AarGeneratorBuilder {
this.builder = new SpawnAction.Builder();
}
- public AarGeneratorBuilder withPrimary(ResourceContainer primary) {
- this.primary = primary;
+ public AarGeneratorBuilder withPrimaryResources(AndroidResources primaryResources) {
+ this.primaryResources = primaryResources;
+ return this;
+ }
+
+ public AarGeneratorBuilder withPrimaryAssets(AndroidAssets primaryAssets) {
+ this.primaryAssets = primaryAssets;
return this;
}
@@ -104,7 +107,18 @@ public class AarGeneratorBuilder {
args.add("--");
args.add("--mainData");
- addPrimaryResourceContainer(ins, args, primary);
+
+ Iterables.addAll(ins, primaryResources.getResources());
+ Iterables.addAll(ins, primaryAssets.getAssets());
+ ins.add(manifest);
+
+ // no R.txt, because it will be generated from this action.
+ args.add(
+ String.format(
+ "%s:%s:%s",
+ AndroidDataConverter.rootsToString(primaryResources.getResourceRoots()),
+ AndroidDataConverter.rootsToString(primaryAssets.getAssetRoots()),
+ manifest.getExecPathString()));
if (manifest != null) {
args.add("--manifest");
@@ -161,25 +175,4 @@ public class AarGeneratorBuilder {
.setMnemonic("AARGenerator")
.build(context));
}
-
- private void addPrimaryResourceContainer(
- List<Artifact> inputs, List<String> args, ResourceContainer container) {
- Iterables.addAll(inputs, container.getArtifacts());
- inputs.add(container.getManifest());
-
- // no R.txt, because it will be generated from this action.
- args.add(
- String.format(
- "%s:%s:%s",
- convertRoots(container, ResourceType.RESOURCES),
- convertRoots(container, ResourceType.ASSETS),
- container.getManifest().getExecPathString()));
- }
-
- private static String convertRoots(ResourceContainer container, ResourceType resourceType) {
- return Joiner.on("#")
- .join(
- Iterators.transform(
- container.getRoots(resourceType).iterator(), Functions.toStringFunction()));
- }
}
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 4d7d664550..1a2e5f8f45 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
@@ -780,7 +780,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP))
.withShrunkJar(proguardOutput.getOutputJar())
.withProguardMapping(proguardOutput.getMapping())
- .withPrimary(resourceApk.getPrimaryResources())
+ .withPrimary(resourceApk.getValidatedResources())
.withDependencies(resourceApk.getResourceDependencies())
.setTargetAaptVersion(AndroidAaptVersion.chooseTargetAaptVersion(ruleContext))
.setResourceFilterFactory(ResourceFilterFactory.fromRuleContext(ruleContext))
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 2fe425728f..db44618df6 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
@@ -21,7 +21,6 @@ import com.google.devtools.build.lib.analysis.OutputGroupInfo;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.analysis.RuleContext;
-import com.google.devtools.build.lib.analysis.config.CompilationMode;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -166,7 +165,13 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
return null;
}
} else {
- resourceApk = ResourceApk.fromTransitiveResources(resourceDeps, assetDeps);
+ // Process transitive resources so we can build artifacts needed to export an aar.
+ resourceApk =
+ ResourceApk.processFromTransitiveLibraryData(
+ ruleContext,
+ resourceDeps,
+ assetDeps,
+ StampedAndroidManifest.createEmpty(ruleContext, /* exported = */ false));
}
JavaTargetAttributes javaTargetAttributes =
@@ -187,55 +192,19 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_CLASS_JAR);
Artifact aarOut = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_AAR);
- final ResourceContainer primaryResources;
final Aar aar;
if (definesLocalResources) {
- primaryResources = resourceApk.getPrimaryResources();
- // applicationManifest has already been checked for nullness above in this method
- ApplicationManifest applicationManifest =
- ApplicationManifest.fromExplicitManifest(ruleContext, resourceApk.getManifest());
-
- aar = Aar.create(aarOut, applicationManifest.getManifest());
+ aar = Aar.create(aarOut, resourceApk.getManifest());
addAarToProvider(aar, transitiveAars, transitiveAarArtifacts);
} else {
aar = null;
- ApplicationManifest applicationManifest =
- ApplicationManifest.generatedManifest(ruleContext)
- .renamePackage(ruleContext, AndroidCommon.getJavaPackage(ruleContext));
-
- String javaPackage = AndroidCommon.getJavaPackage(ruleContext);
-
- ResourceContainer resourceContainer =
- ResourceContainer.builder()
- .setLabel(ruleContext.getLabel())
- .setJavaPackageFromString(javaPackage)
- .setManifest(applicationManifest.getManifest())
- .setJavaSourceJar(
- ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR))
- .setManifestExported(AndroidCommon.getExportsManifest(ruleContext))
- .setRTxt(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT))
- .build();
-
- primaryResources =
- new AndroidResourcesProcessorBuilder(ruleContext)
- .setLibrary(true)
- .setRTxtOut(resourceContainer.getRTxt())
- .setManifestOut(
- ruleContext.getImplicitOutputArtifact(
- AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST))
- .setSourceJarOut(resourceContainer.getJavaSourceJar())
- .setJavaPackage(resourceContainer.getJavaPackage())
- .withResourceDependencies(resourceApk.getResourceDependencies())
- .setDebug(ruleContext.getConfiguration().getCompilationMode() != CompilationMode.OPT)
- .setThrowOnResourceConflict(
- ruleContext.getFragment(AndroidConfiguration.class).throwOnResourceConflict())
- .build(resourceContainer);
}
new AarGeneratorBuilder(ruleContext)
- .withPrimary(primaryResources)
- .withManifest(aar != null ? aar.getManifest() : primaryResources.getManifest())
- .withRtxt(primaryResources.getRTxt())
+ .withPrimaryResources(resourceApk.getPrimaryResources())
+ .withPrimaryAssets(resourceApk.getPrimaryAssets())
+ .withManifest(resourceApk.getManifest())
+ .withRtxt(resourceApk.getRTxt())
.withClasses(classesJar)
.setAAROut(aarOut)
.setProguardSpecs(proguardLibrary.collectLocalProguardSpecs())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
index d3e3793261..97bdf601b6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
@@ -137,7 +137,7 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor
Substitution.of("%android_merged_assets%", "jar:file:" + resourcesLocation + "!/assets"));
substitutions.add(
Substitution.of(
- "%android_custom_package%", resourceApk.getPrimaryResources().getJavaPackage()));
+ "%android_custom_package%", resourceApk.getValidatedResources().getJavaPackage()));
boolean generateBinaryResources =
androidLocalTestConfiguration.useAndroidLocalTestBinaryResources();
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 2747f304f2..8b6afdaaf7 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
@@ -220,6 +220,25 @@ public class AndroidResourcesProcessorBuilder {
return this;
}
+ /**
+ * Creates and registers an action that processes only transitive data.
+ *
+ * <p>Local resources and assets will be completely ignored by this action.
+ *
+ * @return a {@link ResourceApk} containing the processed resource, asset, and manifest
+ * information.
+ */
+ public ResourceApk buildWithoutLocalResources(StampedAndroidManifest manifest) {
+
+ build(AndroidResources.empty(), AndroidAssets.empty(), manifest);
+
+ return ResourceApk.fromTransitiveResources(
+ resourceDependencies,
+ assetDependencies,
+ manifestOut == null ? manifest.getManifest() : manifestOut,
+ rTxtOut);
+ }
+
public ResourceContainer build(ResourceContainer primary) {
build(
primary.getAndroidResources(),
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 3bf61dbbec..a6e8b5883b 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
@@ -135,13 +135,22 @@ public final class ApplicationManifest {
*/
public static ApplicationManifest generatedManifest(RuleContext ruleContext)
throws RuleErrorException {
+ return fromExplicitManifest(
+ ruleContext, generateManifest(ruleContext, AndroidCommon.getJavaPackage(ruleContext)));
+ }
+
+ /**
+ * Creates an action to generate an empty manifest file with a specific package name.
+ *
+ * @return an artifact for the generated manifest
+ */
+ static Artifact generateManifest(RuleContext ruleContext, String manifestPackage) {
Artifact generatedManifest =
ruleContext.getUniqueDirectoryArtifact(
ruleContext.getRule().getName() + "_generated",
PathFragment.create("AndroidManifest.xml"),
ruleContext.getBinOrGenfilesDirectory());
- String manifestPackage = AndroidCommon.getJavaPackage(ruleContext);
String contents =
Joiner.on("\n")
.join(
@@ -156,7 +165,7 @@ public final class ApplicationManifest {
.registerAction(
FileWriteAction.create(
ruleContext, generatedManifest, contents, /*makeExecutable=*/ false));
- return fromExplicitManifest(ruleContext, generatedManifest);
+ return generatedManifest;
}
private static ImmutableMap<String, String> getManifestValues(RuleContext context) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidAssets.java b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidAssets.java
index fcda8e5912..37a5c849e0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidAssets.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidAssets.java
@@ -88,6 +88,10 @@ public class MergedAndroidAssets extends ParsedAndroidAssets {
return mergedAssets;
}
+ public AssetDependencies getAssetDependencies() {
+ return assetDependencies;
+ }
+
@Override
public boolean equals(Object object) {
if (!super.equals(object)) {
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 2a43b64fc5..21c517fcb2 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,6 +16,8 @@ package com.google.devtools.build.lib.rules.android;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.OutputGroupInfo;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
+import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.config.CompilationMode;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import javax.annotation.Nullable;
@@ -34,10 +36,17 @@ public final class ResourceApk {
@Nullable private final Artifact resourceJavaClassJar; // Class jar containing R.class files
private final ResourceDependencies resourceDeps;
private final AssetDependencies assetDeps;
- @Nullable private final ResourceContainer primaryResources;
- @Nullable private final AndroidAssets primaryAssets;
+ /**
+ * Validated Android resource information. Will be null when this class is built from transitive
+ * resources only, and will be a superset of primaryResources otherwise.
+ */
+ @Nullable private final ValidatedAndroidData validatedResources;
- @Nullable private final Artifact manifest; // The non-binary XML version of AndroidManifest.xml
+ private final AndroidResources primaryResources;
+ private final AndroidAssets primaryAssets;
+
+ private final Artifact manifest; // The non-binary XML version of AndroidManifest.xml
+ private final Artifact rTxt;
@Nullable private final Artifact resourceProguardConfig;
@Nullable private final Artifact mainDexProguardConfig;
@@ -57,21 +66,41 @@ public final class ResourceApk {
resourceDeps,
AssetDependencies.empty(),
resourceContainer,
+ resourceContainer.getAndroidResources(),
resourceContainer.getAndroidAssets(),
resourceContainer.getManifest(),
+ resourceContainer.getRTxt(),
resourceProguardConfig,
mainDexProguardConfig);
}
+ public static ResourceApk of(ValidatedAndroidResources resources, MergedAndroidAssets assets) {
+ return new ResourceApk(
+ resources.getApk(),
+ resources.getJavaSourceJar(),
+ resources.getJavaClassJar(),
+ resources.getResourceDependencies(),
+ assets.getAssetDependencies(),
+ resources,
+ resources,
+ assets,
+ resources.getManifest(),
+ resources.getRTxt(),
+ null,
+ null);
+ }
+
private ResourceApk(
@Nullable Artifact resourceApk,
@Nullable Artifact resourceJavaSrcJar,
@Nullable Artifact resourceJavaClassJar,
ResourceDependencies resourceDeps,
AssetDependencies assetDeps,
- @Nullable ResourceContainer primaryResources,
- @Nullable AndroidAssets primaryAssets,
- @Nullable Artifact manifest,
+ @Nullable ValidatedAndroidData validatedResources,
+ AndroidResources primaryResources,
+ AndroidAssets primaryAssets,
+ Artifact manifest,
+ Artifact rTxt,
@Nullable Artifact resourceProguardConfig,
@Nullable Artifact mainDexProguardConfig) {
this.resourceApk = resourceApk;
@@ -79,9 +108,11 @@ public final class ResourceApk {
this.resourceJavaClassJar = resourceJavaClassJar;
this.resourceDeps = resourceDeps;
this.assetDeps = assetDeps;
+ this.validatedResources = validatedResources;
this.primaryResources = primaryResources;
this.primaryAssets = primaryAssets;
this.manifest = manifest;
+ this.rTxt = rTxt;
this.resourceProguardConfig = resourceProguardConfig;
this.mainDexProguardConfig = mainDexProguardConfig;
}
@@ -93,9 +124,11 @@ public final class ResourceApk {
resourceJavaClassJar,
resourceDeps,
assetDeps,
+ validatedResources,
primaryResources,
primaryAssets,
manifest,
+ rTxt,
resourceProguardConfig,
mainDexProguardConfig);
}
@@ -104,14 +137,15 @@ public final class ResourceApk {
return resourceApk;
}
- public ResourceContainer getPrimaryResources() {
+ @Nullable
+ public ValidatedAndroidData getValidatedResources() {
+ return validatedResources;
+ }
+
+ public AndroidResources getPrimaryResources() {
return primaryResources;
}
- /**
- * TODO(b/77574966): Use MergedAndroidAssets rather than the base class once we have completely
- * decoupled assets and resources.
- */
public AndroidAssets getPrimaryAssets() {
return primaryAssets;
}
@@ -120,6 +154,10 @@ public final class ResourceApk {
return manifest;
}
+ public Artifact getRTxt() {
+ return rTxt;
+ }
+
public Artifact getResourceJavaSrcJar() {
return resourceJavaSrcJar;
}
@@ -128,9 +166,24 @@ public final class ResourceApk {
return resourceJavaClassJar;
}
- public static ResourceApk fromTransitiveResources(
- ResourceDependencies resourceDeps, AssetDependencies assetDeps) {
- return new ResourceApk(null, null, null, resourceDeps, assetDeps, null, null, null, null, null);
+ static ResourceApk fromTransitiveResources(
+ ResourceDependencies resourceDeps,
+ AssetDependencies assetDeps,
+ Artifact manifest,
+ Artifact rTxt) {
+ return new ResourceApk(
+ null,
+ null,
+ null,
+ resourceDeps,
+ assetDeps,
+ null,
+ AndroidResources.empty(),
+ AndroidAssets.empty(),
+ manifest,
+ rTxt,
+ null,
+ null);
}
public Artifact getResourceProguardConfig() {
@@ -160,10 +213,10 @@ public final class ResourceApk {
* and the rest will be transitive.
*/
private AndroidResourcesInfo toResourceInfo(Label label) {
- if (primaryResources == null) {
+ if (validatedResources == null) {
return resourceDeps.toInfo(label);
}
- return resourceDeps.toInfo(primaryResources);
+ return resourceDeps.toInfo(validatedResources);
}
public void addToConfiguredTargetBuilder(RuleConfiguredTargetBuilder builder, Label label) {
@@ -187,4 +240,32 @@ public final class ResourceApk {
builder.addSkylarkTransitiveInfo(
AndroidSkylarkApiProvider.NAME, new AndroidSkylarkApiProvider(resourceInfo));
}
+
+ /**
+ * Registers an action to process just the transitive resources and assets of a library.
+ *
+ * <p>Any local resources and assets will be ignored.
+ */
+ public static ResourceApk processFromTransitiveLibraryData(
+ RuleContext ruleContext,
+ ResourceDependencies resourceDeps,
+ AssetDependencies assetDeps,
+ StampedAndroidManifest manifest)
+ throws InterruptedException {
+
+ return new AndroidResourcesProcessorBuilder(ruleContext)
+ .setLibrary(true)
+ .setRTxtOut(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT))
+ .setManifestOut(
+ ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST))
+ .setSourceJarOut(
+ ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR))
+ .setJavaPackage(manifest.getPackage())
+ .withResourceDependencies(resourceDeps)
+ .withAssetDependencies(assetDeps)
+ .setDebug(ruleContext.getConfiguration().getCompilationMode() != CompilationMode.OPT)
+ .setThrowOnResourceConflict(
+ AndroidCommon.getAndroidConfig(ruleContext).throwOnResourceConflict())
+ .buildWithoutLocalResources(manifest);
+ }
}
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 6864d1ab68..70dfa8b3b8 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
@@ -38,7 +38,7 @@ public class ResourceShrinkerActionBuilder {
private Artifact resourceFilesZip;
private Artifact shrunkJar;
private Artifact proguardMapping;
- private ResourceContainer primaryResources;
+ private ValidatedAndroidData primaryResources;
private ResourceDependencies dependencyResources;
private Artifact resourceApkOut;
private Artifact shrunkResourcesOut;
@@ -91,10 +91,10 @@ public class ResourceShrinkerActionBuilder {
}
/**
- * @param primary The fully processed {@link ResourceContainer} of the resources to be shrunk.
+ * @param primary The fully processed {@link ValidatedAndroidData} of the resources to be shrunk.
* Must contain both an R.txt and merged manifest.
*/
- public ResourceShrinkerActionBuilder withPrimary(ResourceContainer primary) {
+ public ResourceShrinkerActionBuilder withPrimary(ValidatedAndroidData primary) {
checkNotNull(primary);
checkNotNull(primary.getManifest());
checkNotNull(primary.getRTxt());
@@ -245,7 +245,7 @@ public class ResourceShrinkerActionBuilder {
}
private ImmutableList<String> getResourcePackages(
- ResourceContainer primaryResources, ResourceDependencies resourceDependencies) {
+ ValidatedAndroidData primaryResources, ResourceDependencies resourceDependencies) {
ImmutableList.Builder<String> resourcePackages = ImmutableList.builder();
resourcePackages.add(primaryResources.getJavaPackage());
for (ValidatedAndroidData resources : resourceDependencies.getResourceContainers()) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/StampedAndroidManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/StampedAndroidManifest.java
index 9c11618ba6..69b93886a2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/StampedAndroidManifest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/StampedAndroidManifest.java
@@ -45,4 +45,11 @@ public class StampedAndroidManifest extends AndroidManifest {
ProcessedAndroidManifest withProcessedManifest(Artifact processedManifest) {
return new ProcessedAndroidManifest(processedManifest, getPackage(), isExported());
}
+
+ /** Creates an empty manifest stamped with the default Java package for this target. */
+ public static StampedAndroidManifest createEmpty(RuleContext ruleContext, boolean exported) {
+ String pkg = AndroidCommon.getJavaPackage(ruleContext);
+ return new StampedAndroidManifest(
+ ApplicationManifest.generateManifest(ruleContext, pkg), pkg, exported);
+ }
}