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);
}