Merge "Add android jar for SDK versions 22 and 23."
diff --git a/src/main/java/com/android/tools/r8/dexfilemerger/DexFileMerger.java b/src/main/java/com/android/tools/r8/dexfilemerger/DexFileMerger.java
index 9311078..7bcb4fc 100644
--- a/src/main/java/com/android/tools/r8/dexfilemerger/DexFileMerger.java
+++ b/src/main/java/com/android/tools/r8/dexfilemerger/DexFileMerger.java
@@ -16,6 +16,7 @@
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -159,13 +160,37 @@
     return null;
   }
 
-  private static Options parseArguments(String[] args) {
+  private static Options parseArguments(String[] args) throws IOException {
+    // We may have a single argument which is a parameter file path, prefixed with '@'.
+    if (args.length == 1 && args[0].startsWith("@")) {
+      // TODO(tamaskenez) Implement more sophisticated processing
+      // which is aligned with Blaze's
+      // com.google.devtools.common.options.ShellQuotedParamsFilePreProcessor
+      Path paramsFile = Paths.get(args[0].substring(1));
+      List<String> argsList = new ArrayList<>();
+      for (String s : Files.readAllLines(paramsFile)) {
+        s = s.trim();
+        if (s.isEmpty()) {
+          continue;
+        }
+        // Trim optional enclosing single quotes. Unescaping omitted for now.
+        if (s.length() >= 2 && s.startsWith("'") && s.endsWith("'")) {
+          s = s.substring(1, s.length() - 1);
+        }
+        argsList.add(s);
+      }
+      args = argsList.toArray(new String[argsList.size()]);
+    }
+
     Options options = new Options();
     ParseContext context = new ParseContext(args);
     List<String> strings;
     String string;
     Boolean b;
     while (context.head() != null) {
+      if (context.head().startsWith("@")) {
+        throw new RuntimeException("A params file must be the only argument: " + context.head());
+      }
       strings = tryParseMulti(context, "--input");
       if (strings != null) {
         options.inputArchives.addAll(strings);
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 6517e89..ef0221d 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -480,9 +480,12 @@
       // TODO(mikaelpeltier) Android P does not yet have his android.jar use the O version
       minSdkVersion = AndroidApiLevel.O.getLevel();
     }
-    return String.format(
+    String jar = String.format(
         ANDROID_JAR_PATTERN,
         minSdkVersion == AndroidApiLevel.getDefault().getLevel() ? DEFAULT_MIN_SDK : minSdkVersion);
+    assert Files.exists(Paths.get(jar))
+        : "Expected android jar to exist for API level " + minSdkVersion;
+    return jar;
   }
 
   public static Path getJdwpTestsCfJarPath(int minSdk) {
@@ -561,7 +564,7 @@
   public static DexVm getDexVm() {
     String artVersion = System.getProperty("dex_vm");
     if (artVersion == null) {
-      return DexVm.ART_4_0_4_HOST; //DexVm.ART_DEFAULT;
+      return DexVm.ART_DEFAULT;
     } else {
       DexVm artVersionEnum = DexVm.fromShortName(artVersion);
       if (artVersionEnum == null) {