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())
