Merge branch 'release/20190925_mmap' into 'release/20190925'

[Android] fix mmap leak and zombie process

fix fix mmap leak and zombie process(child process died)

See merge request !603492
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
index 2898f13..a20b20f 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
@@ -19,6 +19,8 @@
 package com.taobao.weex.bridge;
 
 import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.adapter.IWXConfigAdapter;
 import com.taobao.weex.base.CalledByNative;
 import com.taobao.weex.utils.WXLogUtils;
 
@@ -142,6 +144,17 @@
     return deviceWidth;
   }
 
+  @CalledByNative
+  public boolean getReleaseMap() {
+    IWXConfigAdapter adapter = WXSDKManager.getInstance().getWxConfigAdapter();
+    if (null == adapter){
+      return false;
+    }
+    String doRelease = adapter.getConfigWhenInit("wxapm","release_map","true");
+    WXLogUtils.e("getReleaseMap:"+doRelease);
+    return "true".equalsIgnoreCase(doRelease);
+  }
+
 
   /**
    * Device should not be set manually, instead it suppose to represent the width of device and
diff --git a/weex_core/Source/android/multiprocess/weex_js_connection.cpp b/weex_core/Source/android/multiprocess/weex_js_connection.cpp
index 25e9673..51d25d9 100644
--- a/weex_core/Source/android/multiprocess/weex_js_connection.cpp
+++ b/weex_core/Source/android/multiprocess/weex_js_connection.cpp
@@ -181,10 +181,17 @@
       listener->listen();
     } catch (IPCException &e) {
         LOGE("IPCException server died %s",e.msg());
-        base::android::DetachFromVM();
         WeexCore::WeexCoreManager::Instance()->server_queue_= nullptr;
+        if (WeexCoreManager::Instance()->do_release_map()){
+            futexPageQueue.reset();
+        }
+        base::android::DetachFromVM();
         pthread_exit(NULL);
     }
+    WeexCore::WeexCoreManager::Instance()->server_queue_= nullptr;
+    if (WeexCoreManager::Instance()->do_release_map()){
+        futexPageQueue.reset();
+    }
     return nullptr;
 }
 
diff --git a/weex_core/Source/android/utils/params_utils.cpp b/weex_core/Source/android/utils/params_utils.cpp
index 5c8d05f..abeaa86 100644
--- a/weex_core/Source/android/utils/params_utils.cpp
+++ b/weex_core/Source/android/utils/params_utils.cpp
@@ -17,6 +17,7 @@
  * under the License.
  */
 
+#include <core/manager/weex_core_manager.h>
 #include "android/utils/params_utils.h"
 #include "android/base/string/string_utils.h"
 #include "android/utils/so_utils.h"
@@ -221,6 +222,15 @@
     }
   }
 
+  jmethodID m_release_map =  env->GetMethodID(c_params, "getReleaseMap", "()Z");
+  if (m_release_map == nullptr) {
+    WeexCoreManager::Instance()->set_release_map(false);
+    LOGE("m_release_map method is missing");
+  } else {
+    jboolean j_release_map_bool = env->CallBooleanMethod(params,m_release_map);
+    WeexCoreManager::Instance()->set_release_map(j_release_map_bool==JNI_TRUE);
+  }
+
   jmethodID m_get_jsc_so_path =
           env->GetMethodID(c_params, "getLibJscPath", "()Ljava/lang/String;");
   if (m_get_jsc_so_path != nullptr) {
diff --git a/weex_core/Source/core/manager/weex_core_manager.h b/weex_core/Source/core/manager/weex_core_manager.h
index 018099a..e2b5fee 100644
--- a/weex_core/Source/core/manager/weex_core_manager.h
+++ b/weex_core/Source/core/manager/weex_core_manager.h
@@ -48,7 +48,12 @@
   inline ScriptBridge *script_bridge() { return script_bridge_; }
 
   inline void set_script_bridge(ScriptBridge *script_bridge) {
+    ScriptBridge* pre_script_bridge  =  script_bridge_;
     script_bridge_ = script_bridge;
+    if (nullptr != pre_script_bridge && do_release_map()){
+        delete pre_script_bridge;
+        pre_script_bridge = nullptr;
+    }
   }
 
   inline void set_measure_function_adapter(MeasureFunctionAdapter *adapter) {
@@ -72,6 +77,9 @@
 
   inline weex::base::Thread *script_thread() { return script_thread_; }
 
+  inline bool do_release_map() { return release_map_; }
+  inline void set_release_map(bool release) {  release_map_ = release; }
+
   IPCFutexPageQueue* client_queue_;
   IPCFutexPageQueue* server_queue_;
 
@@ -81,6 +89,7 @@
   ScriptBridge *script_bridge_;
   ProjectMode project_mode_;
   weex::base::Thread *script_thread_;
+  volatile bool release_map_;
 
   WeexCoreManager()
       : platform_bridge_(nullptr),
@@ -89,7 +98,8 @@
         project_mode_(COMMON),
         script_thread_(nullptr),
         client_queue_(nullptr),
-        server_queue_(nullptr){};
+        server_queue_(nullptr),
+        release_map_(false){};
   ~WeexCoreManager(){};
 };
 }  // namespace WeexCore
diff --git a/weex_core/Source/third_party/IPC/IPCFutexPageQueue.cpp b/weex_core/Source/third_party/IPC/IPCFutexPageQueue.cpp
index 23cf890..7f11493 100644
--- a/weex_core/Source/third_party/IPC/IPCFutexPageQueue.cpp
+++ b/weex_core/Source/third_party/IPC/IPCFutexPageQueue.cpp
@@ -63,6 +63,7 @@
     } catch (IPCException& e) {
         IPC_LOGE("%s", e.msg());
     }
+    IPC_LOGE("do munmap")
     munmap(m_sharedMemory, m_pageSize << 2);
 }