From 85fae85d2c0c7d00047897d568dc042cf8e07dc4 Mon Sep 17 00:00:00 2001 From: renwj Date: Mon, 22 Nov 2021 11:45:10 +0800 Subject: [PATCH] =?UTF-8?q?[BuglyFix]=E4=BF=AE=E6=AD=A3FinalizerWatchdogDa?= =?UTF-8?q?emon=E7=BA=BF=E7=A8=8B=E5=90=8E=E5=8F=B0=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E6=97=B6=E6=8A=A5TimeOutException?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.gradle | 3 ++ foudations/mogo-commons/build.gradle | 1 + .../com/mogo/commons/AbsMogoApplication.java | 2 + .../commons/crash/FinalizeCrashFixer.java | 53 +++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 foudations/mogo-commons/src/main/java/com/mogo/commons/crash/FinalizeCrashFixer.java diff --git a/config.gradle b/config.gradle index 18ae8f664c..c1d826e5b9 100644 --- a/config.gradle +++ b/config.gradle @@ -124,6 +124,9 @@ ext { androidxroomruntime : "androidx.room:room-runtime:2.2.3", androidxroomcompiler : "androidx.room:room-compiler:2.2.3", androidxroomktx : "androidx.room:room-ktx:2.2.3", + + // androidx-lifecycle-process + androidxlifecycleprocess : "androidx.lifecycle:lifecycle-process:2.4.0", // rxjava2 with room roomRxjava : 'androidx.room:room-rxjava2:2.2.3', circleimageview : "de.hdodenhof:circleimageview:3.0.1", diff --git a/foudations/mogo-commons/build.gradle b/foudations/mogo-commons/build.gradle index 8765333d4d..12dabb7c5f 100644 --- a/foudations/mogo-commons/build.gradle +++ b/foudations/mogo-commons/build.gradle @@ -43,6 +43,7 @@ dependencies { implementation rootProject.ext.dependencies.rxjava api rootProject.ext.dependencies.mogoaicloudrealtime implementation rootProject.ext.dependencies.amapnavi3dmap + implementation rootProject.ext.dependencies.androidxlifecycleprocess if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.mogoutils diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java index 05fb0dc151..f335372b02 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java @@ -16,6 +16,7 @@ import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.aicloud.services.httpdns.IMogoHttpDns; import com.mogo.aicloud.services.httpdns.MogoHttpDnsHandler; import com.mogo.commons.analytics.AnalyticsUtils; +import com.mogo.commons.crash.FinalizeCrashFixer; import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.device.Devices; import com.mogo.commons.network.AllAllowedHostnameVerifier; @@ -59,6 +60,7 @@ public abstract class AbsMogoApplication extends Application { public void onCreate() { super.onCreate(); sApp = this; + FinalizeCrashFixer.fix(); initARouter(); Utils.init(this); if (shouldInit()) { diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/crash/FinalizeCrashFixer.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/crash/FinalizeCrashFixer.java new file mode 100644 index 0000000000..2225d8aa17 --- /dev/null +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/crash/FinalizeCrashFixer.java @@ -0,0 +1,53 @@ +package com.mogo.commons.crash; + +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleEventObserver; +import androidx.lifecycle.ProcessLifecycleOwner; +import com.mogo.utils.logger.Logger; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public class FinalizeCrashFixer { + + private static void realFix() { + try { + Class clazz = Class.forName("java.lang.Daemons$FinalizerWatchdogDaemon"); + if (clazz.getSuperclass() != null) { + Field instance = clazz.getDeclaredField("INSTANCE"); + instance.setAccessible(true); + Method isRunningMethod = clazz.getSuperclass().getDeclaredMethod("isRunning"); + isRunningMethod.setAccessible(true); + boolean running = (boolean) isRunningMethod.invoke(instance.get(null)); + if (running) { + // 只有正在执行的情况下才去调用 stop,避免无意义的调用导致产生 Throwable 异常 + Method stopMethod = clazz.getSuperclass().getDeclaredMethod("stop"); + stopMethod.setAccessible(true); + stopMethod.invoke(instance.get(null)); + } + } + } catch (Throwable e) { + e.printStackTrace(); + } + } + + /** + * 只有线程在运行状态才会关闭线程 + */ + public static void fix() { + ProcessLifecycleOwner.get().getLifecycle().addObserver((LifecycleEventObserver) (source, event) -> { + if (event == Lifecycle.Event.ON_START) { + //前后台则重新反射关闭一遍,避免线程被再次开启 + Logger.d("FinalizeCrashFixer", "--- 切换到前台 ---"); + realFix(); + } + + if (event == Lifecycle.Event.ON_STOP) { + //前后台则重新反射关闭一遍,避免线程被再次开启 + Logger.d("FinalizeCrashFixer", "--- 切换到后台 ---"); + realFix(); + } + + }); + } + +} \ No newline at end of file