aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java10
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/ResourceFilterTest.java11
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/AndroidDataDeserializer.java2
3 files changed, 21 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java
index 52f155a3f6..14624286de 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java
@@ -33,6 +33,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.RuleErrorConsumer;
import com.google.devtools.build.lib.syntax.Type;
+import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.common.options.EnumConverter;
import com.google.devtools.common.options.OptionsParsingException;
import java.util.ArrayList;
@@ -501,8 +502,15 @@ public class ResourceFilter {
// We want to find a single best artifact for each combination of non-density qualifiers and
// filename. Combine those two values to create a single unique key.
+ // We also need to include the path to the resource, otherwise resource conflicts (multiple
+ // resources with the same name but different locations) might accidentally get resolved here
+ // (possibly incorrectly). Resource conflicts should be resolve during merging in execution
+ // instead.
config.setDensityQualifier(null);
- String nameAndConfiguration = config.getUniqueKey() + "/" + artifact.getFilename();
+ Path qualifierDir = artifact.getPath().getParentDirectory();
+ String resourceDir = qualifierDir.getParentDirectory().toString();
+ String nameAndConfiguration =
+ Joiner.on('/').join(resourceDir, config.getUniqueKey(), artifact.getFilename());
Artifact currentBest = nameAndConfigurationToBestArtifact.get(nameAndConfiguration);
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/ResourceFilterTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/ResourceFilterTest.java
index 65f6d2e30d..e2d7b9f6f2 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/ResourceFilterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/ResourceFilterTest.java
@@ -350,6 +350,17 @@ public class ResourceFilterTest extends ResourceTestBase {
}
@Test
+ public void testFilterResourceConflict() throws Exception {
+ testNoopFilter(
+ "en",
+ "hdpi",
+ FilterBehavior.FILTER_IN_ANALYSIS,
+ ImmutableList.of(
+ "first-subdir/res/drawable-en-hdpi/foo.png",
+ "second-subdir/res/drawable-en-hdpi/foo.png"));
+ }
+
+ @Test
public void testFilterWithDynamicConfiguration() throws Exception {
testFilter(
"en",
diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidDataDeserializer.java b/src/tools/android/java/com/google/devtools/build/android/AndroidDataDeserializer.java
index 94a35dd175..f48a7966c6 100644
--- a/src/tools/android/java/com/google/devtools/build/android/AndroidDataDeserializer.java
+++ b/src/tools/android/java/com/google/devtools/build/android/AndroidDataDeserializer.java
@@ -153,7 +153,7 @@ public class AndroidDataDeserializer {
// Using Path.subpath would return a backslash-using path on Windows.
String shortPath =
source.getPath().getParent().getFileName() + "/" + source.getPath().getFileName();
- if (filteredResources.contains(shortPath)) {
+ if (filteredResources.contains(shortPath) && !Files.exists(source.getPath())) {
// Skip files that were filtered out during analysis.
// TODO(asteinb): Properly filter out these files from android_library symbol files during
// analysis instead, and remove this list.