DexSplitter: copy source markers, don't add new marker.
Bug:
Change-Id: I2cbfd7b0bd95b9695d28baf84aea039b2f0ec06a
diff --git a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
index 627d5ef..06f6d03 100644
--- a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
+++ b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
@@ -105,7 +105,7 @@
}
}
- public static void runForTesting(D8Command command, boolean dontCreateMarkerInD8)
+ public static void runD8ForTesting(D8Command command, boolean dontCreateMarkerInD8)
throws IOException, CompilationException {
InternalOptions options = command.getInternalOptions();
options.testing.dontCreateMarkerInD8 = dontCreateMarkerInD8;
diff --git a/src/main/java/com/android/tools/r8/DexSplitterHelper.java b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
index 8c29ca8..ee6c012 100644
--- a/src/main/java/com/android/tools/r8/DexSplitterHelper.java
+++ b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
@@ -23,8 +23,8 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ExecutionException;
@@ -53,6 +53,7 @@
DexApplication app =
new ApplicationReader(command.getInputApp(), options, timing).read(null, executor);
+ List<Marker> markers = app.dexItemFactory.extractMarkers();
ClassNameMapper mapper = null;
if (proguardMap != null) {
@@ -76,11 +77,10 @@
DexIndexedConsumer consumer = new DirectoryConsumer(outputDir);
try {
- Marker marker = D8.getMarker(options);
new ApplicationWriter(
featureApp,
options,
- marker == null ? null : Collections.singletonList(marker),
+ markers,
null,
NamingLens.getIdentityLens(),
null,
@@ -122,4 +122,11 @@
}
return applications;
}
+
+ public static void runD8ForTesting(D8Command command, boolean dontCreateMarkerInD8)
+ throws IOException, CompilationException {
+ InternalOptions options = command.getInternalOptions();
+ options.testing.dontCreateMarkerInD8 = dontCreateMarkerInD8;
+ D8.runForTesting(command.getInputApp(), options);
+ }
}
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 60edc6d..e7b666c 100644
--- a/src/test/java/com/android/tools/r8/dexfilemerger/DexFileMergerTests.java
+++ b/src/test/java/com/android/tools/r8/dexfilemerger/DexFileMergerTests.java
@@ -49,7 +49,7 @@
.addProgramFiles(Paths.get(CLASS2_CLASS))
.build();
- DexFileMergerHelper.runForTesting(command, dontCreateMarkerInD8);
+ DexFileMergerHelper.runD8ForTesting(command, dontCreateMarkerInD8);
return mergerInputZip;
}
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
index 2db8fe0..ed293f6 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
@@ -10,14 +10,16 @@
import com.android.tools.r8.CompilationException;
import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.D8;
import com.android.tools.r8.D8Command;
+import com.android.tools.r8.DexSplitterHelper;
+import com.android.tools.r8.ExtractMarker;
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.R8;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.ResourceException;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
+import com.android.tools.r8.dex.Marker;
import com.android.tools.r8.dexsplitter.DexSplitter.Options;
import com.android.tools.r8.utils.DexInspector;
import com.android.tools.r8.utils.DexInspector.ClassSubject;
@@ -53,6 +55,65 @@
@Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
+ private Path createInput(boolean dontCreateMarkerInD8)
+ throws IOException, CompilationFailedException, CompilationException {
+ // Initial normal compile to create dex files.
+ Path inputZip = temp.newFolder().toPath().resolve("input.zip");
+ D8Command command =
+ D8Command.builder()
+ .setOutput(inputZip, OutputMode.DexIndexed)
+ .addProgramFiles(Paths.get(CLASS1_CLASS))
+ .addProgramFiles(Paths.get(CLASS2_CLASS))
+ .addProgramFiles(Paths.get(CLASS3_CLASS))
+ .addProgramFiles(Paths.get(CLASS3_INNER_CLASS))
+ .addProgramFiles(Paths.get(CLASS4_CLASS))
+ .addProgramFiles(Paths.get(CLASS4_LAMBDA_INTERFACE))
+ .build();
+
+ DexSplitterHelper.runD8ForTesting(command, dontCreateMarkerInD8);
+
+ return inputZip;
+ }
+
+ private void testMarker(boolean addMarkerToInput)
+ throws CompilationFailedException, CompilationException, IOException, ResourceException,
+ ExecutionException {
+ Path inputZip = createInput(!addMarkerToInput);
+
+ Path output = temp.newFolder().toPath().resolve("output");
+ Files.createDirectory(output);
+ Path splitSpec = createSplitSpec();
+
+ DexSplitter.main(
+ new String[] {
+ "--input", inputZip.toString(),
+ "--output", output.toString(),
+ "--feature-splits", splitSpec.toString()
+ });
+
+ Path base = output.resolve("base").resolve("classes.dex");
+ Path feature = output.resolve("feature1").resolve("classes.dex");
+
+ for (Path path : new Path[] {inputZip, base, feature}) {
+ Marker marker = ExtractMarker.extractMarkerFromDexFile(path);
+ assertEquals(addMarkerToInput, marker != null);
+ }
+ }
+
+ @Test
+ public void testMarkerPreserved()
+ throws CompilationFailedException, CompilationException, IOException, ResourceException,
+ ExecutionException {
+ testMarker(true);
+ }
+
+ @Test
+ public void testMarkerNotAdded()
+ throws CompilationFailedException, CompilationException, IOException, ResourceException,
+ ExecutionException {
+ testMarker(false);
+ }
+
/**
* To test the file splitting we have 3 classes that we distribute like this: Class1 -> base
* Class2 -> feature1 Class3 -> feature1
@@ -71,19 +132,7 @@
private void noObfuscation(boolean useOptions)
throws IOException, CompilationFailedException, FeatureMappingException,
ResourceException, ExecutionException, CompilationException {
- // Initial normal compile to create dex files.
- Path inputZip = temp.newFolder().toPath().resolve("input.zip");
- D8.run(
- D8Command.builder()
- .setOutput(inputZip, OutputMode.DexIndexed)
- .addProgramFiles(Paths.get(CLASS1_CLASS))
- .addProgramFiles(Paths.get(CLASS2_CLASS))
- .addProgramFiles(Paths.get(CLASS3_CLASS))
- .addProgramFiles(Paths.get(CLASS3_INNER_CLASS))
- .addProgramFiles(Paths.get(CLASS4_CLASS))
- .addProgramFiles(Paths.get(CLASS4_LAMBDA_INTERFACE))
- .build());
-
+ Path inputZip = createInput(false);
Path output = temp.newFolder().toPath().resolve("output");
Files.createDirectory(output);
Path splitSpec = createSplitSpec();
@@ -189,19 +238,7 @@
private void splitFromJars(boolean useOptions, boolean explicitBase)
throws IOException, CompilationFailedException, FeatureMappingException, ResourceException,
ExecutionException, CompilationException {
- // Initial normal compile to create dex files.
- Path inputZip = temp.newFolder().toPath().resolve("input.zip");
- D8.run(
- D8Command.builder()
- .setOutput(inputZip, OutputMode.DexIndexed)
- .addProgramFiles(Paths.get(CLASS1_CLASS))
- .addProgramFiles(Paths.get(CLASS2_CLASS))
- .addProgramFiles(Paths.get(CLASS3_CLASS))
- .addProgramFiles(Paths.get(CLASS3_INNER_CLASS))
- .addProgramFiles(Paths.get(CLASS4_CLASS))
- .addProgramFiles(Paths.get(CLASS4_LAMBDA_INTERFACE))
- .build());
-
+ Path inputZip = createInput(false);
Path output = temp.newFolder().toPath().resolve("output");
Files.createDirectory(output);
Path baseJar = temp.getRoot().toPath().resolve("base.jar");