Merge "Revert "Change filePerClass semanthic to filePerInputClass""
diff --git a/scripts/aosp_helper.sh b/scripts/aosp_helper.sh
index 0dc6f78..f64e8fa 100755
--- a/scripts/aosp_helper.sh
+++ b/scripts/aosp_helper.sh
@@ -16,6 +16,10 @@
 
 if [[ "$TASK" == "make" ]]; then
   make "$@"
+elif [[ "$TASK" == "mmm" ]]; then
+  mmm "$@"
+elif [[ "$TASK" == "mmma" ]]; then
+  mmma "$@"
 elif [[ "$TASK" == "emulator" ]]; then
   # Launch emulator in bg and kill it in a trap
   # otherwise it won't get killed when this parent process is killed
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 45eb6e4..2ea5e56 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
@@ -9,32 +9,45 @@
 import com.android.tools.r8.R8Command;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
+import java.nio.file.Paths;
 import java.util.List;
 
 public class CompatProguard {
   public static class CompatProguardOptions {
+    public final String output;
+    public final int minApi;
     public final List<String> proguardConfig;
 
-    CompatProguardOptions(List<String> proguardConfig) {
+    CompatProguardOptions(List<String> proguardConfig, String output, int minApi) {
+      this.output = output;
+      this.minApi = minApi;
       this.proguardConfig = proguardConfig;
     }
 
     public static CompatProguardOptions parse(String[] args) {
+      String output = null;
+      int minApi = 1;
       ImmutableList.Builder<String> builder = ImmutableList.builder();
       if (args.length > 0) {
         StringBuilder currentLine = new StringBuilder(args[0]);
         for (int i = 1; i < args.length; i++) {
           String arg = args[i];
           if (arg.charAt(0) == '-') {
-            builder.add(currentLine.toString());
-            currentLine = new StringBuilder(arg);
+            if (arg.equals("--min-api")) {
+              minApi = Integer.valueOf(args[++i]);
+            } else if (arg.equals("-outjars")) {
+              output = args[++i];
+            } else {
+              builder.add(currentLine.toString());
+              currentLine = new StringBuilder(arg);
+            }
           } else {
             currentLine.append(' ').append(arg);
           }
         }
         builder.add(currentLine.toString());
       }
-      return new CompatProguardOptions(builder.build());
+      return new CompatProguardOptions(builder.build(), output, minApi);
     }
   }
 
@@ -42,7 +55,11 @@
     System.out.println("CompatProguard " + String.join(" ", args));
     // Run R8 passing all the options from the command line as a Proguard configuration.
     CompatProguardOptions options = CompatProguardOptions.parse(args);
-    R8.run(R8Command.builder().addProguardConfiguration(options.proguardConfig).build());
+    R8.run(R8Command.builder()
+        .setOutputPath(Paths.get(options.output))
+        .addProguardConfiguration(options.proguardConfig)
+        .setMinApiLevel(options.minApi)
+        .build());
   }
 
   public static void main(String[] args) throws IOException {
diff --git a/tools/build_aosp.py b/tools/build_aosp.py
index 111715e..0079554 100755
--- a/tools/build_aosp.py
+++ b/tools/build_aosp.py
@@ -29,6 +29,15 @@
       choices = ['jack', 'd8', 'r8', 'default'],
       default = 'd8',
       help='Compiler tool to use. Defaults to d8.')
+  parser.add_argument('--mmm',
+      action = 'store_true',
+      help='Use mmm instead of make')
+  parser.add_argument('--mmma',
+      action = 'store_true',
+      help='Use mmma instead of make')
+  parser.add_argument('--rebuild-system-image-after-mmm',
+      action = 'store_true',
+      help='Build the system image after building a package with mmm or mmma')
   parser.add_argument('--clean-dex',
       action = 'store_true',
       help = 'Remove all dex files before the build. By default they'
@@ -106,7 +115,7 @@
     f.write('java -jar ' + compat_proguard_jar + ' "$@" --min-api 10000')
   os.chmod(proguard_script, S_IRWXU)
 
-def build_aosp(aosp_root, lunch, tool, concurrency, target):
+def build_aosp(aosp_root, lunch, make, tool, concurrency, target):
   jack_option = 'ANDROID_COMPILE_WITH_JACK=' \
       + ('true' if tool == 'jack' else 'false')
 
@@ -123,10 +132,10 @@
     prepare_for_proguard(aosp_root)
 
   j_option = '-j' + str(concurrency);
-  print("-- Building Android image with 'make {} {} {}'." \
-    .format(j_option, jack_option, alt_jar_option))
+  print("-- Building Android image with '{} {} {} {}'." \
+    .format(make, j_option, jack_option, alt_jar_option))
 
-  command = ['make', j_option, jack_option, alt_jar_option]
+  command = [make, j_option, jack_option, alt_jar_option]
   if target:
     command.append(target)
 
@@ -141,7 +150,15 @@
 
   setup_and_clean_dex(args.aosp_root, args.tool, args.clean_dex)
 
-  build_aosp(args.aosp_root, args.lunch, args.tool, args.j, args.target)
+  make = 'make'
+  if args.mmm:
+    make = 'mmm'
+  if args.mmma:
+    make = 'mmma'
+  build_aosp(args.aosp_root, args.lunch, make, args.tool, args.j, args.target)
+  # Call make to re-build the system image if requested.
+  if args.rebuild_system_image_after_mmm and (args.mmm or args.mmma):
+    build_aosp(args.aosp_root, args.lunch, 'make', 'd8', args.j, None)
 
 if __name__ == '__main__':
   sys.exit(Main())