diff --git a/tests/hostside/java/com/android/microdroid/test/MicrodroidTestCase.java b/tests/hostside/java/com/android/microdroid/test/MicrodroidTestCase.java
index 48dd1e0..c9cfd72 100644
--- a/tests/hostside/java/com/android/microdroid/test/MicrodroidTestCase.java
+++ b/tests/hostside/java/com/android/microdroid/test/MicrodroidTestCase.java
@@ -38,6 +38,7 @@
 import android.cts.statsdatom.lib.ReportUtils;
 
 import com.android.compatibility.common.util.CddTest;
+import com.android.microdroid.test.common.ProcessUtil;
 import com.android.microdroid.test.host.CommandRunner;
 import com.android.microdroid.test.host.MicrodroidHostTestCaseBase;
 import com.android.os.AtomsProto;
@@ -700,20 +701,11 @@
         shutdownMicrodroid(getDevice(), cid);
     }
 
-    private static class ProcessInfo {
-        public final String mName;
-        public final int mPid;
-
-        ProcessInfo(String name, int pid) {
-            mName = name;
-            mPid = pid;
-        }
-    }
-
-    // TODO(b/6184548): to be replaced by ProcessUtil
     /**
-    * @deprecated use ProcessUtil instead.
-    */
+     * TODO(b/249409434): to be replaced by ProcessUtil
+     *
+     * @deprecated use ProcessUtil instead.
+     */
     @Deprecated
     private Map<String, Long> parseMemInfo(String file) {
         Map<String, Long> stats = new HashMap<>();
@@ -727,54 +719,16 @@
         return stats;
     }
 
-    // TODO(b/6184548): to be replaced by ProcessUtil
     /**
-    * @deprecated use ProcessUtil instead.
-    */
-    @Deprecated
-    private String skipFirstLine(String str) {
-        int index = str.indexOf("\n");
-        return (index < 0) ? "" : str.substring(index + 1);
-    }
-
-    // TODO(b/6184548): to be replaced by ProcessUtil
-    /**
-    * @deprecated use ProcessUtil instead.
-    */
-    @Deprecated
-    private List<ProcessInfo> getRunningProcessesList() {
-        List<ProcessInfo> list = new ArrayList<ProcessInfo>();
-        skipFirstLine(runOnMicrodroid("ps", "-Ao", "PID,NAME")).lines().forEach(ps -> {
-            // Each line is '  <pid> <name>'.
-            ps = ps.trim();
-            int space = ps.indexOf(" ");
-            list.add(new ProcessInfo(
-                    ps.substring(space + 1),
-                    Integer.parseInt(ps.substring(0, space))));
-        });
-
-        return list;
-    }
-
-    // TODO(b/6184548): to be replaced by ProcessUtil
-    /**
-    * @deprecated use ProcessUtil instead.
-    */
+     * TODO(b/249409434): to be replaced by ProcessUtil
+     *
+     * @deprecated use ProcessUtil instead.
+     */
     @Deprecated
     private Map<String, Long> getProcMemInfo() {
         return parseMemInfo(runOnMicrodroid("cat", "/proc/meminfo"));
     }
 
-    // TODO(b/6184548): to be replaced by ProcessUtil
-    /**
-    * @deprecated use ProcessUtil instead.
-    */
-    @Deprecated
-    private Map<String, Long> getProcSmapsRollup(int pid) {
-        String path = "/proc/" + pid + "/smaps_rollup";
-        return  parseMemInfo(skipFirstLine(runOnMicrodroid("cat", path, "||", "true")));
-    }
-
     @Test
     public void testMicrodroidRamUsage() throws Exception {
         final String configPath = "assets/vm_config.json";
@@ -798,11 +752,14 @@
                     stat.getValue().toString());
         }
 
-        for (ProcessInfo proc : getRunningProcessesList()) {
-            for (Map.Entry<String, Long> stat : getProcSmapsRollup(proc.mPid).entrySet()) {
+        for (Map.Entry<Integer, String> proc :
+                ProcessUtil.getProcessMap(cmd -> runOnMicrodroid(cmd)).entrySet()) {
+            for (Map.Entry<String, Long> stat :
+                    ProcessUtil.getProcessSmapsRollup(proc.getKey(), cmd -> runOnMicrodroid(cmd))
+                            .entrySet()) {
                 String name = stat.getKey().toLowerCase();
                 mMetrics.addTestMetric(
-                        mMetricPrefix + "smaps/" + name + "/" + proc.mName,
+                        mMetricPrefix + "smaps/" + name + "/" + proc.getValue(),
                         stat.getValue().toString());
             }
         }
