Merge changes Ib7d53620,I2d4c5d64 am: bca1b9dab1

Change-Id: Icfe823bf2238e912f63313c5de2f4e511f5b033a
diff --git a/metrictests/memory/apps/AndroidManifest.xml b/metrictests/memory/apps/AndroidManifest.xml
index a8856aa..a4b3488 100644
--- a/metrictests/memory/apps/AndroidManifest.xml
+++ b/metrictests/memory/apps/AndroidManifest.xml
@@ -18,7 +18,9 @@
     package="libcore.heapdumper">
 
     <uses-sdk android:minSdkVersion="19" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
 
     <instrumentation
             android:name="libcore.heapdumper.HeapDumpInstrumentation"
diff --git a/metrictests/memory/apps/src/libcore/heapdumper/Actions.java b/metrictests/memory/apps/src/libcore/heapdumper/Actions.java
index e8b56f1..e5ef4ba 100644
--- a/metrictests/memory/apps/src/libcore/heapdumper/Actions.java
+++ b/metrictests/memory/apps/src/libcore/heapdumper/Actions.java
@@ -19,6 +19,8 @@
 import java.text.Collator;
 import java.util.Arrays;
 import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * An enumeration of actions for which we'd like to measure the effect on the post-GC heap.
@@ -65,6 +67,33 @@
         }
     },
 
+    REGEX {
+        @Override
+        public void run() {
+            final String sequence = "foo 123 bar baz";
+            Pattern p = Pattern.compile("foo (\\d+) bar (\\w+)");
+            Matcher m = p.matcher(sequence);
+
+            boolean found = m.find();
+            boolean matches = m.matches();
+            int groups = m.groupCount();
+            String first = m.group(1);
+            String second = m.group(2);
+            boolean hitEnd = m.hitEnd();
+
+            // Set region to prefix of the original sequence
+            m.region(0, "foo 123".length());
+            boolean matchesPrefix = m.lookingAt();
+            boolean requireEnd = m.requireEnd();
+
+            m.useTransparentBounds(true);
+            boolean matchesPrefixTransparentBounds = m.lookingAt();
+
+            m.useAnchoringBounds(true);
+            boolean matchesPrefixAnchoringBounds = m.lookingAt();
+        }
+    }
+
     ;
 
     private static void useCollatorForLocale(Locale locale) {
diff --git a/metrictests/memory/host/src/libcore/heapmetrics/LibcoreHeapMetricsTest.java b/metrictests/memory/host/src/libcore/heapmetrics/LibcoreHeapMetricsTest.java
index 5340d90..2231614 100644
--- a/metrictests/memory/host/src/libcore/heapmetrics/LibcoreHeapMetricsTest.java
+++ b/metrictests/memory/host/src/libcore/heapmetrics/LibcoreHeapMetricsTest.java
@@ -103,6 +103,12 @@
         recordBeforeAndAfterAppHeapMetrics(result.getBeforeDump(), result.getAfterDump());
     }
 
+    @Test
+    public void measureRegexes() throws Exception {
+        MetricsRunner.Result result = metricsRunner.runAllInstrumentations("REGEX");
+        recordBeforeAndAfterAppHeapMetrics(result.getBeforeDump(), result.getAfterDump());
+    }
+
     private void recordHeapMetrics(AhatSnapshot dump, String metricPrefix, String heapName) {
         AhatHeap heap = dump.getHeap(heapName);
         recordSizeMetric(metricPrefix, heap.getSize());
diff --git a/metrictests/memory/host/src/libcore/heapmetrics/MetricsRunner.java b/metrictests/memory/host/src/libcore/heapmetrics/MetricsRunner.java
index c3f9e0d..00d5554 100644
--- a/metrictests/memory/host/src/libcore/heapmetrics/MetricsRunner.java
+++ b/metrictests/memory/host/src/libcore/heapmetrics/MetricsRunner.java
@@ -155,7 +155,7 @@
             String action, String relativeDirectoryName, String deviceDirectoryName, String apk)
             throws DeviceNotAvailableException, IOException {
         String command = String.format(
-                "am instrument -w -e dumpdir %s -e action %s  %s",
+                "am instrument --no-isolated-storage -w -e dumpdir %s -e action %s  %s",
                 relativeDirectoryName, action, apk);
         testDevice.executeShellCommand(command);
         checkForErrorFile(deviceDirectoryName);