Merge "Fix the length of a profiler system property"
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 0834a84..0d2cdb9 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -875,9 +875,17 @@
         parseRuntimeOption("dalvik.vm.profile.stack-depth",
                            profileMaxStackDepth,
                            "-Xprofile-max-stack-depth:");
-    }
 
-    parseRuntimeOption("ro.dalvik.vm.native.bridge", nativeBridgeLibrary, "-XX:NativeBridge=");
+        // Native bridge library. "0" means that native bridge is disabled.
+        property_get("ro.dalvik.vm.native.bridge", propBuf, "");
+        if (propBuf[0] == '\0') {
+            ALOGW("ro.dalvik.vm.native.bridge is not expected to be empty");
+        } else if (strcmp(propBuf, "0") != 0) {
+            snprintf(nativeBridgeLibrary, sizeof("-XX:NativeBridge=") + PROPERTY_VALUE_MAX,
+                     "-XX:NativeBridge=%s", propBuf);
+            addOption(nativeBridgeLibrary);
+        }
+    }
 
     initArgs.version = JNI_VERSION_1_4;
     initArgs.options = mOptions.editArray();
diff --git a/services/java/com/android/server/pm/Installer.java b/services/java/com/android/server/pm/Installer.java
index 0f384b1..4fd9277 100644
--- a/services/java/com/android/server/pm/Installer.java
+++ b/services/java/com/android/server/pm/Installer.java
@@ -240,11 +240,12 @@
         builder.append(" *");         // No pkgName arg present
         builder.append(' ');
         builder.append(instructionSet);
+        builder.append(" 0");         // vmSafeMode=false
         return execute(builder.toString());
     }
 
     public int dexopt(String apkPath, int uid, boolean isPublic, String pkgName,
-            String instructionSet) {
+            String instructionSet, boolean vmSafeMode) {
         StringBuilder builder = new StringBuilder("dexopt");
         builder.append(' ');
         builder.append(apkPath);
@@ -255,6 +256,7 @@
         builder.append(pkgName);
         builder.append(' ');
         builder.append(instructionSet);
+        builder.append(vmSafeMode ? " 1" : " 0");
         return execute(builder.toString());
     }
 
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index cb41d72..4cbf845 100755
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -4293,6 +4293,7 @@
             }
         }
 
+        final boolean vmSafeMode = (pkg.applicationInfo.flags & ApplicationInfo.FLAG_VM_SAFE_MODE) != 0;
         boolean performed = false;
         if ((pkg.applicationInfo.flags&ApplicationInfo.FLAG_HAS_CODE) != 0) {
             String path = pkg.mScanPath;
@@ -4309,10 +4310,11 @@
                 // 2.) we are defering a needed dexopt
                 // 3.) we are skipping an unneeded dexopt
                 if (forceDex || (!defer && isDexOptNeededInternal == DexFile.DEXOPT_NEEDED)) {
-                    Log.i(TAG, "Running dexopt on: " + pkg.applicationInfo.packageName);
+                    Log.i(TAG, "Running dexopt on: " + pkg.applicationInfo.packageName
+                            + " vmSafeMode=" + vmSafeMode);
                     final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
                     int ret = mInstaller.dexopt(path, sharedGid, !isForwardLocked(pkg),
-                                                pkg.packageName, dexCodeInstructionSet);
+                                                pkg.packageName, dexCodeInstructionSet, vmSafeMode);
                     // Note that we ran dexopt, since rerunning will
                     // probably just result in an error again.
                     pkg.mDexOptNeeded = false;