Detect system-wide safe mode and configure the VM accordingly.

For the system server process, do the disableJitCompilation/startJitCompilation
callbacks depending on whether the system is in safe mode or not.

In addition, if the system is found to be in safe mode, a flag will be set in
the Zygote class which will be used to launch subsequent apps in VM safe mode.

Bug: 2267590
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 28b4b28b..a09896a 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -22,6 +22,7 @@
 import com.android.internal.os.SamplingProfilerIntegration;
 
 import dalvik.system.VMRuntime;
+import dalvik.system.Zygote;
 
 import android.app.ActivityManagerNative;
 import android.bluetooth.BluetoothAdapter;
@@ -396,8 +397,15 @@
         if (safeMode) {
             try {
                 ActivityManagerNative.getDefault().enterSafeMode();
+                // Post the safe mode state in the Zygote class
+                Zygote.systemInSafeMode = true;
+                // Disable the JIT for the system_server process
+                VMRuntime.getRuntime().disableJitCompilation();
             } catch (RemoteException e) {
             }
+        } else {
+            // Enable the JIT for the system_server process
+            VMRuntime.getRuntime().startJitCompilation();
         }
 
         // It is now time to start up the app processes...
@@ -519,7 +527,6 @@
         // The system server has to run all of the time, so it needs to be
         // as efficient as possible with its memory usage.
         VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
-        VMRuntime.getRuntime().startJitCompilation();
         
         System.loadLibrary("android_servers");
         init1(args);
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 8a73e99..3ecfd8a 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -1940,7 +1940,10 @@
             if ((app.info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
                 debugFlags |= Zygote.DEBUG_ENABLE_DEBUGGER;
             }
-            if ((app.info.flags & ApplicationInfo.FLAG_VM_SAFE_MODE) != 0) {
+            // Run the app in safe mode if its manifest requests so or the
+            // system is booted in safe mode.
+            if ((app.info.flags & ApplicationInfo.FLAG_VM_SAFE_MODE) != 0 ||
+                Zygote.systemInSafeMode == true) {
                 debugFlags |= Zygote.DEBUG_ENABLE_SAFEMODE;
             }
             if ("1".equals(SystemProperties.get("debug.checkjni"))) {