[6.2.0][技术优化] 添加dump主线程堆栈标记位,防止应用启动过程中耗时

This commit is contained in:
renwj
2023-11-21 15:06:49 +08:00
parent 17490a4c43
commit fac538933f

View File

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