diff options
author | 2017-08-29 22:15:32 +0200 | |
---|---|---|
committer | 2017-08-30 13:48:16 +0200 | |
commit | 32b85516fc3ad554ec3a54d3e9cf0ee66b81127c (patch) | |
tree | a4c0a56c6c3d4e6cc52529bf9a5e9b77ac83ec4a | |
parent | 2f9e7460914672cfde46ed93059802190ae1a159 (diff) |
Save density information to manifests when filtering resources in analysis
Previously, when filtering in analysis, density information was not passed to
execution to avoid wasting time on re-filtering. However, that density
information was also used to add information to the manifest. Add an additional
flag to save density information to the manifest without triggering resource
filtering in execution, and use it when filtering in analysis.
RELNOTES: None
PiperOrigin-RevId: 166891827
3 files changed, 39 insertions, 7 deletions
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 5492df07ec..9f0b04bc0a 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 @@ -453,8 +453,14 @@ public class AndroidResourcesProcessorBuilder { if (resourceFilter.shouldPropagateConfigs(ruleContext)) { builder.add("--resourceConfigs", resourceFilter.getConfigurationFilterString()); } - if (resourceFilter.hasDensities() && !resourceFilter.isPrefiltering()) { - builder.add("--densities", resourceFilter.getDensityString()); + if (resourceFilter.hasDensities()) { + // If we did not filter by density in analysis, filter in execution. Otherwise, don't filter + // in execution, but still pass the densities so they can be added to the manifest. + if (resourceFilter.isPrefiltering()) { + builder.add("--densitiesForManifest", resourceFilter.getDensityString()); + } else { + builder.add("--densities", resourceFilter.getDensityString()); + } } ImmutableList<String> filteredResources = resourceFilter.getResourcesToIgnoreInExecution(); if (!filteredResources.isEmpty()) { diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java index 2c67d4faea..b42be3be4d 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java @@ -1261,7 +1261,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { @Test public void testDensityFilteredResourcesMultipleDensities() throws Exception { testDensityResourceFiltering( - "ldpi,hdpi', 'xhdpi", + "hdpi,ldpi,xhdpi", ImmutableList.of("mdpi", "xxhdpi"), ImmutableList.of("ldpi", "hdpi", "xhdpi")); } @@ -1335,7 +1335,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { public void testQualifierAndDensityFilteredResources() throws Exception { testDirectResourceFiltering( "en,fr-mdpi", - "ldpi,hdpi", + "hdpi,ldpi", ImmutableList.of("mdpi", "es-ldpi", "en-xxxhdpi", "fr-mdpi"), ImmutableList.of("ldpi", "hdpi", "en-xhdpi", "fr-hdpi"), /* expectUnqualifiedResource= */ false, @@ -1446,9 +1446,16 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { } // Validate resource filters are not passed to execution, since they were applied in analysis - assertThat(resourceArguments(directResources)) + List<String> args = resourceArguments(directResources); + assertThat(args) .doesNotContain(ResourceFilter.RESOURCE_CONFIGURATION_FILTERS_NAME); - assertThat(resourceArguments(directResources)).doesNotContain(ResourceFilter.DENSITIES_NAME); + assertThat(args).doesNotContain(ResourceFilter.DENSITIES_NAME); + if (densities.isEmpty()) { + assertThat(args).doesNotContain("--densitiesForManifest"); + } else { + // We still expect densities only for the purposes of adding information to manifests + assertThat(args).containsAllOf("--densitiesForManifest", densities); + } } @Test diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessingAction.java b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessingAction.java index cfee8a88e0..851829005c 100644 --- a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessingAction.java +++ b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessingAction.java @@ -247,6 +247,21 @@ public class AndroidResourceProcessingAction { public List<String> densities; @Option( + name = "densitiesForManifest", + defaultValue = "", + converter = CommaSeparatedOptionListConverter.class, + category = "config", + documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, + effectTags = {OptionEffectTag.UNKNOWN}, + help = + "Densities to specify in the manifest. If 'densities' is specified, that value will be" + + " used instead and this flag will be ignored. However, if resources were filtered" + + " in analysis, this flag can be used to specify densities in the manifest without" + + " repeating the filtering process." + ) + public List<String> densitiesForManifest; + + @Option( name = "packageForR", defaultValue = "null", category = "config", @@ -366,12 +381,16 @@ public class AndroidResourceProcessingAction { options.prefilteredResources.isEmpty() ? options.densities : Collections.<String>emptyList(); + final List<String> densitiesForManifest = + densitiesToFilter.isEmpty() + ? options.densitiesForManifest + : densitiesToFilter; final DensityFilteredAndroidData filteredData = mergedData.filter( new DensitySpecificResourceFilter( densitiesToFilter, filteredResources, mergedResources), - new DensitySpecificManifestProcessor(options.densities, densityManifest)); + new DensitySpecificManifestProcessor(densitiesForManifest, densityManifest)); logger.fine( String.format( |