Use native brige only if we have a private data directory.

Bug: 18027433

(cherry picked from commit 6a4d2369e5493cea86817634eceb0be46ba7d7a6)

Change-Id: I08b4e7172cd66c9006c26f07e3399848999cd74d
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 1eb83b2..4f5e08b 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -436,10 +436,6 @@
   pid_t pid = fork();
 
   if (pid == 0) {
-    if (!is_system_server && dataDir == NULL) {
-        ALOGE("Application private dir cannot be null");
-        RuntimeAbort(env);
-    }
     // The child process.
     gMallocLeakZygoteChild = 1;
 
@@ -462,6 +458,14 @@
       ScopedUtfChars isa_string(env, instructionSet);
       use_native_bridge = android::NeedsNativeBridge(isa_string.c_str());
     }
+    if (use_native_bridge && dataDir == NULL) {
+      // dataDir should never be null if we need to use a native bridge.
+      // In general, dataDir will never be null for normal applications. It can only happen in
+      // special cases (for isolated processes which are not associated with any app). These are
+      // launched by the framework and should not be emulated anyway.
+      use_native_bridge = false;
+      ALOGW("Native bridge will not be used because dataDir == NULL.");
+    }
 
     if (!MountEmulatedStorage(uid, mount_external, use_native_bridge)) {
       ALOGW("Failed to mount emulated storage: %s", strerror(errno));