diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
13 files changed, 92 insertions, 51 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java index 056bc8a537..2293f2abbd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java @@ -105,7 +105,7 @@ public class AarImport implements RuleConfiguredTargetFactory { MergedAndroidAssets mergedAssets = AndroidAssets.forAarImport(assets).process(ruleContext, neverlink); - resourceApk = ResourceApk.of(validatedResources, mergedAssets); + resourceApk = ResourceApk.of(validatedResources, mergedAssets, null, null); } else { ApplicationManifest androidManifest = ApplicationManifest.fromExplicitManifest(ruleContext, androidManifestArtifact); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssets.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssets.java index a20b818cc1..fc112ae174 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssets.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssets.java @@ -99,7 +99,7 @@ public class AndroidAssets { ImmutableList.of(assetsDir), ImmutableList.of(assetsDir.getExecPath().getChild("assets"))); } - static AndroidAssets empty() { + public static AndroidAssets empty() { return new AndroidAssets(ImmutableList.of(), ImmutableList.of()); } 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 df7601b51a..f2fd46f9f2 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 @@ -161,7 +161,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { MergedAndroidAssets assets = AndroidAssets.from(ruleContext).process(ruleContext, isNeverLink); - resourceApk = ResourceApk.of(resources, assets); + resourceApk = ResourceApk.of(resources, assets, null, null); } else { ApplicationManifest applicationManifest = androidSemantics 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 6f324cd2b2..05a9cc32e1 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 @@ -125,9 +125,10 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor : null, null, /* featureOfArtifact */ null /* featureAfterArtifact */); - attributesBuilder.addRuntimeClassPathEntry(resourceApk.getResourceJavaClassJar()); } + attributesBuilder.addRuntimeClassPathEntry(resourceApk.getResourceJavaClassJar()); + // Exclude the Rs from the library from the runtime classpath. NestedSet<Artifact> excludedRuntimeArtifacts = getLibraryResourceJars(ruleContext); attributesBuilder.addExcludedArtifacts(excludedRuntimeArtifacts); 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 12dae484b6..02b741dd1d 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 @@ -78,19 +78,39 @@ public class AndroidManifest { } /** + * Stamps the manifest with values from the "manifest_values" attributes. + * + * <p>If no manifest values are specified, the manifest will remain unstamped. + */ + public StampedAndroidManifest stampWithManifestValues(RuleContext ruleContext) { + return mergeWithDeps(ruleContext, ResourceDependencies.empty()); + } + + /** * Merges the manifest with any dependent manifests. * - * <p>The resulting manifest will be stamped, even if no merging was done. + * <p>The manifest will also be stamped with any manifest values specified in the target's + * attributes + * + * <p>If there is no merging to be done and no manifest values are specified, the manifest will + * remain unstamped. */ public StampedAndroidManifest mergeWithDeps(RuleContext ruleContext) { - return ApplicationManifest.maybeMergeWith( - ruleContext, - manifest, - ResourceDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false), - ApplicationManifest.getManifestValues(ruleContext)) - .map(merged -> new StampedAndroidManifest(merged, pkg, exported)) - // If we don't merge, we still need to guarantee the manifest is stamped correctly - .orElseGet(() -> stamp(ruleContext)); + return mergeWithDeps( + ruleContext, ResourceDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false)); + } + + private StampedAndroidManifest mergeWithDeps( + RuleContext ruleContext, ResourceDependencies resourceDeps) { + Artifact newManifest = + ApplicationManifest.maybeMergeWith( + ruleContext, + manifest, + resourceDeps, + ApplicationManifest.getManifestValues(ruleContext)) + .orElse(manifest); + + return new StampedAndroidManifest(newManifest, pkg, exported); } public Artifact getManifest() { 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 93a20a2b55..a93740d3b1 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 @@ -63,8 +63,8 @@ public class AndroidResourcesProcessorBuilder { .withSeparator(ToArg.SeparatorType.COLON_COMMA) .toArgConverter(); - private ResourceDependencies resourceDependencies; - private AssetDependencies assetDependencies; + private ResourceDependencies resourceDependencies = ResourceDependencies.empty(); + private AssetDependencies assetDependencies = AssetDependencies.empty(); private Artifact proguardOut; private Artifact mainDexProguardOut; @@ -305,7 +305,9 @@ public class AndroidResourcesProcessorBuilder { sourceJarOut, apkOut, dataBindingInfoZip, - resourceDependencies); + resourceDependencies, + proguardOut, + mainDexProguardOut); } public AndroidResourcesProcessorBuilder setJavaPackage(String customJavaPackage) { 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 608d56be38..6890108769 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 @@ -46,7 +46,6 @@ public class MergedAndroidAssets extends ParsedAndroidAssets { builder .addOutput("--assetsOutput", mergedAssets) - .addInput("--androidJar", AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar()) .addInput( "--primaryData", AndroidDataConverter.MERGABLE_DATA_CONVERTER.map(parsed), diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java index 717159a143..07c274ac81 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java @@ -39,12 +39,12 @@ public class MergedAndroidResources extends ParsedAndroidResources { public static MergedAndroidResources mergeFrom( RuleContext ruleContext, ParsedAndroidResources parsed, boolean neverlink) - throws InterruptedException { + throws InterruptedException, RuleErrorException { AndroidConfiguration androidConfiguration = AndroidCommon.getAndroidConfig(ruleContext); boolean useCompiledMerge = - androidConfiguration.getAndroidAaptVersion().equals(AndroidAaptVersion.AAPT2) + AndroidAaptVersion.chooseTargetAaptVersion(ruleContext) == AndroidAaptVersion.AAPT2 && androidConfiguration.skipParsingAction(); Preconditions.checkState( @@ -141,7 +141,8 @@ public class MergedAndroidResources extends ParsedAndroidResources { * <p>See {@link ValidatedAndroidResources#validateFrom(RuleContext, MergedAndroidResources)}. * This method is a convenience method for calling that one. */ - public ValidatedAndroidResources validate(RuleContext ruleContext) throws InterruptedException { + public ValidatedAndroidResources validate(RuleContext ruleContext) + throws InterruptedException, RuleErrorException { return ValidatedAndroidResources.validateFrom(ruleContext, this); } 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 d5f73af10d..44b08e07ae 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 @@ -36,7 +36,7 @@ public class ParsedAndroidResources extends AndroidResources throws RuleErrorException, InterruptedException { boolean isAapt2 = - AndroidAaptVersion.chooseTargetAaptVersion(ruleContext).equals(AndroidAaptVersion.AAPT2); + AndroidAaptVersion.chooseTargetAaptVersion(ruleContext) == AndroidAaptVersion.AAPT2; AndroidResourceParsingActionBuilder builder = new AndroidResourceParsingActionBuilder(ruleContext); @@ -124,7 +124,7 @@ public class ParsedAndroidResources extends AndroidResources /** Merges this target's resources with resources from dependencies. */ public MergedAndroidResources merge(RuleContext ruleContext, boolean neverlink) - throws InterruptedException { + throws InterruptedException, RuleErrorException { return MergedAndroidResources.mergeFrom(ruleContext, this, neverlink); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java b/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java index 637afabf25..8a0d0e66ab 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java @@ -16,6 +16,7 @@ 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.analysis.config.CompilationMode; +import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; import com.google.devtools.build.lib.rules.java.ProguardHelper; @@ -46,6 +47,8 @@ public class ProcessedAndroidData { private final Artifact apk; @Nullable private final Artifact dataBindingInfoZip; private final ResourceDependencies resourceDeps; + @Nullable private final Artifact resourceProguardConfig; + @Nullable private final Artifact mainDexProguardConfig; /** Processes Android data (assets, resources, and manifest) for android_binary targets. */ public static ProcessedAndroidData processBinaryDataFrom( @@ -72,6 +75,18 @@ public class ProcessedAndroidData { .setDataBindingInfoZip( DataBinding.isEnabled(ruleContext) ? DataBinding.getLayoutInfoFile(ruleContext) + : null) + .setFeatureOf( + ruleContext.attributes().isAttributeValueExplicitlySpecified("feature_of") + ? ruleContext + .getPrerequisite("feature_of", Mode.TARGET, ApkInfo.PROVIDER) + .getApk() + : null) + .setFeatureAfter( + ruleContext.attributes().isAttributeValueExplicitlySpecified("feature_after") + ? ruleContext + .getPrerequisite("feature_after", Mode.TARGET, ApkInfo.PROVIDER) + .getApk() : null); return buildActionForBinary(ruleContext, builder, manifest); } @@ -185,7 +200,8 @@ public class ProcessedAndroidData { .setApkOut(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK)) .setRTxtOut(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT)) .setSourceJarOut( - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR)); + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR)) + .setSymbols(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_MERGED_SYMBOLS)); } /** @@ -219,9 +235,12 @@ public class ProcessedAndroidData { Artifact sourceJar, Artifact apk, @Nullable Artifact dataBindingInfoZip, - ResourceDependencies resourceDeps) { + ResourceDependencies resourceDeps, + @Nullable Artifact resourceProguardConfig, + @Nullable Artifact mainDexProguardConfig) { return new ProcessedAndroidData( - resources, assets, manifest, rTxt, sourceJar, apk, dataBindingInfoZip, resourceDeps); + resources, assets, manifest, rTxt, sourceJar, apk, dataBindingInfoZip, resourceDeps, + resourceProguardConfig, mainDexProguardConfig); } private ProcessedAndroidData( @@ -232,7 +251,9 @@ public class ProcessedAndroidData { Artifact sourceJar, Artifact apk, @Nullable Artifact dataBindingInfoZip, - ResourceDependencies resourceDeps) { + ResourceDependencies resourceDeps, + @Nullable Artifact resourceProguardConfig, + @Nullable Artifact mainDexProguardConfig) { this.resources = resources; this.assets = assets; this.manifest = manifest; @@ -241,6 +262,8 @@ public class ProcessedAndroidData { this.apk = apk; this.dataBindingInfoZip = dataBindingInfoZip; this.resourceDeps = resourceDeps; + this.resourceProguardConfig = resourceProguardConfig; + this.mainDexProguardConfig = mainDexProguardConfig; } /** @@ -278,7 +301,7 @@ public class ProcessedAndroidData { // Combined resource processing does not produce aapt2 artifacts; they're nulled out ValidatedAndroidResources validated = ValidatedAndroidResources.of(merged, rTxt, sourceJar, apk, null, null, null); - return ResourceApk.of(validated, assets); + return ResourceApk.of(validated, assets, resourceProguardConfig, mainDexProguardConfig); } public MergedAndroidAssets getAssets() { 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 9466e5fd01..96115475d9 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 @@ -74,7 +74,11 @@ public final class ResourceApk { mainDexProguardConfig); } - public static ResourceApk of(ValidatedAndroidResources resources, MergedAndroidAssets assets) { + public static ResourceApk of( + ValidatedAndroidResources resources, + MergedAndroidAssets assets, + @Nullable Artifact resourceProguardConfig, + @Nullable Artifact mainDexProguardConfig) { return new ResourceApk( resources.getApk(), resources.getJavaSourceJar(), @@ -86,8 +90,8 @@ public final class ResourceApk { assets, resources.getManifest(), resources.getRTxt(), - null, - null); + resourceProguardConfig, + mainDexProguardConfig); } private ResourceApk( @@ -239,9 +243,12 @@ public final class ResourceApk { AndroidAssetsInfo assetsInfo = merged.toProvider(); builder.addNativeDeclaredProvider(assetsInfo); - // Asset merging output isn't consumed by anything. Require it to be run by top-level targets - // so we can validate there are no asset merging conflicts. - builder.addOutputGroup(OutputGroupInfo.HIDDEN_TOP_LEVEL, assetsInfo.getValidationResult()); + if (assetsInfo.getValidationResult() != null) { + // Asset merging output isn't consumed by anything. Require it to be run by top-level + // targets + // so we can validate there are no asset merging conflicts. + builder.addOutputGroup(OutputGroupInfo.HIDDEN_TOP_LEVEL, assetsInfo.getValidationResult()); + } } else if (primaryAssets == null) { builder.addNativeDeclaredProvider(assetDeps.toInfo(label)); 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 index 90573075f4..035d77e856 100644 --- 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 @@ -89,7 +89,7 @@ public abstract class ResourceContainer implements ValidatedAndroidData { return getAndroidAssets().getAssets(); } - abstract AndroidAssets getAndroidAssets(); + public abstract AndroidAssets getAndroidAssets(); @Override public ImmutableList<Artifact> getResources() { diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java index c6158b5d43..528c53fd35 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java @@ -55,8 +55,8 @@ public class ValidatedAndroidResources extends MergedAndroidResources * </ul> */ public static ValidatedAndroidResources validateFrom( - RuleContext ruleContext, MergedAndroidResources merged) throws InterruptedException { - AndroidConfiguration config = AndroidCommon.getAndroidConfig(ruleContext); + RuleContext ruleContext, MergedAndroidResources merged) + throws InterruptedException, RuleErrorException { AndroidResourceValidatorActionBuilder builder = new AndroidResourceValidatorActionBuilder(ruleContext) .setJavaPackage(merged.getJavaPackage()) @@ -72,7 +72,7 @@ public class ValidatedAndroidResources extends MergedAndroidResources ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_APK)) .withDependencies(merged.getResourceDependencies()); - if (config.getAndroidAaptVersion() == AndroidAaptVersion.AAPT2) { + if (AndroidAaptVersion.chooseTargetAaptVersion(ruleContext) == AndroidAaptVersion.AAPT2) { builder .setCompiledSymbols(merged.getCompiledSymbols()) .setAapt2RTxtOut( @@ -169,13 +169,7 @@ public class ValidatedAndroidResources extends MergedAndroidResources .map( merged -> ValidatedAndroidResources.of( - merged, - rTxt, - sourceJar, - apk, - aapt2RTxt, - aapt2SourceJar, - staticLibrary)); + merged, rTxt, sourceJar, apk, aapt2RTxt, aapt2SourceJar, staticLibrary)); } @Override @@ -196,12 +190,6 @@ public class ValidatedAndroidResources extends MergedAndroidResources @Override public int hashCode() { return Objects.hash( - super.hashCode(), - rTxt, - sourceJar, - apk, - aapt2RTxt, - aapt2SourceJar, - staticLibrary); + super.hashCode(), rTxt, sourceJar, apk, aapt2RTxt, aapt2SourceJar, staticLibrary); } } |