diff options
author | 2016-12-02 20:28:19 +0000 | |
---|---|---|
committer | 2016-12-05 10:19:59 +0000 | |
commit | f0826ed6e35ce6a9e4a980844f9899ba40df25ef (patch) | |
tree | 248fd147924c30dea912e1858d262504adb8c35c /src/main/java/com/google/devtools/build/lib/rules | |
parent | 8a0893f3a4c47e779ec9754abb2a6b6a2b591fa4 (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.java | 30 |
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")); } /** |