diff options
author | asteinb <asteinb@google.com> | 2018-04-11 14:26:07 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-04-11 14:27:21 -0700 |
commit | e8243465731f5c407448e7b9d5686663f149b9da (patch) | |
tree | eca2f1d9bfa338b42c9a051522c35976477f5be3 | |
parent | 0fcad77c50290a66bdf3870eda7ec7656549c2eb (diff) |
Add skipped manifest processing methods
Add some required manifest support I didn't previously implement:
- Support for exports_manifest field
- Get properly processed manifest from AndroidSemantics
- Correctly represent the current relationship between manifest and resource
processing - resource processing uses the stamped manifest.
RELNOTES: none
PiperOrigin-RevId: 192508962
5 files changed, 101 insertions, 26 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifest.java index 1e11c75def..ad05739c90 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifest.java @@ -13,35 +13,56 @@ // limitations under the License. package com.google.devtools.build.lib.rules.android; +import com.google.common.annotations.VisibleForTesting; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.java.JavaUtil; +import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.vfs.PathFragment; +import java.util.Objects; import javax.annotation.Nullable; /** Wraps an Android Manifest and provides utilities for working with it */ @Immutable public class AndroidManifest { + private static final String CUSTOM_PACKAGE_ATTR = "custom_package"; private final Artifact manifest; /** The Android package. Will be null if and only if this is an aar_import target. */ @Nullable private final String pkg; + private final boolean exported; public static AndroidManifest forAarImport(RuleContext ruleContext, Artifact manifest) { - return new AndroidManifest(manifest, null); + return new AndroidManifest(manifest, /* pkg = */ null, /* exported = */ true); } - AndroidManifest(Artifact manifest, @Nullable String pkg) { + public static AndroidManifest from(RuleContext ruleContext, AndroidSemantics androidSemantics) + throws RuleErrorException, InterruptedException { + return new AndroidManifest( + androidSemantics.getManifestForRule(ruleContext).getManifest(), + getAndroidPackage(ruleContext), + AndroidCommon.getExportsManifest(ruleContext)); + } + + AndroidManifest(AndroidManifest other, Artifact manifest) { + this(manifest, other.pkg, other.exported); + } + + @VisibleForTesting + AndroidManifest(Artifact manifest, @Nullable String pkg, boolean exported) { this.manifest = manifest; this.pkg = pkg; + this.exported = exported; } /** If needed, stamps the manifest with the correct Java package */ public StampedAndroidManifest stamp(RuleContext ruleContext) { return new StampedAndroidManifest( ApplicationManifest.maybeSetManifestPackage(ruleContext, manifest, pkg).orElse(manifest), - pkg); + pkg, + exported); } Artifact getManifest() { @@ -53,8 +74,21 @@ public class AndroidManifest { return pkg; } + boolean isExported() { + return exported; + } + + /** Gets the Android package for this target, from either rule configuration or Java package */ + private static String getAndroidPackage(RuleContext ruleContext) { + if (ruleContext.attributes().isAttributeValueExplicitlySpecified(CUSTOM_PACKAGE_ATTR)) { + return ruleContext.attributes().get(CUSTOM_PACKAGE_ATTR, Type.STRING); + } + + return getDefaultPackage(ruleContext); + } + /** Gets the default Java package */ - static String getDefaultPackage(RuleContext ruleContext) { + private static String getDefaultPackage(RuleContext ruleContext) { PathFragment dummyJar = ruleContext.getPackageDirectory().getChild("Dummy.jar"); return getJavaPackageFromPath(ruleContext, dummyJar); } @@ -86,4 +120,24 @@ public class AndroidManifest { } return JavaUtil.getJavaPackageName(jarPathFragment); } + + @Override + public boolean equals(Object object) { + if (object == null || getClass() != object.getClass()) { + return false; + } + + AndroidManifest other = (AndroidManifest) object; + + return manifest.equals(other.manifest) + && Objects.equals(pkg, other.pkg) + && exported == other.exported; + } + + @Override + public int hashCode() { + // Hash the current class with the other fields to distinguish between this AndroidManifest and + // classes that extend it. + return Objects.hash(manifest, pkg, exported, getClass()); + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java index c890627b71..842e20cc7e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java @@ -190,12 +190,19 @@ public class AndroidResourceParsingActionBuilder { * Builds and registers the action, and returns a copy of the passed resources with artifacts for * parsed and compiled information. */ - public ParsedAndroidResources build(AndroidResources androidResources) { + public ParsedAndroidResources build( + AndroidResources androidResources, StampedAndroidManifest manifest) { + if (dataBindingInfoZip != null) { + // Manifest information is needed for data binding + setManifest(manifest.getManifest()); + setJavaPackage(manifest.getPackage()); + } + setResources(androidResources); build(ruleContext); return ParsedAndroidResources.of( - androidResources, output, compiledSymbols, ruleContext.getLabel()); + androidResources, output, compiledSymbols, ruleContext.getLabel(), manifest); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java index fc0af30386..21a4a4ba25 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java @@ -26,6 +26,7 @@ public class ParsedAndroidResources extends AndroidResources { private final Artifact symbols; @Nullable private final Artifact compiledSymbols; private final Label label; + private final StampedAndroidManifest manifest; public static ParsedAndroidResources parseFrom( RuleContext ruleContext, AndroidResources resources, StampedAndroidManifest manifest) @@ -41,10 +42,7 @@ public class ParsedAndroidResources extends AndroidResources { // TODO(corysmith): Centralize the data binding processing and zipping into a single // action. Data binding processing needs to be triggered here as well as the merger to // avoid aapt2 from throwing an error during compilation. - builder - .setDataBindingInfoZip(DataBinding.getSuffixedInfoFile(ruleContext, "_unused")) - .setManifest(manifest.getManifest()) - .setJavaPackage(manifest.getPackage()); + builder.setDataBindingInfoZip(DataBinding.getSuffixedInfoFile(ruleContext, "_unused")); } return builder @@ -53,34 +51,33 @@ public class ParsedAndroidResources extends AndroidResources { isAapt2 ? ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_COMPILED_SYMBOLS) : null) - .build(resources); + .build(resources, manifest); } public static ParsedAndroidResources of( AndroidResources resources, Artifact symbols, @Nullable Artifact compiledSymbols, - Label label) { - return new ParsedAndroidResources( - resources, - symbols, - compiledSymbols, - label); + Label label, + StampedAndroidManifest manifest) { + return new ParsedAndroidResources(resources, symbols, compiledSymbols, label, manifest); } - ParsedAndroidResources(ParsedAndroidResources other) { - this(other, other.symbols, other.compiledSymbols, other.label); + ParsedAndroidResources(ParsedAndroidResources other, StampedAndroidManifest manifest) { + this(other, other.symbols, other.compiledSymbols, other.label, manifest); } private ParsedAndroidResources( AndroidResources resources, Artifact symbols, @Nullable Artifact compiledSymbols, - Label label) { + Label label, + StampedAndroidManifest manifest) { super(resources); this.symbols = symbols; this.compiledSymbols = compiledSymbols; this.label = label; + this.manifest = manifest; } public Artifact getSymbols() { @@ -92,6 +89,10 @@ public class ParsedAndroidResources extends AndroidResources { return compiledSymbols; } + public Artifact getManifest() { + return manifest.getManifest(); + } + public Label getLabel() { return label; } @@ -105,11 +106,12 @@ public class ParsedAndroidResources extends AndroidResources { ParsedAndroidResources other = (ParsedAndroidResources) object; return symbols.equals(other.symbols) && Objects.equals(compiledSymbols, other.compiledSymbols) - && label.equals(other.label); + && label.equals(other.label) + && manifest.equals(other.manifest); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), symbols, compiledSymbols, label); + return Objects.hash(super.hashCode(), symbols, compiledSymbols, label, manifest); } } 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 2314406390..49250db50b 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 @@ -16,13 +16,14 @@ 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.concurrent.ThreadSafety.Immutable; +import javax.annotation.Nullable; /** An {@link AndroidManifest} stamped with the correct package. */ @Immutable public class StampedAndroidManifest extends AndroidManifest { - StampedAndroidManifest(Artifact manifest, String pkg) { - super(manifest, pkg); + StampedAndroidManifest(Artifact manifest, @Nullable String pkg, boolean exported) { + super(manifest, pkg, exported); } @Override @@ -30,4 +31,14 @@ public class StampedAndroidManifest extends AndroidManifest { // This manifest is already stamped return this; } + + /** + * Gets the manifest artifact wrapped by this object. + * + * <p>The manifest is guaranteed to be stamped with the correct Android package. + */ + @Override + Artifact getManifest() { + return super.getManifest(); + } } diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java index cf25120a8e..85d7e254b7 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java @@ -243,7 +243,7 @@ public class AndroidResourcesTest extends ResourceTestBase { ruleContext, /* inputs = */ ImmutableList.<Artifact>builder() .addAll(parsed.getResources()) - .add(getManifest()) + .add(parsed.getManifest()) .build(), /* outputs = */ ImmutableList.of( parsed.getCompiledSymbols(), DataBinding.getSuffixedInfoFile(ruleContext, "_unused"))); @@ -291,7 +291,8 @@ public class AndroidResourcesTest extends ResourceTestBase { new AndroidResources( resources, AndroidResources.getResourceRoots(ruleContext, resources, "resource_files")); StampedAndroidManifest manifest = - new StampedAndroidManifest(getManifest(), "some.java.pkg"); + new AndroidManifest(getManifest(), "some.java.pkg", /* exported = */ true) + .stamp(ruleContext); ParsedAndroidResources parsed = raw.parse(ruleContext, manifest); |