Preserve input markers from dex inputs to D8.

Only add new marker if D8 converted java bytecode to dex code.

Bug: 110459613
Change-Id: Ie5f26ba22b1c5cbb078da48fc923b2c08560462d
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index f4d378a..3a33053 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.DexApplication;
+import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.ir.conversion.IRConverter;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.origin.CommandLineOrigin;
@@ -21,11 +22,14 @@
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
 import com.android.tools.r8.utils.VersionProperties;
+import com.google.common.collect.ImmutableList;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.nio.charset.StandardCharsets;
-import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 
@@ -167,11 +171,26 @@
         System.out.println("Finished compilation with method filter: ");
         options.methodsFilter.forEach((m) -> System.out.println("  - " + m));
       }
+
+      // Preserve markers from input dex code and add a marker with the current version
+      // if there were class file inputs.
+      boolean hasClassResources = false;
+      for (DexProgramClass dexProgramClass : app.classes()) {
+        if (dexProgramClass.originatesFromClassResource()) {
+          hasClassResources = true;
+          break;
+        }
+      }
       Marker marker = getMarker(options);
+      Set<Marker> markers = new HashSet<>(app.dexItemFactory.extractMarkers());
+      if (marker != null && hasClassResources) {
+        markers.add(marker);
+      }
+
       new ApplicationWriter(
               app,
               options,
-              marker == null ? null : Collections.singletonList(marker),
+              marker == null ? null : ImmutableList.copyOf(markers),
               null,
               NamingLens.getIdentityLens(),
               null,
diff --git a/src/test/java/com/android/tools/r8/dexfilemerger/DexFileMergerTests.java b/src/test/java/com/android/tools/r8/dexfilemerger/DexFileMergerTests.java
index 4b3f4fe..a43051c 100644
--- a/src/test/java/com/android/tools/r8/dexfilemerger/DexFileMergerTests.java
+++ b/src/test/java/com/android/tools/r8/dexfilemerger/DexFileMergerTests.java
@@ -7,6 +7,7 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.D8;
 import com.android.tools.r8.D8Command;
 import com.android.tools.r8.DexFileMergerHelper;
 import com.android.tools.r8.ExtractMarker;
@@ -60,14 +61,19 @@
     Marker inputMarker = ExtractMarker.extractMarkerFromDexFile(mergerInputZip);
     assertEquals(addMarkerToInput, inputMarker != null);
 
+    // Test that the DexFileMerger preserves markers.
     Path mergerOutputZip = temp.getRoot().toPath().resolve("merger-out.zip");
     DexFileMerger.main(
         new String[] {
           "--input", mergerInputZip.toString(), "--output", mergerOutputZip.toString()
         });
-
     Marker outputMarker = ExtractMarker.extractMarkerFromDexFile(mergerOutputZip);
     assertEquals(addMarkerToInput, outputMarker != null);
+
+    // Test that D8 when used for merging preserves markers.
+    D8.main(new String[] { mergerInputZip.toString(), "--output", mergerOutputZip.toString() });
+    Marker d8OutputMarker = ExtractMarker.extractMarkerFromDexFile((mergerOutputZip));
+    assertEquals(addMarkerToInput, d8OutputMarker != null);
   }
 
   @Test