aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssets.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifest.java38
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidAssets.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java33
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java22
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);
}
}