From ece5dca6fb8462fc7329eef3de1fdf7dbe682822 Mon Sep 17 00:00:00 2001 From: renwj Date: Mon, 13 Nov 2023 17:26:46 +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=E4=BC=98=E5=8C=96synchrnized=E9=94=81=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jank/compiler/JankPointAutoGenerator.java | 4 +- .../launcher/lancet/jank/spi/HookHandler.java | 62 ++++++++++++++++++- build.gradle | 2 +- config.gradle | 2 +- 4 files changed, 62 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/lancet/jank/compiler/JankPointAutoGenerator.java b/app/src/main/java/com/mogo/launcher/lancet/jank/compiler/JankPointAutoGenerator.java index f85b7e007b..5f702435cd 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/jank/compiler/JankPointAutoGenerator.java +++ b/app/src/main/java/com/mogo/launcher/lancet/jank/compiler/JankPointAutoGenerator.java @@ -103,9 +103,7 @@ class JankPointAutoGenerator { type = Type.SLEEP, scope = Scope.ALL, onlyHookMethodNames = { "sleep", "sleep"}, - onlyHookMethodDescs = { "(J)V", "(JI)V"}, - excludeHookMethodNames = { "toString", "hashCode" }, - excludeHookMethodDescs = { "()Ljava/lang/String;", "()I" } + onlyHookMethodDescs = { "(J)V", "(JI)V"} ) private Thread thread; diff --git a/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookHandler.java b/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookHandler.java index 0e27554c5a..4a48f0e235 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookHandler.java +++ b/app/src/main/java/com/mogo/launcher/lancet/jank/spi/HookHandler.java @@ -21,18 +21,74 @@ public class HookHandler implements IHookInvoker { private final AtomicLong startTime = new AtomicLong(0L); + private final AtomicLong syncLockStartTime = new AtomicLong(0L); + private final ThreadLocal message = new ThreadLocal<>(); @Override public void i(@NonNull Type type, Object caller, @NonNull String methodName, @NonNull Object... objects) { if (Looper.myLooper() == mainLooper) { - startTime.set(SystemClock.elapsedRealtime()); + if (type == Type.SYNCHRONIZED_LOCK) { + if ("onMonitorBefore".equals(methodName)) { + syncLockStartTime.set(SystemClock.elapsedRealtime()); + } + if ("onMonitorEnter".equals(methodName)) { + long elapsedTime = SystemClock.elapsedRealtime() - syncLockStartTime.get(); + if (elapsedTime >= 10) { + StringBuilder builder = message.get(); + if (builder == null) { + builder = new StringBuilder(); + message.set(builder); + } + if (builder.length() > 0) { + builder.setLength(0); + } + builder + .append(type) + .append("#") + .append(caller == null ? "caller is null" : caller.getClass().getSimpleName()) + .append("#") + .append(methodName); + if (objects.length > 0) { + builder.append("#("); + } + for (Object o : objects) { + if (o == null) { + continue; + } + builder.append(o.getClass().getSimpleName()) + .append(","); + } + + if (objects.length > 0) { + builder.setLength(builder.length() - 1); + builder.append(")"); + } + + builder.append("\n"); + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + for (StackTraceElement trace: stackTrace) { + if ("dalvik.system.VMStack".equals(trace.getClassName()) && "getThreadStackTrace".equals(trace.getMethodName())) { + continue; + } + if ("java.lang.Thread".equals(trace.getClassName()) && "getStackTrace".equals(trace.getMethodName())) { + continue; + } + builder.append(trace.getClassName()).append("#").append(trace.getMethodName()).append("#").append(trace.getLineNumber()).append("\n"); + } + builder.setLength(builder.length() - 1); + Log.w("HookHandler", "jank detected:" + builder); + } + } + } else { + startTime.set(SystemClock.elapsedRealtime()); + } } } @Override public void o(@NonNull Type type, Object caller, @NonNull String methodName, @NonNull Object... objects) { - if (Looper.myLooper() == mainLooper) { + if (type != Type.SYNCHRONIZED_LOCK && Looper.myLooper() == mainLooper) { long startTime = this.startTime.get(); if (startTime > 0) { long delta = SystemClock.elapsedRealtime() - startTime; @@ -66,7 +122,7 @@ public class HookHandler implements IHookInvoker { builder.setLength(builder.length() - 1); builder.append(")"); } - if (type == Type.SYNCHRONIZED_LOCK || type == Type.AQS_LOCK) { + if (type == Type.AQS_LOCK) { builder.append("\n"); StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); for (StackTraceElement trace: stackTrace) { diff --git a/build.gradle b/build.gradle index 477a0c2815..67b9a82ff0 100644 --- a/build.gradle +++ b/build.gradle @@ -34,7 +34,7 @@ buildscript { classpath "com.mogo.cloud:systrace:${plugin_version}" classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' classpath "com.mogo.sticky:service:${plugin_version}" - classpath "io.github.knight-zxw:lancet-plugin:10.1.0" + classpath "io.github.knight-zxw:lancet-plugin:10.3.0" classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.15.0" classpath 'com.mogo.cloud:matrix:1.0.0' classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.4.0.2513' diff --git a/config.gradle b/config.gradle index 9d43dfccef..a4b27ebab5 100644 --- a/config.gradle +++ b/config.gradle @@ -208,7 +208,7 @@ ext { //========================= LancetX =================== - lancetx_runtime : "io.github.knight-zxw:lancet-runtime:10.2.0", + lancetx_runtime : "io.github.knight-zxw:lancet-runtime:10.3.0", lancetx_compiler : "com.mogo.eagle.core.lancetx:compiler:1.0.0",