diff --git a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXConfigAdapter.java b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXConfigAdapter.java index 9eee5b0916..84de459ca4 100644 --- a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXConfigAdapter.java +++ b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXConfigAdapter.java @@ -24,4 +24,5 @@ */ public interface IWXConfigAdapter { String getConfig(String nameSpace,String key,String defaultValue); + String getConfigWhenInit(String nameSpace,String key,String defaultValue); } diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java index 4446d746e5..8c31da15a1 100755 --- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java +++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java @@ -2274,6 +2274,16 @@ private WXParams assembleDefaultOptions() { customOptions.put("__enable_native_promise__","true"); } + String enableAlarmSignal = "true"; + IWXConfigAdapter adapter = WXSDKManager.getInstance().getWxConfigAdapter(); + if (null != adapter){ + try { + enableAlarmSignal = adapter.getConfigWhenInit("wxapm","enableAlarmSignal",enableAlarmSignal); + }catch (Exception e){ + e.printStackTrace(); + } + } + customOptions.put("enableAlarmSignal",enableAlarmSignal); wxParams.setOptions(customOptions); wxParams.setNeedInitV8(WXSDKManager.getInstance().needInitV8()); diff --git a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp index fa4cb0253b..fc4a1f8f8a 100644 --- a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp +++ b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp @@ -101,6 +101,7 @@ __attribute__((visibility("default"))) extern "C" int serverMain(int argc, char namespace weex { namespace bridge { namespace js { + bool ScriptBridgeInMultiProcess::has_read_alarm_config = false; static inline const char* GetUTF8StringFromIPCArg(IPCArguments* arguments, size_t index) { return arguments->getByteArray(index)->length == 0 ? nullptr : arguments->getByteArray(index)->content; @@ -275,6 +276,20 @@ namespace weex { WeexEnv::getEnv()->set_m_cache_task_(enable); } } + if (!has_read_alarm_config){ +#ifdef USE_JS_RUNTIME + std::string type = init_framework_params->type->content; + std::string value = init_framework_params->value->content; +#else + auto type = String::fromUTF8(init_framework_params->type->content); + auto value = String::fromUTF8(init_framework_params->value->content); +#endif + if (type == "enableAlarmSignal"){ + has_read_alarm_config = true; + auto enable = value =="true"; + WeexEnv::getEnv()->enableHandleAlarmSignal(enable); + } + } params.push_back(init_framework_params); } diff --git a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.h b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.h index c0163c82bf..7190ef3345 100644 --- a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.h +++ b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.h @@ -71,6 +71,7 @@ class ScriptBridgeInMultiProcess : public WeexCore::ScriptBridge { private: static ScriptBridgeInMultiProcess* g_instance; DISALLOW_COPY_AND_ASSIGN(ScriptBridgeInMultiProcess); + static bool has_read_alarm_config; }; } // namespace js } // namespace bridge diff --git a/weex_core/Source/android/jsengine/object/weex_env.h b/weex_core/Source/android/jsengine/object/weex_env.h index 4793735b44..053c72723f 100644 --- a/weex_core/Source/android/jsengine/object/weex_env.h +++ b/weex_core/Source/android/jsengine/object/weex_env.h @@ -97,6 +97,9 @@ class WeexEnv { bool enableBackupThread() { return enableBackupThread__; } + inline void enableHandleAlarmSignal(bool enable){ + crashHandler->setEnableAlarmSignal(enable); + } void jsc_init_finished() { isJscInitOk_ = true; }; diff --git a/weex_core/Source/base/crash/crash_handler.cpp b/weex_core/Source/base/crash/crash_handler.cpp index 15197cad76..46f90b7223 100644 --- a/weex_core/Source/base/crash/crash_handler.cpp +++ b/weex_core/Source/base/crash/crash_handler.cpp @@ -57,6 +57,8 @@ DECLARE_SIGNAL(SIGTRAP) { 0, nullptr } }; +volatile sig_atomic_t is_sig_after_crash = 0; + /* static functions */ static bool isFileAccess(const char* file) { @@ -71,6 +73,12 @@ static bool isFileAccess(const char* file) return true; } +static void handleExitAlarm(int num, siginfo_t* info, void* ucontext){ + if (is_sig_after_crash){ + _exit(0); + } +} + static void crashSigAction(int num, siginfo_t* info, void* ucontext) { bool handled = false; @@ -163,6 +171,28 @@ bool CrashHandlerInfo::handleSignal(int signum, siginfo_t* siginfo, void* uconte //signal m_crash_occurs = true; + + if (handle_alarm_signal){ + //handleSignal maybe cause sig delivered deadLock,and maybe block weexCoreThread on ipc,then cause whiteScreen or other issue unless restart app + //cause 1:async-signal-safe http://man7.org/linux/man-pages/man7/signal-safety.7.html#top_of_page + //cause 2:other logic crash or dl. + //solution: google breakPad dump crash on a new process to avoid bugs. + //tmp solution: setTimeout 1s,force exit on handleExitAlarm(if has deadLock) + + + is_sig_after_crash =1; + + struct sigaction alarmSigaction = { 0 }; + alarmSigaction.sa_sigaction = handleExitAlarm; + alarmSigaction.sa_flags = SA_SIGINFO; + + + if (-1 == sigaction(SIGALRM, &alarmSigaction, nullptr)) { + _exit(0); + } + alarm(1); + } + LOG(INFO) << "CrashHandlerInfo::handleSignal"; const char* signalName = nullptr; for (int i = 0; s_hookSignals[i].signum; ++i) { diff --git a/weex_core/Source/base/crash/crash_handler.h b/weex_core/Source/base/crash/crash_handler.h index 9d76d673eb..0b695da8ae 100644 --- a/weex_core/Source/base/crash/crash_handler.h +++ b/weex_core/Source/base/crash/crash_handler.h @@ -39,6 +39,7 @@ class CrashHandlerInfo { int signum; const char* signame; }; + void setEnableAlarmSignal(bool handle){handle_alarm_signal = handle;} private: void printContext(); @@ -67,6 +68,7 @@ class CrashHandlerInfo { std::string m_fileContent; mcontext_t m_mcontext; volatile bool m_crash_occurs; + volatile bool handle_alarm_signal = true; }; } #endif /* CRASHHANDLER_H */