Add support for --main-dex-list amd --minimal-mail-dex to compat proguard
Some targets in the Android platform build passed these dx options to the
combined Proguard + dx build that R8 is now doing.
For --main-dex-list the format --main-dex-list=<file> was used.
Bug: 68375939
Change-Id: Ib605876d07fe58f4bbfe1b410eed5c23746c57d1
diff --git a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
index a6b45ae..219555e 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
@@ -35,15 +35,18 @@
public final boolean forceProguardCompatibility;
public final boolean ignoreMissingClasses;
public final boolean multiDex;
+ public final String mainDexList;
public final List<String> proguardConfig;
CompatProguardOptions(List<String> proguardConfig, String output, int minApi,
- boolean multiDex, boolean forceProguardCompatibility, boolean ignoreMissingClasses) {
+ boolean multiDex, boolean forceProguardCompatibility, boolean ignoreMissingClasses,
+ String mainDexList) {
this.output = output;
this.minApi = minApi;
this.forceProguardCompatibility = forceProguardCompatibility;
this.ignoreMissingClasses = ignoreMissingClasses;
this.multiDex = multiDex;
+ this.mainDexList = mainDexList;
this.proguardConfig = proguardConfig;
}
@@ -53,12 +56,15 @@
boolean forceProguardCompatibility = false;
boolean ignoreMissingClasses = false;
boolean multiDex = false;
+ String mainDexList = null;
+ // These two flags are currently ignored.
+ boolean minimalMainDex = false;
boolean coreLibrary = false;
ImmutableList.Builder<String> builder = ImmutableList.builder();
if (args.length > 0) {
- StringBuilder currentLine = new StringBuilder(args[0]);
- for (int i = 1; i < args.length; i++) {
+ StringBuilder currentLine = new StringBuilder();
+ for (int i = 0; i < args.length; i++) {
String arg = args[i];
if (arg.charAt(0) == '-') {
if (arg.equals("--min-api")) {
@@ -71,23 +77,34 @@
output = args[++i];
} else if (arg.equals("--multi-dex")) {
multiDex = true;
+ } else if (arg.equals("--main-dex-list")) {
+ mainDexList = args[++i];
+ } else if (arg.startsWith("--main-dex-list=")) {
+ mainDexList = arg.substring("--main-dex-list=".length());
+ } else if (arg.equals("--minimal-main-dex")) {
+ minimalMainDex = true;
} else if (arg.equals("--core-library")) {
coreLibrary = true;
} else if (arg.equals("-outjars")) {
throw new CompilationException(
"Proguard argument -outjar is not supported. Use R8 compatible --output flag");
} else {
- builder.add(currentLine.toString());
+ if (currentLine.length() > 0) {
+ builder.add(currentLine.toString());
+ }
currentLine = new StringBuilder(arg);
}
} else {
- currentLine.append(' ').append(arg);
+ if (currentLine.length() > 0) {
+ currentLine.append(' ');
+ }
+ currentLine.append(arg);
}
}
builder.add(currentLine.toString());
}
return new CompatProguardOptions(builder.build(), output, minApi, multiDex,
- forceProguardCompatibility, ignoreMissingClasses);
+ forceProguardCompatibility, ignoreMissingClasses, mainDexList);
}
}
@@ -105,6 +122,9 @@
builder.setOutputPath(Paths.get(options.output))
.addProguardConfiguration(options.proguardConfig)
.setMinApiLevel(options.minApi);
+ if (options.mainDexList != null) {
+ builder.addMainDexListFiles(Paths.get(options.mainDexList));
+ }
AndroidApp result = R8.runInternal(builder.build());
if (!options.multiDex) {
diff --git a/src/test/java/com/android/tools/r8/compatproguard/CompatProguardTest.java b/src/test/java/com/android/tools/r8/compatproguard/CompatProguardTest.java
new file mode 100644
index 0000000..638e700
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/compatproguard/CompatProguardTest.java
@@ -0,0 +1,58 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.compatproguard;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.compatproguard.CompatProguard.CompatProguardOptions;
+import org.junit.Test;
+
+public class CompatProguardTest {
+
+ private CompatProguardOptions parseArgs(String... args)throws Exception {
+ return CompatProguard.CompatProguardOptions.parse(args);
+ }
+
+ @Test
+ public void testProguardOptions() throws Exception {
+ CompatProguardOptions options;
+
+ options = parseArgs("-xxx");
+ assertEquals(1, options.proguardConfig.size());
+ options = parseArgs("-xxx", "xxx");
+ assertEquals(1, options.proguardConfig.size());
+ options = parseArgs("-xxx", "-yyy");
+ assertEquals(2, options.proguardConfig.size());
+ options = parseArgs("-xxx", "xxx", "-yyy", "yyy");
+ assertEquals(2, options.proguardConfig.size());
+ }
+
+ @Test
+ public void testInjarsAndOutput() throws Exception {
+ CompatProguardOptions options;
+ String injars = "input.jar";
+ String output = "outputdir";
+ options = parseArgs("-injars", injars, "--output", output);
+ assertEquals(output, options.output);
+ assertEquals(1, options.proguardConfig.size());
+ options = parseArgs("--output", output, "-injars", injars);
+ assertEquals(1, options.proguardConfig.size());
+ }
+
+ @Test
+ public void testMainDexList() throws Exception {
+ CompatProguardOptions options;
+ String mainDexList = "maindexlist.txt";
+
+ options = parseArgs("--main-dex-list", mainDexList);
+ assertEquals(mainDexList, options.mainDexList);
+ options = parseArgs("--main-dex-list=" + mainDexList);
+ assertEquals(mainDexList, options.mainDexList);
+ options = parseArgs("--main-dex-list", mainDexList, "--minimal-main-dex");
+ assertEquals(mainDexList, options.mainDexList);
+ options = parseArgs("--minimal-main-dex", "--main-dex-list=" + mainDexList);
+ assertEquals(mainDexList, options.mainDexList);
+ }
+}