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