diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/CrashReporter.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/CrashReporter.java
index 768d07b..c8a7dfe 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/CrashReporter.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/CrashReporter.java
@@ -34,6 +34,7 @@
 import java.nio.file.Path;
 import java.nio.file.attribute.PosixFilePermissions;
 import java.util.regex.Matcher;
+import java.util.List;
 import java.util.ArrayList;
 
 /**
@@ -45,7 +46,7 @@
     private BackgroundDeviceAction mBackgroundThread;
 
     /** Uploads the current buffer of Crashes to the phone under the current test name. */
-    private static void upload(ITestDevice device, String testname, ArrayList<Crash> crashes) {
+    private static void upload(ITestDevice device, String testname, List<Crash> crashes) {
         try {
             if (testname == null) {
                 CLog.logAndDisplay(LogLevel.ERROR, "Attempted upload with no test name");
@@ -113,7 +114,7 @@
     private class CrashReporterReceiver extends MultiLineReceiver {
 
         private String mTestName;
-        private ArrayList<Crash> mCrashes;
+        private List<Crash> mCrashes;
         private StringBuilder mLogcatChunk;
         private ITestDevice mDevice;
 
diff --git a/common/util/src/com/android/compatibility/common/util/Crash.java b/common/util/src/com/android/compatibility/common/util/Crash.java
index 190ec39..0c55400 100644
--- a/common/util/src/com/android/compatibility/common/util/Crash.java
+++ b/common/util/src/com/android/compatibility/common/util/Crash.java
@@ -16,28 +16,39 @@
 
 package com.android.compatibility.common.util;
 
-import java.util.Objects;
-import java.io.Serializable;
 import javax.annotation.Nullable;
+import java.io.Serializable;
+import java.util.Objects;
+import java.math.BigInteger;
 
 public class Crash implements Serializable {
 
     public static final long serialVersionUID = 42L;
+
     public final int pid;
     public final int tid;
-    @Nullable
-    public final String name;
-    @Nullable
-    public final Long faultAddress;
-    @Nullable
+    public final String threadName;
+    public final String process;
+    @Nullable // the fault address is not always present in the log
+    public final BigInteger faultAddress;
     public final String signal;
+    @Nullable
+    public final String crashString;
 
-    public Crash(int pid, int tid, String name, Long faultAddress, String signal) {
+    public Crash(int pid, int tid, String threadName, String process,
+            BigInteger faultAddress, String signal) {
+        this(pid, tid, threadName, process, faultAddress, signal, null);
+    }
+
+    public Crash(int pid, int tid, String threadName, String process,
+            BigInteger faultAddress, String signal, String crashString) {
         this.pid = pid;
         this.tid = tid;
-        this.name = name;
+        this.threadName = threadName;
+        this.process = process;
         this.faultAddress = faultAddress;
         this.signal = signal;
+        this.crashString = crashString;
     }
 
     @Override
@@ -45,8 +56,10 @@
         return "Crash{" +
             "pid=" + pid +
             ", tid=" + tid +
-            ", name=" + name +
-            ", faultAddress=" + faultAddress +
+            ", threadName=" + threadName +
+            ", process=" + process +
+            ", faultAddress=" +
+                    (faultAddress == null ? "--------" : "0x" + faultAddress.toString(16)) +
             ", signal=" + signal +
             '}';
     }
@@ -62,13 +75,14 @@
         Crash crash = (Crash) object;
         return pid == crash.pid &&
             tid == crash.tid &&
-            Objects.equals(name, crash.name) &&
+            Objects.equals(threadName, crash.threadName) &&
+            Objects.equals(process, crash.process) &&
             Objects.equals(faultAddress, crash.faultAddress) &&
             Objects.equals(signal, crash.signal);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(pid, tid, name, faultAddress, signal);
+        return Objects.hash(pid, tid, threadName, process, faultAddress, signal);
     }
-}
\ No newline at end of file
+}
diff --git a/common/util/src/com/android/compatibility/common/util/CrashUtils.java b/common/util/src/com/android/compatibility/common/util/CrashUtils.java
index 715e43d..93d2d2d 100644
--- a/common/util/src/com/android/compatibility/common/util/CrashUtils.java
+++ b/common/util/src/com/android/compatibility/common/util/CrashUtils.java
@@ -16,15 +16,23 @@
 
 package com.android.compatibility.common.util;
 
+import java.io.File;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.stream.Stream;
+import java.util.stream.Collectors;
+import java.math.BigInteger;
 
 /** Contains helper functions and shared constants for crash parsing. */
 public class CrashUtils {
     // used to only detect actual addresses instead of nullptr and other unlikely values
-    public static final long MIN_CRASH_ADDR = 0x8000;
+    public static final BigInteger MIN_CRASH_ADDR = new BigInteger("8000", 16);
+
     // Matches the end of a crash
     public static final Pattern sEndofCrashPattern =
             Pattern.compile("DEBUG\\s+?:\\s+?backtrace:");
@@ -52,42 +60,62 @@
             Pattern.compile("(?i)Abort message.*?CHECK_");
 
     /**
+     * returns true if the signal is a segmentation fault or bus error.
+     */
+    public static boolean isSecuritySignal(Crash c) {
+        return c.signal.toLowerCase().matches("sig(segv|bus)");
+    }
+
+    /**
+     * returns the filename of the process.
+     * e.g. "/system/bin/mediaserver" returns "mediaserver"
+     */
+    public static String getProcessFileName(Crash c) {
+        return new File(c.process).getName();
+    }
+
+    /**
      * Determines if the given input has a {@link com.android.compatibility.common.util.Crash} that
      * should fail an sts test
      *
-     * @param processNames list of applicable process names
+     * @param processPatterns list of patterns that match applicable process names
      * @param checkMinAddr if the minimum fault address should be respected
      * @param crashes list of crashes to check
      * @return if a crash is serious enough to fail an sts test
      */
-    public static boolean detectCrash(
-        String[] processNames, boolean checkMinAddr, List<Crash> crashes) {
-        for (Crash crash : crashes) {
-            if (!crash.signal.toLowerCase().matches("sig(segv|bus)")) {
-                continue;
-            }
+    public static boolean securityCrashDetected(
+            List<Crash> crashes, boolean checkMinAddr, Pattern... processPatterns) {
+        return !matchSecurityCrashes(crashes, checkMinAddr, processPatterns).isEmpty();
+    }
 
-            if (checkMinAddr) {
-                if (crash.faultAddress != null && crash.faultAddress < MIN_CRASH_ADDR) {
-                    continue;
-                }
-            }
+    /**
+     * Determines which given inputs have a {@link com.android.compatibility.common.util.Crash} that
+     * should fail an sts test
+     *
+     * @param processPatterns list of patterns that match applicable process names
+     * @param checkMinAddr if the minimum fault address should be respected
+     * @param crashes list of crashes to check
+     * @return the list of crashes serious enough to fail an sts test
+     */
+    public static List<Crash> matchSecurityCrashes(
+            List<Crash> crashes, boolean checkMinAddr, Pattern... processPatterns) {
+        return crashes.stream()
+            .filter(c -> matchesAny(getProcessFileName(c), processPatterns))
+            .filter(c -> isSecuritySignal(c))
+            .filter(c -> !checkMinAddr
+                    || c.faultAddress == null || c.faultAddress.compareTo(MIN_CRASH_ADDR) >= 0)
+            .collect(Collectors.toList());
+    }
 
-            boolean foundProcess = false;
-            for (String process : processNames) {
-                if (crash.name.equals(process)) {
-                    foundProcess = true;
-                    break;
-                }
+    /**
+     * returns true if the input matches any of the patterns.
+     */
+    private static boolean matchesAny(String input, Pattern... patterns) {
+        for (Pattern p : patterns) {
+            if (p.matcher(input).matches()) {
+                return true;
             }
-
-            if (!foundProcess) {
-                continue;
-            }
-
-            return true; // crash detected
         }
-
         return false;
     }
 
@@ -97,26 +125,28 @@
      * @param input logs to scan through
      * @return List of all crashes as Crash objects
      */
-    public static ArrayList<Crash> getAllCrashes(String input) {
-        ArrayList<Crash> crashes = new ArrayList<>();
+    public static List<Crash> getAllCrashes(String input) {
+        List<Crash> crashes = new ArrayList<>();
         Matcher crashBlobFinder = sCrashBlobPattern.matcher(input);
         while (crashBlobFinder.find()) {
             String crashStr = crashBlobFinder.group(0);
-            int tid = 0, pid = 0;
-            Long faultAddress = null;
-            String name = null, signal = null;
+            int tid = 0;
+            int pid = 0;
+            BigInteger faultAddress = null;
+            String name = null;
+            String process = null;
+            String signal = null;
 
             Matcher pidtidNameMatcher = sPidtidNamePattern.matcher(crashStr);
             if (pidtidNameMatcher.find()) {
                 try {
                     pid = Integer.parseInt(pidtidNameMatcher.group(1));
-                } catch (NumberFormatException e) {
-                }
+                } catch (NumberFormatException e) {}
                 try {
                     tid = Integer.parseInt(pidtidNameMatcher.group(2));
-                } catch (NumberFormatException e) {
-                }
+                } catch (NumberFormatException e) {}
                 name = pidtidNameMatcher.group(3).trim();
+                process = pidtidNameMatcher.group(4).trim();
             }
 
             Matcher faultLineMatcher = sFaultLinePattern.matcher(crashStr);
@@ -125,13 +155,12 @@
                 String faultAddrMatch = faultLineMatcher.group(2);
                 if (faultAddrMatch != null) {
                     try {
-                        faultAddress = Long.parseLong(faultAddrMatch, 16);
-                    } catch (NumberFormatException e) {
-                    }
+                        faultAddress = new BigInteger(faultAddrMatch, 16);
+                    } catch (NumberFormatException e) {}
                 }
             }
             if (!sAbortMessageCheckPattern.matcher(crashStr).find()) {
-                crashes.add(new Crash(pid, tid, name, faultAddress, signal));
+                crashes.add(new Crash(pid, tid, name, process, faultAddress, signal, crashStr));
             }
         }
 
diff --git a/common/util/tests/res/logcat.txt b/common/util/tests/res/logcat.txt
index ad778c7..b9d10d0 100644
--- a/common/util/tests/res/logcat.txt
+++ b/common/util/tests/res/logcat.txt
@@ -271,4 +271,66 @@
 11-25 19:47:35.597   940   940 F DEBUG   :     #24 pc 0003fa3b  /system/lib/libc.so (_ZL15__pthread_startPv+30)
 11-25 19:47:35.597   940   940 F DEBUG   :     #25 pc 0001a085  /system/lib/libc.so (__start_thread+6)
 11-25 19:47:35.837   940   940 F DEBUG   :
-11-25 19:47:35.837   940   940 F DEBUG   : Tombstone written to: /data/tombstones/tombstone_01
\ No newline at end of file
+11-25 19:47:35.837   940   940 F DEBUG   : Tombstone written to: /data/tombstones/tombstone_01
+--------- beginning of crash
+09-03 17:48:05.627 11071 11189 F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0xe9380000 in tid 11189 (synthetic_thread)
+09-03 17:48:05.707   359   359 W         : debuggerd: handling request: pid=11071 uid=1041 gid=1005 tid=11189
+09-03 17:48:05.796  7072  7072 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
+09-03 17:48:05.796  7072  7072 F DEBUG   : Build fingerprint: 'google/angler/angler:7.1.1/N4F26T/3687331:userdebug/dev-keys'
+09-03 17:48:05.796  7072  7072 F DEBUG   : Revision: '0'
+09-03 17:48:05.796  7072  7072 F DEBUG   : ABI: 'arm'
+09-03 17:48:05.796  7072  7072 F DEBUG   : pid: 11071, tid: 11189, name: synthetic_thread  >>> synthetic_process_0 <<<
+09-03 17:48:05.797  7072  7072 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xe9380000
+09-03 17:48:05.797  7072  7072 F DEBUG   :     r0 e9e7a240  r1 e9380000  r2 00000170  r3 00000000
+09-03 17:48:05.797  7072  7072 F DEBUG   :     r4 00000002  r5 00000000  r6 ec1e1f25  r7 eb6f8000
+09-03 17:48:05.797  7072  7072 F DEBUG   :     r8 00000000  r9 eb105204  sl 00000000  fp 000003c0
+09-03 17:48:05.797  7072  7072 F DEBUG   :     ip ebd3df18  sp eaf80688  lr ec1e1f41  pc ebd38dd6  cpsr 20000030
+09-03 17:48:05.805  7072  7072 F DEBUG   :
+09-03 17:48:05.805  7072  7072 F DEBUG   : backtrace:
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #00 pc 00002dd6  /system/lib/libaudioutils.so (memcpy_to_float_from_i16+5)
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #01 pc 00040f3d  /system/lib/libaudioflinger.so
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #02 pc 00040799  /system/lib/libaudioflinger.so
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #03 pc 00011178  /system/lib/libaudioflinger.so
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #04 pc 0003180b  /system/lib/libaudioflinger.so
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #05 pc 0002fe57  /system/lib/libaudioflinger.so
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #06 pc 0000e345  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+140)
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #07 pc 000470b3  /system/lib/libc.so (_ZL15__pthread_startPv+22)
+09-03 17:48:05.806  7072  7072 F DEBUG   :     #08 pc 00019e3d  /system/lib/libc.so (__start_thread+6)
+09-03 17:48:05.967 11272 11568 W NativeCrashListener: Couldn't find ProcessRecord for pid 11071
+09-03 17:48:05.969   359   359 W         : debuggerd: resuming target 11071
+09-03 17:48:05.981 11272 11307 I BootReceiver: Copying /data/tombstones/tombstone_01 to DropBox (SYSTEM_TOMBSTONE)
+09-03 17:48:06.067   394   394 I ServiceManager: service 'media.sound_trigger_hw' died
+06-15 19:57:33.607 12736 12761 D PermissionCache: checking android.permission.MODIFY_AUDIO_SETTINGS for uid=10197 => granted (698 us)
+--------- beginning of crash
+06-15 19:57:33.607 12736 12761 F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 12761 (synthetic_thread)
+06-15 19:57:33.608   379   379 W         : debuggerd: handling request: pid=12736 uid=1041 gid=1005 tid=12761
+06-15 19:57:33.670 26192 26192 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
+06-15 19:57:33.670 26192 26192 F DEBUG   : Build fingerprint: 'google/bullhead/bullhead:7.1.2/N2G48C/4104010:userdebug/dev-keys'
+06-15 19:57:33.670 26192 26192 F DEBUG   : Revision: 'rev_1.0'
+06-15 19:57:33.670 26192 26192 F DEBUG   : ABI: 'arm'
+06-15 19:57:33.670 26192 26192 F DEBUG   : pid: 12736, tid: 12761, name: synthetic_thread  >>> synthetic_process_1 <<<
+06-15 19:57:33.670 26192 26192 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
+06-15 19:57:33.670 26192 26192 F DEBUG   :     r0 00000000  r1 00000000  r2 0000005f  r3 00000000
+06-15 19:57:33.670 26192 26192 F DEBUG   :     r4 ffffffff  r5 00000000  r6 f14f9000  r7 00000001
+06-15 19:57:33.670 26192 26192 F DEBUG   :     r8 00000004  r9 f3353114  sl f3313900  fp 00000000
+06-15 19:57:33.670 26192 26192 F DEBUG   :     ip f3bd4d88  sp f127d9c8  lr f3b9cbc5  pc f3b65af4  cpsr 60000030
+06-15 19:57:33.676 26192 26192 F DEBUG   :
+06-15 19:57:33.676 26192 26192 F DEBUG   : backtrace:
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #00 pc 00018af4  /system/lib/libc.so (strlen+71)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #01 pc 0004fbc1  /system/lib/libc.so (__strlen_chk+4)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #02 pc 0000c599  /system/lib/libutils.so (_ZN7android7String8C2EPKc+12)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #03 pc 0002fdbf  /system/lib/libaudiopolicymanagerdefault.so (_ZNK7android18HwModuleCollection19getDeviceDescriptorEjPKcS2_b+458)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #04 pc 0001de47  /system/lib/libaudiopolicymanagerdefault.so (_ZN7android18AudioPolicyManager27setDeviceConnectionStateIntEj24audio_policy_dev_state_tPKcS3_+178)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #05 pc 0000a009  /system/lib/libaudiopolicyservice.so
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #06 pc 000a01a5  /system/lib/libmedia.so (_ZN7android20BnAudioPolicyService10onTransactEjRKNS_6ParcelEPS1_j+1256)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #07 pc 000359c3  /system/lib/libbinder.so (_ZN7android7BBinder8transactEjRKNS_6ParcelEPS1_j+70)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #08 pc 0003d1bb  /system/lib/libbinder.so (_ZN7android14IPCThreadState14executeCommandEi+702)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #09 pc 0003ce07  /system/lib/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+114)
+06-15 19:57:33.677 26192 26192 F DEBUG   :     #10 pc 0003d31b  /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+46)
+06-15 19:57:33.678 26192 26192 F DEBUG   :     #11 pc 0004f8c5  /system/lib/libbinder.so
+06-15 19:57:33.678 26192 26192 F DEBUG   :     #12 pc 0000e345  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+140)
+06-15 19:57:33.678 26192 26192 F DEBUG   :     #13 pc 000470b3  /system/lib/libc.so (_ZL15__pthread_startPv+22)
+06-15 19:57:33.678 26192 26192 F DEBUG   :     #14 pc 00019e3d  /system/lib/libc.so (__start_thread+6)
+06-15 19:57:33.839   934  2991 W NativeCrashListener: Couldn't find ProcessRecord for pid 12736
+06-15 19:57:33.846   934   952 I BootReceiver: Copying /data/tombstones/tombstone_01 to DropBox (SYSTEM_TOMBSTONE)
+
diff --git a/common/util/tests/src/com/android/compatibility/common/util/CrashUtilsTest.java b/common/util/tests/src/com/android/compatibility/common/util/CrashUtilsTest.java
index 431571eb..6a2ab6e 100644
--- a/common/util/tests/src/com/android/compatibility/common/util/CrashUtilsTest.java
+++ b/common/util/tests/src/com/android/compatibility/common/util/CrashUtilsTest.java
@@ -25,6 +25,8 @@
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.regex.Pattern;
+import java.math.BigInteger;
 
 import junit.framework.TestCase;
 
@@ -60,52 +62,67 @@
     @Test
     public void testGetAllCrashes() throws Exception {
         List<Crash> expectedResults = new ArrayList<>();
-        expectedResults.add(new Crash(11071, 11189, "AudioOut_D", 3912761344L, "SIGSEGV"));
-        expectedResults.add(new Crash(12736, 12761, "Binder:12736_2", 0L, "SIGSEGV"));
-        expectedResults.add(new Crash(26201, 26227, "Binder:26201_3", 0L, "SIGSEGV"));
-        expectedResults.add(new Crash(26246, 26282, "Binder:26246_5", 0L, "SIGSEGV"));
-        expectedResults.add(new Crash(245, 245, "installd", null, "SIGABRT"));
-        expectedResults.add(new Crash(6371, 8072, "media.codec", 3976200192L, "SIGSEGV"));
-        expectedResults.add(new Crash(8373, 8414, "loo", null, "SIGABRT"));
+        expectedResults.add(new Crash(11071, 11189, "AudioOut_D", "/system/bin/audioserver",
+                new BigInteger("e9380000", 16), "SIGSEGV"));
+        expectedResults.add(new Crash(12736, 12761, "Binder:12736_2", "/system/bin/audioserver",
+                new BigInteger("0", 16), "SIGSEGV"));
+        expectedResults.add(new Crash(26201, 26227, "Binder:26201_3", "/system/bin/audioserver",
+                new BigInteger("0", 16), "SIGSEGV"));
+        expectedResults.add(new Crash(26246, 26282, "Binder:26246_5", "/system/bin/audioserver",
+                new BigInteger("0", 16), "SIGSEGV"));
+        expectedResults.add(new Crash(245, 245, "installd", "/system/bin/installd",
+                null, "SIGABRT"));
+        expectedResults.add(new Crash(6371, 8072, "media.codec", "omx@1.0-service",
+                new BigInteger("ed000000", 16), "SIGSEGV"));
+        expectedResults.add(new Crash(8373, 8414, "loo", "com.android.bluetooth",
+                null, "SIGABRT"));
+        expectedResults.add(new Crash(11071, 11189, "synthetic_thread", "synthetic_process_0",
+                new BigInteger("e9380000", 16), "SIGSEGV"));
+        expectedResults.add(new Crash(12736, 12761, "synthetic_thread", "synthetic_process_1",
+                new BigInteger("0", 16), "SIGSEGV"));
 
         assertEquals(expectedResults, mCrashes);
     }
 
     @Test
     public void testValidCrash() throws Exception {
-        assertTrue(CrashUtils.detectCrash(new String[]{"AudioOut_D"}, true, mCrashes));
+        assertTrue(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("synthetic_process_0")));
     }
 
     @Test
     public void testMissingName() throws Exception {
-        assertFalse(CrashUtils.detectCrash(new String[]{""}, true, mCrashes));
+        assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("")));
     }
 
     @Test
     public void testSIGABRT() throws Exception {
-        assertFalse(CrashUtils.detectCrash(new String[]{"installd"}, true, mCrashes));
+        assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("installd")));
     }
 
     @Test
     public void testFaultAddressBelowMin() throws Exception {
-        assertFalse(
-            CrashUtils.detectCrash(new String[]{"Binder:12736_2"}, true, mCrashes));
+        assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("synthetic_process_1")));
     }
 
     @Test
     public void testIgnoreMinAddressCheck() throws Exception {
-        assertTrue(
-            CrashUtils.detectCrash(new String[]{"Binder:12736_2"}, false, mCrashes));
+        assertTrue(CrashUtils.securityCrashDetected(mCrashes, false,
+                Pattern.compile("synthetic_process_1")));
     }
 
     @Test
     public void testBadAbortMessage() throws Exception {
-        assertFalse(CrashUtils.detectCrash(new String[]{"generic"}, true, mCrashes));
+        assertFalse(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("generic")));
     }
 
     @Test
     public void testGoodAndBadCrashes() throws Exception {
-        assertTrue(
-            CrashUtils.detectCrash(new String[]{"AudioOut_D", "generic"}, true, mCrashes));
+        assertTrue(CrashUtils.securityCrashDetected(mCrashes, true,
+                Pattern.compile("synthetic_process_0"), Pattern.compile("generic")));
     }
-}
\ No newline at end of file
+}
