[6.2.0][技术优化] 添加dump主线程堆栈标记位,防止应用启动过程中耗时
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user