From fac538933f17ca65b6635f09371322d28379bcb1 Mon Sep 17 00:00:00 2001 From: renwj Date: Tue, 21 Nov 2023 15:06:49 +0800 Subject: [PATCH] =?UTF-8?q?[6.2.0][=E6=8A=80=E6=9C=AF=E4=BC=98=E5=8C=96]?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0dump=E4=B8=BB=E7=BA=BF=E7=A8=8B=E5=A0=86?= =?UTF-8?q?=E6=A0=88=E6=A0=87=E8=AE=B0=E4=BD=8D=EF=BC=8C=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=90=AF=E5=8A=A8=E8=BF=87=E7=A8=8B=E4=B8=AD?= =?UTF-8?q?=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) {