Enable DexSplitter to run by passing in options
Change-Id: I6a20159930800225b0dcd8ea957ebdbd97bb9498
diff --git a/src/main/java/com/android/tools/r8/dexsplitter/DexSplitter.java b/src/main/java/com/android/tools/r8/dexsplitter/DexSplitter.java
index 20cf4ee..45a62ef 100644
--- a/src/main/java/com/android/tools/r8/dexsplitter/DexSplitter.java
+++ b/src/main/java/com/android/tools/r8/dexsplitter/DexSplitter.java
@@ -26,7 +26,7 @@
private static final boolean PRINT_ARGS = false;
- private static class Options {
+ public static class Options {
List<String> inputArchives = new ArrayList<>();
List<String> featureJars = new ArrayList<>();
String splitBaseName = DEFAULT_OUTPUT_ARCHIVE_FILENAME;
@@ -77,10 +77,16 @@
return FeatureClassMapping.fromJarFiles(options.featureJars);
}
- public static void run(String[] args)
+ private static void run(String[] args)
throws CompilationFailedException, IOException, CompilationException, ExecutionException,
ResourceException, FeatureMappingException {
Options options = parseArguments(args);
+ run(options);
+ }
+
+ public static void run(Options options)
+ throws IOException, FeatureMappingException, ResourceException, CompilationException,
+ ExecutionException, CompilationFailedException {
if (options.inputArchives.isEmpty()) {
throw new RuntimeException("Need at least one --input");
}
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 750a5c8..43e9d03 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
@@ -8,16 +8,20 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+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.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.dexsplitter.DexSplitter.Options;
import com.android.tools.r8.utils.DexInspector;
import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.FeatureClassMapping.FeatureMappingException;
import com.google.common.collect.ImmutableList;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -52,31 +56,47 @@
* therefore can't run without the base being loaded.
*/
@Test
- public void splitFilesNoObfuscation() throws CompilationFailedException, IOException {
+ public void splitFilesNoObfuscation()
+ throws CompilationFailedException, IOException, FeatureMappingException, ResourceException,
+ CompilationException, ExecutionException {
+ noObfuscation(false);
+ noObfuscation(true);
+ }
+
+ private void noObfuscation(boolean useOptions)
+ throws IOException, CompilationFailedException, FeatureMappingException,
+ ResourceException, ExecutionException, CompilationException {
// Initial normal compile to create dex files.
- Path inputDex = temp.newFolder().toPath().resolve("input.zip");
+ Path inputZip = temp.newFolder().toPath().resolve("input.zip");
D8.run(
D8Command.builder()
- .setOutput(inputDex, OutputMode.DexIndexed)
+ .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))
.build());
- Path outputDex = temp.getRoot().toPath().resolve("output");
+ Path output = temp.getRoot().toPath().resolve("output");
Path splitSpec = createSplitSpec();
- DexSplitter.main(
- new String[] {
- "--input", inputDex.toString(),
- "--output", outputDex.toString(),
- "--feature-splits", splitSpec.toString()
- });
+ if (useOptions) {
+ Options options = new Options();
+ options.inputArchives.add(inputZip.toString());
+ options.featureSplitMapping = splitSpec.toString();
+ options.splitBaseName = output.toString();
+ DexSplitter.run(options);
+ } else {
+ DexSplitter.main(
+ new String[] {
+ "--input", inputZip.toString(),
+ "--output", output.toString(),
+ "--feature-splits", splitSpec.toString()
+ });
+ }
-
- Path base = outputDex.getParent().resolve("output.base.zip");
- Path feature = outputDex.getParent().resolve("output.feature1.zip");
+ Path base = output.getParent().resolve("output.base.zip");
+ Path feature = output.getParent().resolve("output.feature1.zip");
validateUnobfuscatedOutput(base, feature);
}
@@ -136,19 +156,28 @@
}
@Test
- public void splitFilesFromJar() throws IOException, CompilationFailedException {
+ public void splitFilesFromJar()
+ throws IOException, CompilationFailedException, FeatureMappingException, ResourceException,
+ CompilationException, ExecutionException {
+ splitFromJars(true);
+ splitFromJars(false);
+ }
+
+ private void splitFromJars(boolean useOptions)
+ throws IOException, CompilationFailedException, FeatureMappingException, ResourceException,
+ ExecutionException, CompilationException {
// Initial normal compile to create dex files.
- Path inputDex = temp.newFolder().toPath().resolve("input.zip");
+ Path inputZip = temp.newFolder().toPath().resolve("input.zip");
D8.run(
D8Command.builder()
- .setOutput(inputDex, OutputMode.DexIndexed)
+ .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))
.build());
- Path outputDex = temp.getRoot().toPath().resolve("output");
+ Path output = temp.getRoot().toPath().resolve("output");
Path baseJar = temp.getRoot().toPath().resolve("base.jar");
Path featureJar = temp.getRoot().toPath().resolve("feature1.jar");
ZipOutputStream baseStream = new ZipOutputStream(Files.newOutputStream(baseJar));
@@ -172,23 +201,32 @@
featureStream.write(Files.readAllBytes(Paths.get(CLASS3_INNER_CLASS)));
featureStream.closeEntry();
featureStream.close();
-
- DexSplitter.main(
- new String[] {
- "--input",
- inputDex.toString(),
- "--output",
- outputDex.toString(),
- "--feature-jar",
- baseJar.toString(),
- "--feature-jar",
- featureJar.toString()
- });
- Path base = outputDex.getParent().resolve("output.base.zip");
- Path feature = outputDex.getParent().resolve("output.feature1.zip");
+ if (useOptions) {
+ Options options = new Options();
+ options.inputArchives.add(inputZip.toString());
+ options.splitBaseName = output.toString();
+ options.featureJars.add(baseJar.toString());
+ options.featureJars.add(featureJar.toString());
+ DexSplitter.run(options);
+ } else {
+ DexSplitter.main(
+ new String[]{
+ "--input",
+ inputZip.toString(),
+ "--output",
+ output.toString(),
+ "--feature-jar",
+ baseJar.toString(),
+ "--feature-jar",
+ featureJar.toString()
+ });
+ }
+ Path base = output.getParent().resolve("output.base.zip");
+ Path feature = output.getParent().resolve("output.feature1.zip");
validateUnobfuscatedOutput(base, feature);
}
+
@Test
public void splitFilesObfuscation()
throws CompilationFailedException, IOException, ExecutionException {