aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-08-29 22:15:32 +0200
committerGravatar Vladimir Moskva <vladmos@google.com>2017-08-30 13:48:16 +0200
commit32b85516fc3ad554ec3a54d3e9cf0ee66b81127c (patch)
treea4c0a56c6c3d4e6cc52529bf9a5e9b77ac83ec4a
parent2f9e7460914672cfde46ed93059802190ae1a159 (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
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java10
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java15
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessingAction.java21
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(