Added `resource_configuration_filters` and `densities` attributes to android_local_test so we can test with pseudo locales. Rule changes will follow this, see unknown commit. BEGIN_PUBLIC Added `resource_configuration_filters` and `densities` attributes to android_local_test so we can test with pseudo locales. END_PUBLIC PiperOrigin-RevId: 301262845
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 b8442bd..c9d6579 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
@@ -113,7 +113,8 @@ ResourceDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false), AssetDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false), StampedAndroidManifest.getManifestValues(ruleContext), - ruleContext.getExpander().withDataExecLocations().tokenized("nocompress_extensions")); + ruleContext.getExpander().withDataExecLocations().tokenized("nocompress_extensions"), + ResourceFilterFactory.fromRuleContextAndAttrs(ruleContext)); attributesBuilder.addRuntimeClassPathEntry(resourceApk.getResourceJavaClassJar()); @@ -490,7 +491,8 @@ ResourceDependencies resourceDeps, AssetDependencies assetDeps, Map<String, String> manifestValues, - List<String> noCompressExtensions) + List<String> noCompressExtensions, + ResourceFilterFactory resourceFilterFactory) throws InterruptedException { StampedAndroidManifest stamped = @@ -511,7 +513,8 @@ assets, resourceDeps, assetDeps, - noCompressExtensions) + noCompressExtensions, + resourceFilterFactory) .generateRClass(dataContext); }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java index ea2fea5..2931c9f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java
@@ -141,6 +141,17 @@ A list of file extensions to leave uncompressed in the resource apk. <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ .add(attr("nocompress_extensions", STRING_LIST)) + /* <!-- #BLAZE_RULE($android_local_test_base).ATTRIBUTE(resource_configuration_filters) --> + A list of resource configuration filters, such as 'en' that will limit the resources in the + apk to only the ones in the 'en' configuration. + <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ + .add(attr("resource_configuration_filters", STRING_LIST)) + /* <!-- #BLAZE_RULE($android_local_test_base).ATTRIBUTE(densities) --> + Densities to filter for when building the apk. A corresponding compatible-screens + section will also be added to the manifest if it does not already contain a + superset SkylarkListing. + <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ + .add(attr("densities", STRING_LIST)) .build(); }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java index 1168eaa..da2bfa5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java
@@ -298,7 +298,9 @@ String aaptVersionString, Dict<?, ?> manifestValues, // <String, String> Sequence<?> deps, // <ConfiguredTarget> - Sequence<?> noCompressExtensions) // <String> + Sequence<?> noCompressExtensions, // <String> + Sequence<?> resourceConfigurationFilters, // <String> + Sequence<?> densities) // <String>) throws InterruptedException, EvalException { SkylarkErrorReporter errorReporter = SkylarkErrorReporter.from(ctx.getRuleErrorConsumer()); List<ConfiguredTarget> depsTargets = deps.getContents(ConfiguredTarget.class, "deps"); @@ -335,7 +337,11 @@ AssetDependencies.fromProviders( getProviders(depsTargets, AndroidAssetsInfo.PROVIDER), /* neverlink = */ false), manifestValues.getContents(String.class, String.class, "manifest_values"), - noCompressExtensions.getContents(String.class, "nocompress_extensions")); + noCompressExtensions.getContents(String.class, "nocompress_extensions"), + ResourceFilterFactory.from( + resourceConfigurationFilters.getContents( + String.class, "resource_configuration_filters"), + densities.getContents(String.class, "densities"))); ImmutableMap.Builder<Provider, NativeInfo> builder = ImmutableMap.builder(); builder.putAll(getNativeInfosFrom(resourceApk, ctx.getLabel()));
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 d60d068..a1164c7 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
@@ -164,7 +164,8 @@ AndroidAssets assets, ResourceDependencies resourceDeps, AssetDependencies assetDeps, - List<String> noCompressExtensions) + List<String> noCompressExtensions, + ResourceFilterFactory resourceFilterFactory) throws InterruptedException { return builderForNonIncrementalTopLevelTarget(dataContext, manifest, manifestValues) @@ -176,6 +177,7 @@ .withResourceDependencies(resourceDeps) .withAssetDependencies(assetDeps) .setUncompressedExtensions(noCompressExtensions) + .setResourceFilterFactory(resourceFilterFactory) .build(dataContext, resources, assets, manifest, dataBindingContext); }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java index be67ec0..5da316c 100644 --- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java
@@ -613,7 +613,28 @@ type = Sequence.class, generic1 = String.class, named = true, - doc = "A list of file extensions to leave uncompressed in the resource apk.") + doc = "A list of file extensions to leave uncompressed in the resource apk."), + @Param( + name = "resource_configuration_filters", + positional = false, + defaultValue = "[]", + type = Sequence.class, + generic1 = String.class, + named = true, + doc = + "A list of resource configuration filters, such as 'en' that will limit the" + + " resources in the apk to only the ones in the 'en' configuration."), + @Param( + name = "densities", + positional = false, + defaultValue = "[]", + type = Sequence.class, + generic1 = String.class, + named = true, + doc = + "Densities to filter for when building the apk. A corresponding compatible-screens" + + " section will also be added to the manifest if it does not already contain a" + + " superset listing."), }, doc = "Processes resources, assets, and manifests for android_local_test and returns a dict" @@ -629,7 +650,9 @@ String aaptVersionString, Dict<?, ?> manifestValues, // <String, String> Sequence<?> deps, // <TransitiveInfoCollectionT> - Sequence<?> noCompressExtensions) // <String> + Sequence<?> noCompressExtensions, // <String> + Sequence<?> resourceConfigurationFilters, // <String> + Sequence<?> densities) // <String> throws InterruptedException, EvalException; @SkylarkCallable( @@ -659,7 +682,7 @@ generic1 = String.class, named = true, doc = - "A list of resource configuration filters, such 'en' that will limit the" + "A list of resource configuration filters, such as 'en' that will limit the" + " resources in the apk to only the ones in the 'en' configuration."), @Param( name = "densities", @@ -671,7 +694,7 @@ doc = "Densities to filter for when building the apk. A corresponding compatible-screens" + " section will also be added to the manifest if it does not already contain a" - + " superset SkylarkListing."), + + " superset listing."), @Param( name = "nocompress_extensions", positional = false,
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestTest.java index d759819..6998282 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestTest.java
@@ -15,13 +15,15 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.getFirstArtifactEndingWith; -import static com.google.devtools.build.lib.rules.android.AndroidBuildViewTestCase.getValidatedResources; import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.util.ActionsTestUtil; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; +import com.google.devtools.build.lib.analysis.actions.SpawnAction; +import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.rules.java.JavaPrimaryClassProvider; import com.google.devtools.build.lib.testutil.MoreAsserts; @@ -249,6 +251,32 @@ .inOrder(); } + @Test + public void testResourceConfigurationFilters() throws Exception { + scratch.file( + "java/test/BUILD", + "load('//java/bar:foo.bzl', 'extra_deps')", + "android_local_test(name = 'dummyTest',", + " srcs = ['test.java'],", + " deps = extra_deps,", + " resource_configuration_filters = ['ar_XB'])"); + + ConfiguredTarget binary = getConfiguredTarget("//java/test:dummyTest"); + final ImmutableList<ActionAnalysisMetadata> actions = + ((RuleConfiguredTarget) binary).getActions(); + + ActionAnalysisMetadata aaptAction = null; + for (ActionAnalysisMetadata action : actions) { + if (action.getMnemonic().equals("AndroidAapt2")) { + aaptAction = action; + } + } + assertThat(aaptAction).isNotNull(); + final List<String> aaptArguments = ((SpawnAction) aaptAction).getArguments(); + assertThat(aaptArguments).contains("--resourceConfigs"); + assertThat(aaptArguments).contains("ar_XB"); + } + @Override protected String getRuleName() { return "android_local_test";