From 12c548d3938414500a92ee3917af8e57a22c2f10 Mon Sep 17 00:00:00 2001 From: renwj Date: Wed, 21 Feb 2024 17:07:46 +0800 Subject: [PATCH 1/5] =?UTF-8?q?[6.3.0][View=E7=82=B9=E5=87=BB=E6=80=81]=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8F=AF=E7=82=B9=E5=87=BB=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E8=83=8C=E6=99=AF=E5=88=9B=E5=BB=BA=E9=80=BB=E8=BE=91;?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9B=A0=E7=84=A6=E7=82=B9=E5=8F=98=E5=8C=96?= =?UTF-8?q?=E9=80=A0=E6=88=90=E7=9A=84=E8=83=8C=E6=99=AF=E9=87=8D=E5=BD=B1?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/launcher/lancet/ViewPressedStateLancet.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java b/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java index c88dc50449..8b498b20a7 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java +++ b/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java @@ -7,6 +7,7 @@ import android.graphics.Color; import android.graphics.drawable.Drawable; import android.graphics.drawable.StateListDrawable; import android.util.AttributeSet; +import android.util.StateSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -533,7 +534,7 @@ public class ViewPressedStateLancet { } } } else { - states[1] = new int[] { -android.R.attr.state_pressed }; + states[1] = StateSet.WILD_CARD; colors[1] = defaultColor; } ColorStateList newColor = new ColorStateList(states, colors); @@ -601,11 +602,10 @@ public class ViewPressedStateLancet { Drawable.ConstantState constantState = old.getConstantState(); if (constantState != null) { StateListDrawable result = new StateListDrawable(); - int[] state = { -android.R.attr.state_pressed }; - result.addState(state, old); Drawable pressed = DrawableCompat.wrap(constantState.newDrawable().mutate()); pressed.setAlpha((int)(255 * alpha)); result.addState(new int[] { android.R.attr.state_pressed }, pressed); + result.addState(StateSet.WILD_CARD, old); return result; } return null; From d57d07201d56f4bc20cf68448dc728b367520e49 Mon Sep 17 00:00:00 2001 From: renwj Date: Thu, 22 Feb 2024 11:05:03 +0800 Subject: [PATCH 2/5] =?UTF-8?q?[6.3.0][APK=E5=AE=89=E8=A3=85]=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96APK=E5=AE=89=E8=A3=85=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E9=80=82=E9=85=8D=E9=83=A8=E5=88=86=E6=9C=BA=E5=9E=8B=E7=94=B1?= =?UTF-8?q?=E4=BA=8E=E5=AE=89=E8=A3=85=E8=AF=B7=E6=B1=82=E8=A2=AB=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=8B=92=E7=BB=9D=E5=AF=BC=E8=87=B4=E9=B9=B0=E7=9C=BC?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=B8=8D=E5=8F=AF=E7=82=B9=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/functions/test/ApkInstallerTest.kt | 149 +++++++----------- .../eagle/core/utilcode/util/ApkInstaller.kt | 1 + 2 files changed, 62 insertions(+), 88 deletions(-) diff --git a/app/src/androidTest/java/com/mogo/functions/test/ApkInstallerTest.kt b/app/src/androidTest/java/com/mogo/functions/test/ApkInstallerTest.kt index 36a17ae3d6..242ded546d 100644 --- a/app/src/androidTest/java/com/mogo/functions/test/ApkInstallerTest.kt +++ b/app/src/androidTest/java/com/mogo/functions/test/ApkInstallerTest.kt @@ -1,88 +1,61 @@ -//package com.mogo.functions.test -// -//import android.util.* -//import androidx.test.core.app.* -//import androidx.test.ext.junit.runners.* -//import androidx.test.filters.* -//import androidx.test.platform.app.InstrumentationRegistry -//import com.mogo.eagle.core.function.hmi.ui.* -//import com.mogo.eagle.core.function.main.* -//import com.mogo.eagle.core.utilcode.util.* -//import kotlinx.coroutines.* -//import org.junit.* -//import org.junit.runner.* -//import java.util.concurrent.* -//import java.util.concurrent.TimeUnit.MILLISECONDS -//import kotlin.Result -// -//@RunWith(AndroidJUnit4::class) -//@LargeTest -//class ApkInstallerTest { -// -// -// lateinit var launch: ActivityScenario -// -// @Before -// fun before() { -// launch = ActivityScenario.launch(MainLauncherActivity::class.java) -// } -// -// @Test -// fun testInstall(): Unit = runBlocking { -// Log.d("RWJ", "wait fragment show ...") -// val f = ensureMoGoHmiFragmentShow() -// Log.d("RWJ", "fragment showed, delay 10s ...") -// delay(10000) -// -// Log.d("RWJ", "10s end, start install ...") -// val context = InstrumentationRegistry.getInstrumentation().context -// ApkInstaller.installApp(f.requireContext(), context.assets.open("190000013.apk")) { code, msg -> -// Log.d("RWJ", "code: $code, msg: $msg") -// } -// Log.d("RWJ", "开始延时10分钟....") -// delay(TimeUnit.MINUTES.toMillis(10)) -// Log.d("RWJ", "延时10分钟结束....") -// } -// -// -// @Test -// fun testInstall2(): Unit = runBlocking { -// Log.d("RWJ", "wait fragment show ...") -// val f = ensureMoGoHmiFragmentShow() -// Log.d("RWJ", "fragment showed, delay 10s ...") -// delay(10000) -// -// Log.d("RWJ", "10s end, start install ...") -// val context = InstrumentationRegistry.getInstrumentation().context -// ApkInstaller.installApp(f.requireContext(), context.assets.open("HelloActivity.zip")) { code, msg -> -// Log.d("RWJ", "code: $code, msg: $msg") -// } -// Log.d("RWJ", "开始延时10分钟....") -// delay(TimeUnit.MINUTES.toMillis(10)) -// Log.d("RWJ", "延时10分钟结束....") -// } -// -// private suspend fun ensureMoGoHmiFragmentShow(): MoGoHmiFragment = suspendCancellableCoroutine { -// launch.onActivity { itx -> -// val executor = Executors.newSingleThreadScheduledExecutor() -// executor.scheduleAtFixedRate({ -// var find = -// itx.supportFragmentManager.fragments.find { it is MoGoHmiFragment } as? MoGoHmiFragment -// while (find == null) { -// find = -// itx.supportFragmentManager.fragments.find { it is MoGoHmiFragment } as? MoGoHmiFragment -// } -// while (!find.isResumed) { -// Thread.sleep(500) -// } -// it.resumeWith(Result.success(find)) -// try { -// Thread.sleep(500) -// executor.shutdownNow() -// } catch (e: Throwable) { -// e.printStackTrace() -// } -// }, 50, 500, MILLISECONDS) -// } -// } -//} \ No newline at end of file +package com.mogo.functions.test + +import android.util.* +import androidx.test.core.app.* +import androidx.test.ext.junit.runners.* +import androidx.test.filters.* +import androidx.test.platform.app.InstrumentationRegistry +import com.mogo.eagle.core.function.hmi.ui.* +import com.mogo.eagle.core.function.main.* +import com.mogo.eagle.core.utilcode.util.* +import kotlinx.coroutines.* +import org.junit.* +import org.junit.runner.* +import java.io.File +import java.util.concurrent.* + +@RunWith(AndroidJUnit4::class) +@LargeTest +class ApkInstallerTest { + + + lateinit var launch: ActivityScenario + + @Before + fun before() { + launch = ActivityScenario.launch(MainLauncherActivity::class.java) + } + + @Test + fun testInstall(): Unit = runBlocking { + Log.d("RWJ", "wait fragment show ...") + Log.d("RWJ", "fragment showed, delay 10s ...") + delay(10000) + + Log.d("RWJ", "10s end, start install ...") + val context = InstrumentationRegistry.getInstrumentation().context + val targetContext = InstrumentationRegistry.getInstrumentation().targetContext + val outFile = File(targetContext.getExternalFilesDir(null), "temp.apk") + val os = outFile.outputStream() + try { + Log.d("RWJ", "将assets目录下的apk文件,copy到应用私有目录...") + context.assets.open("HelloActivity.zip").use { + it.copyTo(os) + } + Log.d("RWJ", "copy操作完成") + } finally { + try { + os.close() + } catch (t: Throwable) { + t.printStackTrace() + } + } + Log.d("RWJ", "开始安装...") + ApkInstaller.installApp(targetContext, outFile) { code, msg -> + Log.d("RWJ", "code: $code, msg: $msg") + } + Log.d("RWJ", "开始延时10分钟....") + delay(TimeUnit.MINUTES.toMillis(10)) + Log.d("RWJ", "延时10分钟结束....") + } +} \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ApkInstaller.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ApkInstaller.kt index 328d90cb29..9f62ba5619 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ApkInstaller.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ApkInstaller.kt @@ -162,6 +162,7 @@ class InstallApkSessionApi: AppCompatActivity() { // This test app isn't privileged, so the user has to confirm the install. val confirmIntent = extras[Intent.EXTRA_INTENT] as? Intent startActivity(confirmIntent) + finish() } STATUS_SUCCESS -> { Log.i(TAG, "--- InstallApkSessionApi -- install success --") From 75c6056bb3396c93f54b773831b78778ab41f72e Mon Sep 17 00:00:00 2001 From: renwj Date: Thu, 22 Feb 2024 11:30:22 +0800 Subject: [PATCH 3/5] =?UTF-8?q?[6.3.0][=E5=BC=95=E5=AF=BC=E7=BA=BF]=20Taxi?= =?UTF-8?q?=E4=B9=98=E5=AE=A2=E5=B1=8F=E6=B7=BB=E5=8A=A0=E5=BC=95=E5=AF=BC?= =?UTF-8?q?=E7=BA=BF=E6=B5=81=E5=85=89=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/business/routeoverlay/RouteOverlayDrawer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/RouteOverlayDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/RouteOverlayDrawer.java index 1e461cdb7e..e1c81539ae 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/RouteOverlayDrawer.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/RouteOverlayDrawer.java @@ -230,7 +230,9 @@ public class RouteOverlayDrawer { if (colors != null && !colors.isEmpty()) { builder.colors(colors); builder.setIsGradient(true); - builder.setLightOn(false); + builder.setLightOn(true); + builder.setLightColor(COLOR_LIGHT); + builder.setLightSpeed(0.5f); } } builder.points(points); From b89f7cae1ab30413ec06d47708c3910a8b299e9a Mon Sep 17 00:00:00 2001 From: renwj Date: Mon, 26 Feb 2024 11:21:02 +0800 Subject: [PATCH 4/5] =?UTF-8?q?[6.3.0][=E5=B0=8F=E6=99=BA=E5=BD=A2?= =?UTF-8?q?=E8=B1=A1]=20=E6=B7=BB=E5=8A=A0v2n=E4=BA=8B=E4=BB=B6=E5=B0=8F?= =?UTF-8?q?=E6=99=BA=E5=BD=A2=E8=B1=A1=E7=8A=B6=E6=80=81=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt | 4 ++++ .../v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt index 8d281816a8..9cce260402 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt @@ -19,6 +19,8 @@ import com.mogo.eagle.core.function.angle.scenes.Default import com.mogo.eagle.core.function.angle.scenes.RoadEvent import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener +import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.Event +import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerV2XListenerManager.V2NCarTypeCheck @@ -233,6 +235,7 @@ internal object V2NIdentifyDrawer { object : IMoGoWarningStatusListener { override fun onShow() { super.onShow() + CallerHmiManager.notifyXiaoZhiStatusChanged(Event.V2N, State.START) CallerVisualAngleManager.changeAngle( RoadEvent( lon, @@ -244,6 +247,7 @@ internal object V2NIdentifyDrawer { override fun onDismiss() { super.onDismiss() + CallerHmiManager.notifyXiaoZhiStatusChanged(Event.V2N, State.STOP) CallerVisualAngleManager.changeAngle(Default()) } }, diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java index c26f41219e..88d8f62c05 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java @@ -1,5 +1,7 @@ package com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.road; +import android.telecom.Call; + import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.data.enums.CommunicationType; import com.mogo.eagle.core.data.enums.DataSourceType; @@ -15,6 +17,8 @@ import com.mogo.eagle.core.data.msgbox.V2XMsg; import com.mogo.eagle.core.function.angle.scenes.Default; import com.mogo.eagle.core.function.angle.scenes.RoadEvent; import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener; +import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.Event; +import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager; @@ -157,6 +161,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp @Override public void onShow() { + CallerHmiManager.INSTANCE.notifyXiaoZhiStatusChanged(Event.V2N, State.START); V2XMessageEntity entity = getV2XMessageEntity(); if (entity != null) { V2XRoadEventEntity content = entity.getContent(); @@ -185,6 +190,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp @Override public void onDismiss() { + CallerHmiManager.INSTANCE.notifyXiaoZhiStatusChanged(Event.V2N, State.STOP); if (isNeedChangeAngle()) { CallerVisualAngleManager.INSTANCE.changeAngle(new Default(3, TimeUnit.SECONDS)); } From 7f11112d7fae5d3199c87c945f77f68d45f195b3 Mon Sep 17 00:00:00 2001 From: renwj Date: Wed, 28 Feb 2024 19:36:44 +0800 Subject: [PATCH 5/5] =?UTF-8?q?[6.3.0][=E5=8D=A1=E9=A1=BF=E6=A3=80?= =?UTF-8?q?=E6=B5=8B]=20=E4=BC=98=E5=8C=96=E5=8D=A1=E9=A1=BF=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 + .../jank/compiler/JankPointAutoGenerator.java | 135 ++++++++++++++++ .../lancet/jank/spi/HandlerHookerImpl.kt | 79 +++++----- .../lancet/jank/spi/HookInvokerImpl.java | 145 +++++++++--------- build.gradle | 4 +- config.gradle | 10 +- .../block/MoGoBlockProviderImpl.kt | 3 +- .../status/ui/adapter/StatusAdapter.kt | 16 +- gradle/bytex/bytex_lancetx.gradle | 3 +- gradle/ext.gradle | 2 +- 10 files changed, 270 insertions(+), 129 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 87168655f4..fbbe37c378 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -243,6 +243,8 @@ dependencies { compileOnly rootProject.ext.dependencies.google_auto_service compileOnly rootProject.ext.dependencies.apm_insight + + compileOnly rootProject.ext.dependencies.serialport } // implementation rootProject.ext.dependencies.mogocustommap diff --git a/app/src/block/java/com/mogo/launcher/lancet/jank/compiler/JankPointAutoGenerator.java b/app/src/block/java/com/mogo/launcher/lancet/jank/compiler/JankPointAutoGenerator.java index fd67f0e4cc..ee73febf36 100644 --- a/app/src/block/java/com/mogo/launcher/lancet/jank/compiler/JankPointAutoGenerator.java +++ b/app/src/block/java/com/mogo/launcher/lancet/jank/compiler/JankPointAutoGenerator.java @@ -3,6 +3,7 @@ package com.mogo.launcher.lancet.jank.compiler; import android.app.Activity; import android.app.ActivityManager; +import android.app.AlarmManager; import android.app.Fragment; import android.app.Service; import android.content.BroadcastReceiver; @@ -16,11 +17,17 @@ import android.view.View; import android.view.ViewManager; import android.widget.Toast; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.iflytek.speech.GrammarListener; +import com.iflytek.speech.aidl.IWakeuper; import com.knightboost.lancet.api.synchronized_lock.ISynchronizedLockHooker; import com.mogo.core.lancetx.compiler.lib.annotations.LancetXGenerator; import com.mogo.core.lancetx.compiler.lib.generator.HookType; import com.mogo.core.lancetx.compiler.lib.generator.Scope; import com.mogo.core.lancetx.compiler.lib.generator.Type; +import com.mogo.support.serialport.common.core.ICoreBinder; +import com.zhjt.mogo_core_function_devatools.monitor.remote.IUserInterface; import java.io.File; import java.io.InputStream; @@ -412,4 +419,132 @@ class JankPointAutoGenerator { hookAllPublicMethods = true ) private BitmapFactory factory; + + + @LancetXGenerator( + group = "main_block_check", + type = Type.OTHER, + scope = Scope.SELF, + hookType = HookType.REPLACE_INVOKE, + hookAllPublicMethods = true, + onlyHookMethodNames = { + "getConstructors", + "getDeclaredConstructors", + "getFields", + "getDeclaredFields", + "getMethods", + "getDeclaredMethods", + "getAnnotations", + "getDeclaredAnnotations", + "getClasses", + "getDeclaredClasses", + "getMethod", + "getDeclaredMethod", + "getField", + "getDeclaredField", + "getConstructor", + "getDeclaredConstructor" + }, + onlyHookMethodDescs = { + "()[Ljava/lang/reflect/Constructor;", + "()[Ljava/lang/reflect/Constructor;", + "()[Ljava/lang/reflect/Field;", + "()[Ljava/lang/reflect/Field;", + "()[Ljava/lang/reflect/Method;", + "()[Ljava/lang/reflect/Method;", + "()[Ljava/lang/annotation/Annotation;", + "()[Ljava/lang/annotation/Annotation;", + "()[Ljava/lang/Class;", + "()[Ljava/lang/Class;", + "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", + "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", + "(Ljava/lang/String;)Ljava/lang/reflect/Field;", + "(Ljava/lang/String;)Ljava/lang/reflect/Field;", + "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;", + "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;" + } + ) + private Class clazz; + + + @LancetXGenerator( + group = "main_block_check", + type = Type.OTHER, + scope = Scope.SELF, + hookType = HookType.REPLACE_INVOKE, + hookAllPublicMethods = true + ) + private Gson gson; + + + @LancetXGenerator( + group = "main_block_check", + type = Type.OTHER, + scope = Scope.SELF, + hookType = HookType.REPLACE_INVOKE, + hookAllPublicMethods = true, + onlyHookMethodNames = { + "getObject", + "getObject", + "getObject", + "toJavaObject", + "toJavaObject" + }, + onlyHookMethodDescs = { + "(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;", + "(Ljava/lang/String;Ljava/lang/reflect/Type;)Ljava/lang/Object;", + "(Ljava/lang/String;Lcom/alibaba/fastjson/TypeReference;)Ljava/lang/Object;", + "(Ljava/lang/Class;)Ljava/lang/Object;", + "(Ljava/lang/Class;Lcom/alibaba/fastjson/parser/ParserConfig;I)Ljava/lang/Object;" + } + ) + private JSONObject fastJson; + + + @LancetXGenerator( + group = "main_block_check", + type = Type.IPC, + scope = Scope.SELF, + hookType = HookType.REPLACE_INVOKE, + hookAllPublicMethods = true + ) + private IUserInterface userInterface; + + @LancetXGenerator( + group = "main_block_check", + type = Type.IPC, + scope = Scope.SELF, + hookType = HookType.REPLACE_INVOKE, + hookAllPublicMethods = true + ) + private ICoreBinder coreBinder; + + + @LancetXGenerator( + group = "main_block_check", + type = Type.IPC, + scope = Scope.SELF, + hookType = HookType.REPLACE_INVOKE, + hookAllPublicMethods = true + ) + private IWakeuper wakeuper; + + + @LancetXGenerator( + group = "main_block_check", + type = Type.IPC, + scope = Scope.SELF, + hookType = HookType.REPLACE_INVOKE, + hookAllPublicMethods = true + ) + private GrammarListener clientGrammarListener; + + @LancetXGenerator( + group = "main_block_check", + type = Type.IPC, + scope = Scope.SELF, + hookType = HookType.REPLACE_INVOKE, + hookAllPublicMethods = true + ) + private AlarmManager alarmManager; } diff --git a/app/src/block/java/com/mogo/launcher/lancet/jank/spi/HandlerHookerImpl.kt b/app/src/block/java/com/mogo/launcher/lancet/jank/spi/HandlerHookerImpl.kt index 204ccf8a5d..d3ab35933c 100644 --- a/app/src/block/java/com/mogo/launcher/lancet/jank/spi/HandlerHookerImpl.kt +++ b/app/src/block/java/com/mogo/launcher/lancet/jank/spi/HandlerHookerImpl.kt @@ -3,7 +3,6 @@ package com.mogo.launcher.lancet.jank.spi import android.os.Handler import android.os.Looper import android.os.Message -import android.os.SystemClock import com.google.auto.service.AutoService import com.mogo.eagle.core.block.runtime.config.recorder.IMessageRecorder import com.mogo.eagle.core.block.runtime.utils.TimeUtils.Companion.now @@ -25,7 +24,7 @@ class HandlerHookerImpl : IHandlerHooker { private var dispatchTime = 0L - override fun onMessageDispatchAfter(msg: Message) { + override fun onMessageDispatchAfter(msg: Message, isAsync: Boolean) { if (msg.target.looper != mainLooper) { return } @@ -33,87 +32,87 @@ class HandlerHookerImpl : IHandlerHooker { return } val duration = now() - dispatchTime - checkIfNeed(msg.target)?.recycle(Msg.acquire(msg.target, msg = msg, duration = duration, elapsed = SystemClock.uptimeMillis() - msg.`when`, enqueue = msg.`when`)) + checkIfNeed(msg.target)?.recycle(Msg.acquire(msg.target, msg = msg, duration = duration, isAsync = isAsync)) } - override fun onMessageDispatchBefore(msg: Message) { + override fun onMessageDispatchBefore(msg: Message, isAsync: Boolean) { if (msg.target.looper != mainLooper) { return } dispatchTime = now() } - override fun onRemoveCallbacks(handler: Handler, action: Runnable) { - checkIfNeed(handler)?.remove(Msg.acquire(handler, action = action)) + override fun onRemoveCallbacks(handler: Handler, action: Runnable, isAsync: Boolean) { + checkIfNeed(handler)?.remove(Msg.acquire(handler, action = action, isAsync = isAsync)) } - override fun onRemoveCallbacksAndMessages(handler: Handler, token: Any?) { - checkIfNeed(handler)?.remove(Msg.acquire(handler, obj = token)) + override fun onRemoveCallbacksAndMessages(handler: Handler, token: Any?, isAsync: Boolean) { + checkIfNeed(handler)?.remove(Msg.acquire(handler, obj = token, isAsync = isAsync)) } - override fun onRemoveCallbacksWithToken(handler: Handler, action: Runnable, token: Any?) { - checkIfNeed(handler)?.remove(Msg.acquire(handler, action = action, obj = token)) + override fun onRemoveCallbacksWithToken(handler: Handler, action: Runnable, token: Any?, isAsync: Boolean) { + checkIfNeed(handler)?.remove(Msg.acquire(handler, action = action, obj = token, isAsync = isAsync)) } - override fun onRemoveMessages(handler: Handler, what: Int) { - checkIfNeed(handler)?.remove(Msg.acquire(handler, what = what)) + override fun onRemoveMessages(handler: Handler, what: Int, isAsync: Boolean) { + checkIfNeed(handler)?.remove(Msg.acquire(handler, what = what, isAsync = isAsync)) } - override fun onRemoveMessages(handler: Handler, what: Int, obj: Any?) { - checkIfNeed(handler)?.remove(Msg.acquire(handler, what = what, obj = obj)) + override fun onRemoveMessages(handler: Handler, what: Int, obj: Any?, isAsync: Boolean) { + checkIfNeed(handler)?.remove(Msg.acquire(handler, what = what, obj = obj, isAsync = isAsync)) } - override fun onPost(handler: Handler, action: Runnable) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action)) + override fun onPost(handler: Handler, action: Runnable, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, isAsync = isAsync)) } - override fun onPostAtFrontQueue(handler: Handler, action: Runnable) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action)) + override fun onPostAtFrontQueue(handler: Handler, action: Runnable, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, isAsync = isAsync)) } - override fun onPostAtTime(handler: Handler, action: Runnable, token: Any?, uptimeMillis: Long) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, obj = token, enqueue = uptimeMillis)) + override fun onPostAtTime(handler: Handler, action: Runnable, token: Any?, uptimeMillis: Long, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, obj = token, isAsync = isAsync)) } - override fun onPostAtTime(handler: Handler, action: Runnable, uptimeMillis: Long) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, enqueue = uptimeMillis)) + override fun onPostAtTime(handler: Handler, action: Runnable, uptimeMillis: Long, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, isAsync = isAsync)) } - override fun onPostDelayed(handler: Handler, action: Runnable, token: Any?, delayMillis: Long) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, obj = token, delay = delayMillis)) + override fun onPostDelayed(handler: Handler, action: Runnable, token: Any?, delayMillis: Long, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, obj = token, delay = delayMillis, isAsync = isAsync)) } - override fun onPostDelayed(handler: Handler, action: Runnable, delayMillis: Long) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, delay = delayMillis)) + override fun onPostDelayed(handler: Handler, action: Runnable, delayMillis: Long, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, action = action, delay = delayMillis, isAsync = isAsync)) } - override fun onSendEmptyMessage(handler: Handler, what: Int) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, what = what)) + override fun onSendEmptyMessage(handler: Handler, what: Int, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, what = what, isAsync = isAsync)) } - override fun onSendEmptyMessageAtTime(handler: Handler, what: Int, uptimeMillis: Long) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, what = what, enqueue = uptimeMillis)) + override fun onSendEmptyMessageAtTime(handler: Handler, what: Int, uptimeMillis: Long, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, what = what, isAsync = isAsync)) } - override fun onSendEmptyMessageDelayed(handler: Handler, what: Int, delayMillis: Long) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, what = what, delay = delayMillis)) + override fun onSendEmptyMessageDelayed(handler: Handler, what: Int, delayMillis: Long, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, what = what, delay = delayMillis, isAsync = isAsync)) } - override fun onSendMessage(handler: Handler, msg: Message) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, msg, what = msg.what)) + override fun onSendMessage(handler: Handler, msg: Message, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, msg, what = msg.what, isAsync = isAsync)) } - override fun onSendMessageAtFrontOfQueue(handler: Handler, msg: Message) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, msg, what = msg.what)) + override fun onSendMessageAtFrontOfQueue(handler: Handler, msg: Message, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, msg, what = msg.what, isAsync = isAsync)) } - override fun onSendMessageAtTime(handler: Handler, msg: Message, uptimeMillis: Long) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, msg = msg, enqueue = uptimeMillis)) + override fun onSendMessageAtTime(handler: Handler, msg: Message, uptimeMillis: Long, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, msg = msg, isAsync = isAsync)) } - override fun onSendMessageDelayed(handler: Handler, msg: Message, delayMillis: Long) { - checkIfNeed(handler)?.insert(Msg.acquire(handler, msg = msg, delay = delayMillis)) + override fun onSendMessageDelayed(handler: Handler, msg: Message, delayMillis: Long, isAsync: Boolean) { + checkIfNeed(handler)?.insert(Msg.acquire(handler, msg = msg, delay = delayMillis, isAsync = isAsync)) } private fun checkIfNeed(handler: Handler?): IMessageRecorder? { diff --git a/app/src/block/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java b/app/src/block/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java index 660b2644ad..798333afe3 100644 --- a/app/src/block/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java +++ b/app/src/block/java/com/mogo/launcher/lancet/jank/spi/HookInvokerImpl.java @@ -2,18 +2,19 @@ package com.mogo.launcher.lancet.jank.spi; import android.app.Activity; import android.os.Looper; import android.os.SystemClock; +import android.util.Log; + import com.google.auto.service.AutoService; +import com.knightboost.lancet.api.synchronized_lock.SynchronizedLockHooker; import com.mogo.core.lancetx.compiler.lib.generator.Type; +import com.mogo.core.lancetx.compiler.lib.generator.TypeKt; import com.mogo.core.lancetx.compiler.lib.hook.IHookInvoker; -import com.mogo.eagle.core.data.deva.chain.ChainConstant; import com.mogo.eagle.core.function.api.devatools.block.IMoGoBlockProvider; import com.mogo.eagle.core.function.api.devatools.perf.IMoGoCpuUsageProvider; import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; import com.mogo.eagle.core.function.main.ARouterUtils; import com.mogo.eagle.core.utilcode.util.VLogUtils; -import com.zhjt.service.chain.ChainLog; - -import java.util.concurrent.atomic.AtomicReference; +import java.lang.ref.WeakReference; import java.util.concurrent.locks.Lock; @@ -26,17 +27,18 @@ public class HookInvokerImpl implements IHookInvoker { private final ThreadLocal message = new ThreadLocal<>(); - private final ThreadLocal monitor = new ThreadLocal<>(); + private volatile Object monitor = null; - private final AtomicReference holder = new AtomicReference<>(); - - private final StringBuilder extra = new StringBuilder(); + private volatile Object holder = null; private volatile IMoGoCpuUsageProvider provider; private volatile boolean getProviderRequested = false; - private volatile boolean isCanDump = false; // 是否可以Dump堆栈,加此标记位是防止应用启动过程中,由于dump主线程堆栈导致启动耗时 + private String aqsInfo = null; + + private String synchronizedInfo = null; + // 切记: 请勿在此方法中调用其它模块类中的api,可能会出现StackOverFlowException @Override @@ -59,7 +61,6 @@ public class HookInvokerImpl implements IHookInvoker { } }, "getProvider").start(); } - if (provider != null) { if (isMainThread) { provider.updateMainThreadTime(); @@ -97,10 +98,7 @@ public class HookInvokerImpl implements IHookInvoker { private void handleAqsLockEnterBefore(boolean isMainThread, Object caller, String methodName, Object[] objects) { if (isMainThread && caller instanceof Lock) { if ("lock".equals(methodName) || "lockInterruptibly".equals(methodName)) { - if (extra.length() > 0) { - extra.setLength(0); - } - extra.append(caller); + aqsInfo = caller.toString(); } } } @@ -111,13 +109,13 @@ public class HookInvokerImpl implements IHookInvoker { Long start = startTime.get(); if (start != null) { long dur = SystemClock.elapsedRealtime() - start; - handleCostTimeRecord(Type.AQS_LOCK, extra, caller, methodName, dur, objects); + handleCostTimeRecord(Type.AQS_LOCK, aqsInfo, caller, methodName, dur, objects); } } } } - private void handleCostTimeRecord(Type type, StringBuilder extra, Object caller, String methodName, long cost, Object... args) { + private void handleCostTimeRecord(Type type, String extra, Object caller, String methodName, long cost, Object... args) { //日志打印阈值 long logThreshold = 5; if (cost >= logThreshold) { @@ -132,18 +130,32 @@ public class HookInvokerImpl implements IHookInvoker { builder .append(type) .append("#") - .append(caller == null ? "caller is null" : caller.getClass().getName()) + .append(caller == null ? "caller is null" : (caller instanceof Class ? ((Class) caller).getName() : caller.getClass().getName())) .append("#") .append(methodName); if (args.length > 0) { builder.append("#("); } - for (Object o : args) { - if (o == null) { - continue; + + if (TypeKt.isLifecycle(type) || type == Type.SYNCHRONIZED_LOCK) { + for (Object o : args) { + if (o == null) { + continue; + } + builder.append(o) + .append(","); + } + } else { + if (args.length > 0) { + for (int i = 0; i < args.length - 1; i++) { + Object o = args[i]; + if (o == null) { + continue; + } + builder.append(o) + .append(","); + } } - builder.append(o.getClass().getName()) - .append(","); } if (args.length > 0) { @@ -152,26 +164,17 @@ public class HookInvokerImpl implements IHookInvoker { } builder.append("#").append(cost); - boolean flag = false; - if (extra != null && extra.length() > 0) { - builder.append("#"); - builder.append(extra); - flag = true; - } - // dump堆栈阈值 - long dumpStackThreshold = 20; - if (cost >= dumpStackThreshold && isCanDump) { - builder.append("\n"); - StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); - for (StackTraceElement trace: stackTrace) { - builder.append(trace.getClassName()).append("#").append(trace.getMethodName()).append("#").append(trace.getLineNumber()).append("\n"); + if (!TypeKt.isLifecycle(type) && type != Type.SYNCHRONIZED_LOCK) { + if (args.length > 0) { + builder.append("\n"); + builder.append(args[args.length - 1]); } - builder.setLength(builder.length() - 1); } - VLogUtils.w("HookHandler", builder.toString(), 4096); - if (flag) { - extra.setLength(0); + if (extra != null && extra.length() > 0) { + builder.append("\n").append(extra); } + String msgBlock = builder.toString(); + VLogUtils.w("HookHandler", msgBlock, 4096); } } @@ -198,15 +201,6 @@ public class HookInvokerImpl implements IHookInvoker { } } - if ("onWindowFocusChanged".equals(methodName)) { - if (args.length > 0) { - boolean hasFocus = (boolean)args[0]; - if (hasFocus && !isCanDump) { - isCanDump = true; - } - } - } - if ("onPause".equals(methodName)) { try { IMoGoBlockProvider block = CallerDevaToolsManager.INSTANCE.block(); @@ -233,27 +227,38 @@ public class HookInvokerImpl implements IHookInvoker { private void handleSynchronizedLock(boolean isMainThread,Object caller, String methodName, Object [] objects) { if (isMainThread) { if ("onMonitorBefore".equals(methodName)) { - Object monitor = null; + Object arg0 = null; if (objects.length > 0) { - this.monitor.set(monitor = objects[0]); + arg0 = objects[0]; + } + if (arg0 == null) { + return; + } + Object wr = this.monitor; + if (!(wr instanceof WeakReference)) { + return; + } + Object watcher = ((WeakReference)wr).get(); + if (watcher == null) { + return; + } + if (arg0 != watcher) { + return; } - Thread holder = this.holder.get(); StringBuilder sb = new StringBuilder(); + String invokerInfo = SynchronizedLockHooker.getInstance().getInvokerInfo(); - if (monitor != null) { - sb.append("monitor::").append(monitor.getClass().getName()); - } - if (holder != null) { - if (sb.length() > 0) { - sb.append("##holder::").append(holder.getName()); - } else { - sb.append("holder::").append(holder); + sb.append("invoker::").append(invokerInfo).append("##").append("monitor::").append(arg0.getClass().getName()); + Object hf = this.holder; + if (hf instanceof WeakReference) { + WeakReference whf = (WeakReference) hf; + Object o = whf.get(); + if (o instanceof Thread) { + Thread t = (Thread) o; + sb.append("##").append(t.getName()).append("#").append(t.getId()); } } - if (extra.length() > 0) { - extra.setLength(0); - } - extra.append(sb); + synchronizedInfo = sb.toString(); } if ("onMonitorEnter".equals(methodName)) { Long startTime = this.startTime.get(); @@ -261,25 +266,17 @@ public class HookInvokerImpl implements IHookInvoker { return; } long cost = SystemClock.elapsedRealtime() - startTime; - handleCostTimeRecord(Type.SYNCHRONIZED_LOCK, extra, caller, methodName, cost, objects); - } - if ("onMonitorExit".equals(methodName)) { - this.monitor.remove(); + handleCostTimeRecord(Type.SYNCHRONIZED_LOCK, synchronizedInfo, caller, methodName, cost, objects); } } else { if ("onMonitorBefore".equals(methodName)) { if (objects.length > 0) { - this.monitor.set(objects[0]); + this.monitor = new WeakReference<>(objects[0]); } } if ("onMonitorEnter".equals(methodName)) { - holder.set(Thread.currentThread()); - } - - if ("onMonitorExit".equals(methodName)) { - this.monitor.remove(); - holder.set(null); + this.holder = new WeakReference<>(Thread.currentThread()); } } } diff --git a/build.gradle b/build.gradle index c8b6606972..819a162026 100644 --- a/build.gradle +++ b/build.gradle @@ -34,11 +34,11 @@ 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.60.0" + classpath "io.github.knight-zxw:lancet-plugin:${lancetx_version}" classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.15.0" classpath 'com.mogo.cloud:matrix:1.0.2' classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.4.0.2513' - classpath 'com.mogo.eagle.core.handler.proxy:plugin:1.0.0' + classpath 'com.mogo.eagle.core.handler.proxy:plugin:10.0.0' classpath 'com.gradle:gradle-enterprise-gradle-plugin:3.15.1' // classpath 'com.bytedance.btrace:rhea-gradle-plugin:2.0.0' } diff --git a/config.gradle b/config.gradle index e139429607..d38a56ff7e 100644 --- a/config.gradle +++ b/config.gradle @@ -207,11 +207,11 @@ ext { //========================= LancetX =================== - lancetx_runtime : "io.github.knight-zxw:lancet-runtime:10.50.0", + lancetx_runtime : "io.github.knight-zxw:lancet-runtime:${lancetx_version}", - lancetx_compiler : "com.mogo.eagle.core.lancetx:compiler:1.0.10", + lancetx_compiler : "com.mogo.eagle.core.lancetx:compiler:${lancetx_version}", - lancetx_compiler_lib : "com.mogo.eagle.core.lancetx:runtime:1.0.5", + lancetx_compiler_lib : "com.mogo.eagle.core.lancetx:runtime:${lancetx_version}", //========================= autosize ====================== androidautoSize : 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1', @@ -231,13 +231,13 @@ ext { passport_secret : "com.zhidaoauto:sdk-java:1.0.6-SNAPSHOT", // 主线程卡顿监测 - block_detector : "com.mogo.eagle.core.block:runtime:10.90.60", + block_detector : "com.mogo.eagle.core.block:runtime:20.0.0", //======================== google auto-service =============== google_auto_service : "com.google.auto.service:auto-service:1.0-rc7", //======================== handler-proxy-runtime ============== - handler_proxy_runtime : "com.mogo.eagle.core.handler.proxy:runtime:1.0.0" + handler_proxy_runtime : "com.mogo.eagle.core.handler.proxy:runtime:10.0.0" ] android = [ fLauncherApplicationId : "com.mogo.launcher.f", diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/block/MoGoBlockProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/block/MoGoBlockProviderImpl.kt index 2d83e258a5..29cda0e9c1 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/block/MoGoBlockProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/block/MoGoBlockProviderImpl.kt @@ -28,7 +28,8 @@ internal class MoGoBlockProviderImpl: IMoGoBlockProvider, IBlockListener { .isDebug(false) .period(5, SECONDS) .junkRateThreshold(0.6f) - .recorder(null, 500, 500) + .maxDuration(SECONDS.toMillis(15)) + .maxCount(1000) .build()) hasInit = true } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt index 31eb408cfe..acf16bed1f 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt @@ -41,14 +41,20 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec } fun bind(status: Status) { - itemView.onClick { -// ToastUtils.showShort(getText(status)) - if (status is OverViewStatus) { + if (status !is OverViewStatus) { + itemView.setOnClickListener(null) + itemView.isClickable = false + if (iv.drawable != null) { + iv.setImageDrawable(null) + } + } else { + if (iv.background != null) { + iv.background = null + } + itemView.onClick { CallerHmiManager.showStatusSummaryDialog() } } - iv.setBackgroundResource(0) - iv.setImageDrawable(null) when(status) { is IpcStatus -> { if (status.enabled) { diff --git a/gradle/bytex/bytex_lancetx.gradle b/gradle/bytex/bytex_lancetx.gradle index 2f9e8ef35c..bc24404dd3 100644 --- a/gradle/bytex/bytex_lancetx.gradle +++ b/gradle/bytex/bytex_lancetx.gradle @@ -5,7 +5,8 @@ LancetX { blackList = [ "com.mogo.launcher.lancet.jank", "com.mogo.thread.opt.core", - "com.zhjt.mogo_core_function_devatools.perf" + "com.zhjt.mogo_core_function_devatools.perf", + "com.tencent.matrix" ] synchronizedLock { enabled rootProject.isJunkDetectEnable() diff --git a/gradle/ext.gradle b/gradle/ext.gradle index 95a1cbe4c3..25dea622b1 100644 --- a/gradle/ext.gradle +++ b/gradle/ext.gradle @@ -3,5 +3,5 @@ ext { kotlin_plugin_version = '1.5.30' plugin_version = '10.0.10_mogo' service_chain_version = '5.3.14' - lancetx_plugin_version = '10.0.4_mogo' + lancetx_version = '20.10.2' } \ No newline at end of file