diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index f00f7fb..b9a9b47 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -16,6 +16,7 @@
 import com.android.tools.r8.ProgramResourceProvider;
 import com.android.tools.r8.ResourceException;
 import com.android.tools.r8.StringResource;
+import com.android.tools.r8.dump.DumpOptions;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
 import com.android.tools.r8.graph.ApplicationReaderMap;
@@ -55,12 +56,15 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 public class ApplicationReader {
@@ -196,9 +200,10 @@
       cleanDump = true;
       dumpOutput = Paths.get("/tmp").resolve("dump" + System.nanoTime() + ".zip");
     }
-    if (dumpOutput != null) {
+    DumpOptions dumpOptions = options.dumpOptions;
+    if (dumpOutput != null && dumpOptions != null && shouldDump(dumpOptions)) {
       timing.begin("ApplicationReader.dump");
-      inputApp.dump(dumpOutput, options.dumpOptions, options.reporter, options.dexItemFactory());
+      inputApp.dump(dumpOutput, dumpOptions, options.reporter, options.dexItemFactory());
       if (cleanDump) {
         Files.delete(dumpOutput);
       }
@@ -212,6 +217,18 @@
     }
   }
 
+  private static boolean shouldDump(DumpOptions options) {
+    Map<String, String> buildProperties = options.getBuildProperties();
+    for (Entry<String, String> entry : buildProperties.entrySet()) {
+      String valueRegExp =
+          System.getProperty("com.android.tools.r8.dump.filter.buildproperty." + entry.getKey());
+      if (valueRegExp != null && !Pattern.matches(valueRegExp, entry.getValue())) {
+        return false;
+      }
+    }
+    return true;
+  }
+
   public MainDexInfo readMainDexClasses(DexApplication app) {
     return readMainDexClasses(app, flags.hasReadProgramClassFromCf());
   }
diff --git a/src/main/java/com/android/tools/r8/dump/DumpOptions.java b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
index 224d24a..b4e1c29 100644
--- a/src/main/java/com/android/tools/r8/dump/DumpOptions.java
+++ b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
@@ -15,8 +15,10 @@
 import com.android.tools.r8.utils.ThreadUtils;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 
 @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@@ -101,30 +103,40 @@
     this.dumpInputToFile = dumpInputToFile;
   }
 
-  public String dumpOptions() {
+  public String getBuildPropertiesFileContent() {
     StringBuilder builder = new StringBuilder();
-    addDumpEntry(builder, TOOL_KEY, tool.name());
+    getBuildProperties()
+        .forEach((key, value) -> builder.append(key).append("=").append(value).append("\n"));
+    return builder.toString();
+  }
+
+  public Map<String, String> getBuildProperties() {
+    Map<String, String> buildProperties = new LinkedHashMap<>();
+    addDumpEntry(buildProperties, TOOL_KEY, tool.name());
     // We keep the following values for backward compatibility.
     addDumpEntry(
-        builder,
+        buildProperties,
         MODE_KEY,
         compilationMode == CompilationMode.DEBUG ? DEBUG_MODE_VALUE : RELEASE_MODE_VALUE);
-    addDumpEntry(builder, MIN_API_KEY, minApi);
-    addDumpEntry(builder, OPTIMIZE_MULTIDEX_FOR_LINEAR_ALLOC_KEY, optimizeMultidexForLinearAlloc);
+    addDumpEntry(buildProperties, MIN_API_KEY, minApi);
+    addDumpEntry(
+        buildProperties, OPTIMIZE_MULTIDEX_FOR_LINEAR_ALLOC_KEY, optimizeMultidexForLinearAlloc);
     if (threadCount != ThreadUtils.NOT_SPECIFIED) {
-      addDumpEntry(builder, THREAD_COUNT_KEY, threadCount);
+      addDumpEntry(buildProperties, THREAD_COUNT_KEY, threadCount);
     }
-    addDumpEntry(builder, DESUGAR_STATE_KEY, desugarState);
-    addOptionalDumpEntry(builder, INTERMEDIATE_KEY, intermediate);
-    addOptionalDumpEntry(builder, INCLUDE_DATA_RESOURCES_KEY, includeDataResources);
-    addOptionalDumpEntry(builder, TREE_SHAKING_KEY, treeShaking);
-    addOptionalDumpEntry(builder, MINIFICATION_KEY, minification);
-    addOptionalDumpEntry(builder, FORCE_PROGUARD_COMPATIBILITY_KEY, forceProguardCompatibility);
+    addDumpEntry(buildProperties, DESUGAR_STATE_KEY, desugarState);
+    addOptionalDumpEntry(buildProperties, INTERMEDIATE_KEY, intermediate);
+    addOptionalDumpEntry(buildProperties, INCLUDE_DATA_RESOURCES_KEY, includeDataResources);
+    addOptionalDumpEntry(buildProperties, TREE_SHAKING_KEY, treeShaking);
+    addOptionalDumpEntry(buildProperties, MINIFICATION_KEY, minification);
+    addOptionalDumpEntry(
+        buildProperties, FORCE_PROGUARD_COMPATIBILITY_KEY, forceProguardCompatibility);
     ArrayList<String> sortedKeys = new ArrayList<>(systemProperties.keySet());
     sortedKeys.sort(String::compareTo);
     sortedKeys.forEach(
-        key -> addDumpEntry(builder, SYSTEM_PROPERTY_PREFIX + key, systemProperties.get(key)));
-    return builder.toString();
+        key ->
+            addDumpEntry(buildProperties, SYSTEM_PROPERTY_PREFIX + key, systemProperties.get(key)));
+    return buildProperties;
   }
 
   public static void parse(String content, DumpOptions.Builder builder) {
@@ -207,12 +219,13 @@
     return minApi;
   }
 
-  private void addOptionalDumpEntry(StringBuilder builder, String key, Optional<?> optionalValue) {
-    optionalValue.ifPresent(bool -> addDumpEntry(builder, key, bool));
+  private void addOptionalDumpEntry(
+      Map<String, String> buildProperties, String key, Optional<?> optionalValue) {
+    optionalValue.ifPresent(bool -> addDumpEntry(buildProperties, key, bool));
   }
 
-  private void addDumpEntry(StringBuilder builder, String key, Object value) {
-    builder.append(key).append("=").append(value).append("\n");
+  private void addDumpEntry(Map<String, String> buildProperties, String key, Object value) {
+    buildProperties.put(key, Objects.toString(value));
   }
 
   private boolean hasDesugaredLibraryConfiguration() {
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApp.java b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
index 68837ab..c93922c 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -467,9 +467,6 @@
   }
 
   public void dump(Path output, DumpOptions options, Reporter reporter, DexItemFactory factory) {
-    if (options == null) {
-      return;
-    }
     int nextDexIndex = 0;
     OpenOption[] openOptions =
         new OpenOption[] {StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING};
@@ -477,7 +474,10 @@
       writeToZipStream(
           out, dumpVersionFileName, Version.getVersionString().getBytes(), ZipEntry.DEFLATED);
       writeToZipStream(
-          out, dumpBuildPropertiesFileName, options.dumpOptions().getBytes(), ZipEntry.DEFLATED);
+          out,
+          dumpBuildPropertiesFileName,
+          options.getBuildPropertiesFileContent().getBytes(),
+          ZipEntry.DEFLATED);
       if (options.getDesugaredLibraryJsonSource() != null) {
         writeToZipStream(
             out,
