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 } 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 677dc966ab..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 @@ -40,19 +40,14 @@ public class HookInvokerImpl implements IHookInvoker { private final long dumpStackThreshold = 20; // dump堆栈阈值 + private volatile boolean isCanDump = false; // 是否可以Dump堆栈,加此标记位是防止应用启动过程中,由于dump主线程堆栈导致启动耗时 // 切记: 请勿在此方法中调用其它模块类中的api,可能会出现StackOverFlowException @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; - if (type == Type.SYNCHRONIZED_LOCK) { - handleSynchronizedLock(Looper.myLooper() == mainLooper, caller, methodName, objects); - } - } - + boolean isMainThread = mainLooper == Looper.myLooper(); + handleSynchronizedLock(isMainThread, caller, methodName, objects); if (!getProviderRequested && provider == null && mainLooper != Looper.myLooper() && ARouterUtils.isInit.get()) { getProviderRequested = true; new Thread(() -> { @@ -128,7 +123,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 +139,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(); } } } @@ -216,16 +230,14 @@ 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) { + if (elapsedTime >= dumpStackThreshold && isCanDump) { builder.append("\n"); StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); for (StackTraceElement trace: stackTrace) { 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..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 @@ -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.eagleMisUrl.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) }