Merge "Remove d8-compat-dx dependencies"
diff --git a/Android.mk b/Android.mk
index 9fffc8a..2eab8eb 100644
--- a/Android.mk
+++ b/Android.mk
@@ -35,7 +35,7 @@
 
 LOCAL_ADDITIONAL_DEPENDENCIES := \
   $(HOST_OUT_EXECUTABLES)/dx \
-  $(HOST_OUT_EXECUTABLES)/d8-compat-dx \
+  $(HOST_OUT_EXECUTABLES)/d8 \
   $(HOST_OUT_JAVA_LIBRARIES)/desugar.jar
 
 # Vogar uses android.jar.
diff --git a/src/vogar/android/AndroidSdk.java b/src/vogar/android/AndroidSdk.java
index f59c9b9..f6d0231 100644
--- a/src/vogar/android/AndroidSdk.java
+++ b/src/vogar/android/AndroidSdk.java
@@ -47,7 +47,7 @@
  */
 public class AndroidSdk {
 
-    private static final String D8_COMMAND_NAME = "d8-compat-dx";
+    private static final String D8_COMMAND_NAME = "d8";
     private static final String DX_COMMAND_NAME = "dx";
     private static final String ARBITRARY_BUILD_TOOL_NAME = D8_COMMAND_NAME;
 
@@ -321,37 +321,51 @@
         switch (dexer) {
             case DX:
                 builder.args(DX_COMMAND_NAME);
+                builder.args("-JXms16M").args("-JXmx1536M");
+                builder.args("--min-sdk-version=" + language.getMinApiLevel());
+                if (multidex) {
+                    builder.args("--multi-dex");
+                }
+                builder.args("--dex")
+                    .args("--output=" + output)
+                    .args("--core-library")
+                    .args(desugarOutputFilePaths);
+                builder.execute();
                 break;
             case D8:
+                List<String> sanitizedDesugarOutputFilePaths;
+                try {
+                    sanitizedDesugarOutputFilePaths = removeDexFilesForD8(desugarOutputFilePaths);
+                } catch (IOException e) {
+                    throw new RuntimeException("Error while removing dex files from archive", e);
+                }
                 builder.args(D8_COMMAND_NAME);
+                builder.args("-JXms16M").args("-JXmx1536M");
+                builder
+                    .args("--min-api").args(language.getMinApiLevel())
+                    .args("--output").args(output)
+                    .args(sanitizedDesugarOutputFilePaths);
+                builder.execute();
+                if (dexer == Dexer.D8 && output.toString().endsWith(".jar")) {
+                    try {
+                        fixD8JarOutput(output, desugarOutputFilePaths);
+                    } catch (IOException e) {
+                        throw new RuntimeException("Error while fixing d8 output", e);
+                    }
+                }
                 break;
-        }
-        builder.args("-JXms16M")
-                .args("-JXmx1536M")
-                .args("--min-sdk-version=" + language.getMinApiLevel());
-        if (multidex) {
-            builder.args("--multi-dex");
-        }
-        builder.args("--dex")
-                .args("--output=" + output)
-                .args("--core-library")
-                .args(desugarOutputFilePaths);
-        builder.execute();
+            default:
+                throw new RuntimeException("Unsupported dexer: " + dexer);
 
-        if (dexer == Dexer.D8 && output.toString().endsWith(".jar")) {
-            try {
-                fixD8JarOutput(output, desugarOutputFilePaths);
-            } catch (IOException e) {
-                throw new RuntimeException("Error while fixing d8 output", e);
-            }
         }
+
         dexCache.insert(cacheKey, output);
     }
 
     /**
      * Produces an output file like dx does. dx generates jar files containing all resources present
      * in the input files.
-     * d8-compat-dx only produces a jar file containing dex and none of the input resources, and
+     * d8 only produces a jar file containing dex and none of the input resources, and
      * will produce no file at all if there are no .class files to process.
      */
     private static void fixD8JarOutput(File output, List<String> inputs) throws IOException {
@@ -378,14 +392,41 @@
         }
     }
 
+    /**
+      * Removes DEX files from an archive and preserve the rest.
+      */
+    private List<String> removeDexFilesForD8(List<String> fileNames) throws IOException {
+        byte[] buffer = new byte[4096];
+        List<String> processedFiles = new ArrayList<>(fileNames.size());
+        for (String inputFileName : fileNames) {
+            String jarExtension = ".jar";
+            if (inputFileName.endsWith(jarExtension)) {
+                inputFileName =
+                    inputFileName.substring(0, inputFileName.length() - jarExtension.length());
+            }
+            String outputFileName = inputFileName + "-d8.jar";
+            try (JarOutputStream outputJar =
+                    new JarOutputStream(new FileOutputStream(outputFileName))) {
+                copyJarContentExcludingFiles(buffer, inputFileName, outputJar, ".dex");
+            }
+            processedFiles.add(outputFileName);
+        }
+        return processedFiles;
+    }
+
     private static void copyJarContentExcludingClassFiles(byte[] buffer, String inputJarName,
             JarOutputStream outputJar) throws IOException {
+        copyJarContentExcludingFiles(buffer, inputJarName, outputJar, ".class");
+    }
+
+    private static void copyJarContentExcludingFiles(byte[] buffer, String inputJarName,
+            JarOutputStream outputJar, String extensionToExclude) throws IOException {
 
         try (JarInputStream inputJar = new JarInputStream(new FileInputStream(inputJarName))) {
             for (JarEntry entry = inputJar.getNextJarEntry();
                     entry != null;
                     entry = inputJar.getNextJarEntry()) {
-                if (entry.getName().endsWith(".class")) {
+                if (entry.getName().endsWith(extensionToExclude)) {
                     continue;
                 }