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) {