aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-12-02 20:28:19 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-12-05 10:19:59 +0000
commitf0826ed6e35ce6a9e4a980844f9899ba40df25ef (patch)
tree248fd147924c30dea912e1858d262504adb8c35c /src/main/java/com/google/devtools/build/lib/rules
parent8a0893f3a4c47e779ec9754abb2a6b6a2b591fa4 (diff)
Fix bug with java_import desugaring and incremental dexing for Android when
multiple jars have the same simple filename (e.g., l.jar) -- PiperOrigin-RevId: 140880491 MOS_MIGRATED_REVID=140880491
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/DexArchiveAspect.java30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
index a4d896034a..9904c6618e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
@@ -56,6 +56,7 @@ import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaCompilationInfoProvider;
import com.google.devtools.build.lib.rules.java.JavaRuntimeJarProvider;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
@@ -157,6 +158,7 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
.addTransitiveProviders(collectPrerequisites(ruleContext, DexArchiveProvider.class));
JavaRuntimeJarProvider jarProvider = base.getProvider(JavaRuntimeJarProvider.class);
if (jarProvider != null) {
+ boolean basenameClash = checkBasenameClash(jarProvider.getRuntimeJars());
Set<Set<String>> aspectDexopts = aspectDexopts(ruleContext);
for (Artifact jar : jarProvider.getRuntimeJars()) {
for (Set<String> incrementalDexopts : aspectDexopts) {
@@ -164,14 +166,16 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
// need to write unique artifacts for each flag combination. Here, it is convenient to
// distinguish them by putting the flags that were used for creating the artifacts into
// their filenames.
- String filename = jar.getFilename() + Joiner.on("").join(incrementalDexopts) + ".dex.zip";
+ String uniqueFilename =
+ (basenameClash ? jar.getRootRelativePathString() : jar.getFilename())
+ + Joiner.on("").join(incrementalDexopts) + ".dex.zip";
Artifact dexArchive =
createDexArchiveAction(
ruleContext,
ASPECT_DEXBUILDER_PREREQ,
desugaredJars.apply(jar),
incrementalDexopts,
- AndroidBinary.getDxArtifact(ruleContext, filename));
+ AndroidBinary.getDxArtifact(ruleContext, uniqueFilename));
dexArchives.addDexArchive(incrementalDexopts, dexArchive, jar);
}
}
@@ -205,8 +209,10 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
.getCompileTimeJars();
// For android_* targets we need to honor their bootclasspath (nicer in general to do so)
ImmutableList<Artifact> bootclasspath = getBootclasspath(base, ruleContext);
+
+ boolean basenameClash = checkBasenameClash(jarProvider.getRuntimeJars());
for (Artifact jar : jarProvider.getRuntimeJars()) {
- Artifact desugared = createDesugarAction(ruleContext, jar, bootclasspath,
+ Artifact desugared = createDesugarAction(ruleContext, basenameClash, jar, bootclasspath,
compileTimeClasspath);
newlyDesugared.put(jar, desugared);
desugaredJars.addDesugaredJar(jar, desugared);
@@ -216,6 +222,19 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
return Functions.forMap(newlyDesugared);
}
+ private static boolean checkBasenameClash(ImmutableList<Artifact> artifacts) {
+ if (artifacts.size() <= 1) {
+ return false;
+ }
+ HashSet<String> seen = new HashSet<>();
+ for (Artifact artifact : artifacts) {
+ if (!seen.add(artifact.getFilename())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private static <T extends TransitiveInfoProvider> IterablesChain<T> collectPrerequisites(
RuleContext ruleContext, Class<T> classType) {
IterablesChain.Builder<T> result = IterablesChain.builder();
@@ -243,6 +262,7 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
private Artifact createDesugarAction(
RuleContext ruleContext,
+ boolean disambiguateBasenames,
Artifact jar,
ImmutableList<Artifact> bootclasspath,
NestedSet<Artifact> compileTimeClasspath) {
@@ -252,7 +272,9 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
jar,
bootclasspath,
compileTimeClasspath,
- AndroidBinary.getDxArtifact(ruleContext, jar.getFilename() + "_desugared.jar"));
+ AndroidBinary.getDxArtifact(ruleContext,
+ (disambiguateBasenames ? jar.getRootRelativePathString() : jar.getFilename())
+ + "_desugared.jar"));
}
/**