From fac538933f17ca65b6635f09371322d28379bcb1 Mon Sep 17 00:00:00 2001 From: renwj Date: Tue, 21 Nov 2023 15:06:49 +0800 Subject: [PATCH 1/6] =?UTF-8?q?[6.2.0][=E6=8A=80=E6=9C=AF=E4=BC=98?= =?UTF-8?q?=E5=8C=96]=20=E6=B7=BB=E5=8A=A0dump=E4=B8=BB=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E5=A0=86=E6=A0=88=E6=A0=87=E8=AE=B0=E4=BD=8D=EF=BC=8C=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=E5=BA=94=E7=94=A8=E5=90=AF=E5=8A=A8=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E4=B8=AD=E8=80=97=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lancet/jank/spi/HookInvokerImpl.java | 55 ++++++++++++------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java b/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java index 677dc966ab..62593b36d9 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java +++ b/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java @@ -40,6 +40,7 @@ public class HookInvokerImpl implements IHookInvoker { private final long dumpStackThreshold = 20; // dump堆栈阈值 + private volatile boolean isCanDump = false; // 是否可以Dump堆栈,加此标记位是防止应用启动过程中,由于dump主线程堆栈导致启动耗时 // 切记: 请勿在此方法中调用其它模块类中的api,可能会出现StackOverFlowException @Override @@ -48,11 +49,8 @@ public class HookInvokerImpl implements IHookInvoker { boolean isMainThread = false; if (mainLooper == Looper.myLooper()) { isMainThread = true; - if (type == Type.SYNCHRONIZED_LOCK) { - handleSynchronizedLock(Looper.myLooper() == mainLooper, caller, methodName, objects); - } } - + handleSynchronizedLock(isMainThread, caller, methodName, objects); if (!getProviderRequested && provider == null && mainLooper != Looper.myLooper() && ARouterUtils.isInit.get()) { getProviderRequested = true; new Thread(() -> { @@ -128,7 +126,7 @@ public class HookInvokerImpl implements IHookInvoker { } builder.append("#").append(cost); - if (cost >= dumpStackThreshold) { + if (cost >= dumpStackThreshold && isCanDump) { builder.append("\n"); StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); for (StackTraceElement trace: stackTrace) { @@ -144,29 +142,48 @@ public class HookInvokerImpl implements IHookInvoker { private void handleActivity(Activity caller, String methodName) { if ("onCreate".equals(methodName)) { - IMoGoBlockProvider block = CallerDevaToolsManager.INSTANCE.block(); - if (block != null && block.hasInit()) { - block.monitor(caller.getWindow()); + try { + IMoGoBlockProvider block = CallerDevaToolsManager.INSTANCE.block(); + if (block != null && block.hasInit()) { + block.monitor(caller.getWindow()); + } + } catch (Throwable t) { + t.printStackTrace(); } } if ("onResume".equals(methodName)) { - IMoGoBlockProvider block = CallerDevaToolsManager.INSTANCE.block(); - if (block != null && block.hasInit()) { - block.resume(caller.getWindow()); + try { + IMoGoBlockProvider block = CallerDevaToolsManager.INSTANCE.block(); + if (block != null && block.hasInit()) { + block.resume(caller.getWindow()); + } + } catch (Throwable t) { + t.printStackTrace(); + } + if (!isCanDump) { + isCanDump = true; } } if ("onPause".equals(methodName)) { - IMoGoBlockProvider block = CallerDevaToolsManager.INSTANCE.block(); - if (block != null && block.hasInit()) { - block.pause(caller.getWindow()); + try { + IMoGoBlockProvider block = CallerDevaToolsManager.INSTANCE.block(); + if (block != null && block.hasInit()) { + block.pause(caller.getWindow()); + } + } catch (Throwable t) { + t.printStackTrace(); } } - if ("onDestroy".equals(methodName)) { - IMoGoBlockProvider block = CallerDevaToolsManager.INSTANCE.block(); - if (block != null && block.hasInit()) { - block.pop(caller.getWindow()); + if ("onStop".equals(methodName)) { + try { + IMoGoBlockProvider block = CallerDevaToolsManager.INSTANCE.block(); + if (block != null && block.hasInit()) { + block.pop(caller.getWindow()); + } + } catch (Throwable t) { + t.printStackTrace(); } } } @@ -225,7 +242,7 @@ public class HookInvokerImpl implements IHookInvoker { builder.append("#").append(holderDesc); } - if (elapsedTime >= dumpStackThreshold) { + if (elapsedTime >= dumpStackThreshold && isCanDump) { builder.append("\n"); StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); for (StackTraceElement trace: stackTrace) { From 095259e4fb06b2fe0e28d2752983bbc2d4f48111 Mon Sep 17 00:00:00 2001 From: renwj Date: Tue, 21 Nov 2023 16:37:09 +0800 Subject: [PATCH 2/6] =?UTF-8?q?[6.2.0][MemoryLeakFix]=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/mogo/launcher/lancet/MemoryLeakFix.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/lancet/MemoryLeakFix.kt b/app/src/main/java/com/mogo/launcher/lancet/MemoryLeakFix.kt index 40c7224eea..83575c6bf4 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/MemoryLeakFix.kt +++ b/app/src/main/java/com/mogo/launcher/lancet/MemoryLeakFix.kt @@ -43,6 +43,8 @@ internal class AccessSyntheticUtils { private val fields = ConcurrentHashMap>() private val observers = ConcurrentSet() + // true: 代表要执行原来的run方法体 + // false: 代表不执行原来的run方法体 @JvmStatic fun isTargetAlive(obj: Any): Boolean { try { @@ -118,9 +120,7 @@ internal class AccessSyntheticUtils { } ret } ?: true - } catch (t: Throwable) { - t.printStackTrace() - } + } catch (ignore: Throwable) { } return true } From b4f50c99bc4420bd230391948f29f8d824ce7826 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 21 Nov 2023 16:40:34 +0800 Subject: [PATCH 3/6] =?UTF-8?q?[6.2.0]BadCase=E5=92=8CAI=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=87=87=E9=9B=86=E5=8E=9F=E5=9B=A0=E9=85=8D=E7=BD=AE=E5=A4=A7?= =?UTF-8?q?=E7=90=86=E7=A7=81=E6=9C=8D=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../badcase/repository/net/BadCaseNetModel.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/BadCaseNetModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/BadCaseNetModel.kt index be53547ec8..8a19f21c03 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/BadCaseNetModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/BadCaseNetModel.kt @@ -3,6 +3,7 @@ package com.zhjt.mogo_core_function_devatools.badcase.repository.net import android.util.Log import com.mogo.commons.constants.HostConst import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.network.MoGoRetrofitFactory @@ -61,7 +62,15 @@ internal class BadCaseNetModel { null } - private fun getNetWorkApi(baseUrl: String ="http://eagle-qa.zhidaozhixing.com"): BadCaseApi{ + private fun getHost(): String{ + return if(FunctionBuildConfig.urlJson.getEagleMisUrl().isEmpty()){ + "http://eagle-qa.zhidaozhixing.com" + }else{ + "http://eagle-mis-a.zhidaozhixing.com/" + } + } + + private fun getNetWorkApi(baseUrl: String =getHost()): BadCaseApi{ return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) .create(BadCaseApi::class.java) } From 4477cda38da50c18c6c3fc263b770ff31fd3b635 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 21 Nov 2023 16:54:34 +0800 Subject: [PATCH 4/6] =?UTF-8?q?[6.2.0]Mis=E5=9C=B0=E5=9D=80=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../badcase/repository/net/BadCaseNetModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/BadCaseNetModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/BadCaseNetModel.kt index 8a19f21c03..89459544dc 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/BadCaseNetModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/BadCaseNetModel.kt @@ -63,7 +63,7 @@ internal class BadCaseNetModel { } private fun getHost(): String{ - return if(FunctionBuildConfig.urlJson.getEagleMisUrl().isEmpty()){ + return if(FunctionBuildConfig.urlJson.eagleMisUrl.isEmpty()){ "http://eagle-qa.zhidaozhixing.com" }else{ "http://eagle-mis-a.zhidaozhixing.com/" From 9981ec9699c970cbf6cac7fc6103041b08d2bfbe Mon Sep 17 00:00:00 2001 From: renwj Date: Tue, 21 Nov 2023 17:12:41 +0800 Subject: [PATCH 5/6] =?UTF-8?q?[6.2.0][=E6=8A=80=E6=9C=AF=E4=BC=98?= =?UTF-8?q?=E5=8C=96]=20=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/launcher/lancet/jank/spi/HandlerHookerImpl.kt | 8 ++++---- .../mogo/launcher/lancet/jank/spi/HookInvokerImpl.java | 5 +---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HandlerHookerImpl.kt b/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HandlerHookerImpl.kt index d2f6b9fbaa..204ccf8a5d 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HandlerHookerImpl.kt +++ b/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HandlerHookerImpl.kt @@ -72,11 +72,11 @@ class HandlerHookerImpl : IHandlerHooker { } override fun onPostAtTime(handler: Handler, action: Runnable, token: Any?, uptimeMillis: Long) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, obj = token, delay = uptimeMillis - SystemClock.uptimeMillis())) + checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, obj = token, enqueue = uptimeMillis)) } override fun onPostAtTime(handler: Handler, action: Runnable, uptimeMillis: Long) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, delay = uptimeMillis - SystemClock.uptimeMillis())) + checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, enqueue = uptimeMillis)) } override fun onPostDelayed(handler: Handler, action: Runnable, token: Any?, delayMillis: Long) { @@ -93,7 +93,7 @@ class HandlerHookerImpl : IHandlerHooker { } override fun onSendEmptyMessageAtTime(handler: Handler, what: Int, uptimeMillis: Long) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, what = what, delay = uptimeMillis - SystemClock.uptimeMillis())) + checkIfNeed(handler)?.insert(Msg.acquire(handler, what = what, enqueue = uptimeMillis)) } override fun onSendEmptyMessageDelayed(handler: Handler, what: Int, delayMillis: Long) { @@ -109,7 +109,7 @@ class HandlerHookerImpl : IHandlerHooker { } override fun onSendMessageAtTime(handler: Handler, msg: Message, uptimeMillis: Long) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, msg = msg, delay = uptimeMillis - SystemClock.uptimeMillis())) + checkIfNeed(handler)?.insert(Msg.acquire(handler, msg = msg, enqueue = uptimeMillis)) } override fun onSendMessageDelayed(handler: Handler, msg: Message, delayMillis: Long) { diff --git a/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java b/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java index 62593b36d9..2557988cc3 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java +++ b/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java @@ -46,10 +46,7 @@ public class HookInvokerImpl implements IHookInvoker { @Override public void i(Type type, Object caller,String methodName, Object... objects) { startTime.set(SystemClock.elapsedRealtime()); - boolean isMainThread = false; - if (mainLooper == Looper.myLooper()) { - isMainThread = true; - } + boolean isMainThread = mainLooper == Looper.myLooper(); handleSynchronizedLock(isMainThread, caller, methodName, objects); if (!getProviderRequested && provider == null && mainLooper != Looper.myLooper() && ARouterUtils.isInit.get()) { getProviderRequested = true; From 80f9f30a74e83333c2e2556009b0f1f114e00a25 Mon Sep 17 00:00:00 2001 From: renwj Date: Tue, 21 Nov 2023 17:39:48 +0800 Subject: [PATCH 6/6] =?UTF-8?q?[6.2.0][=E6=8A=80=E6=9C=AF=E4=BC=98?= =?UTF-8?q?=E5=8C=96]=20=E5=87=8F=E5=B0=91=E8=AE=B0=E5=BD=95=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E7=9A=84=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java b/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java index 2557988cc3..f7d53ba4dd 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java +++ b/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java @@ -230,15 +230,13 @@ public class HookInvokerImpl implements IHookInvoker { builder.append(")"); } builder.append("#").append(elapsedTime); - Object monitor = this.monitor.get(); if (monitor != null) { - builder.append("#").append(monitor); + builder.append("#").append("monitor->").append(monitor.getClass().getName()).append("@").append(monitor.hashCode()); } if (holderDesc != null) { - builder.append("#").append(holderDesc); + builder.append("#").append("holder->").append(holderDesc); } - if (elapsedTime >= dumpStackThreshold && isCanDump) { builder.append("\n"); StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();