From f09dd018e171c235a2b07c101603c55d9c24730a Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Tue, 14 Mar 2023 11:51:01 +0800 Subject: [PATCH 01/20] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eagle/core/data/enums/EventTypeEnumNew.kt | 2 +- .../icon_warning_v2x_changelanes.png | Bin 0 -> 17105 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100755 core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_changelanes.png diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt index ff26792172..550ae846f1 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt @@ -174,7 +174,7 @@ enum class EventTypeEnumNew( TYPE_USECASE_ID_LCW( 2003.toString(), "变道预警", - poiTypeSrcVr = R.drawable.icon_warning_v2x_reverse_overtaking, + poiTypeSrcVr = R.drawable.icon_warning_v2x_changelanes, content = "%s向变道预警", tts = "注意%s后车辆" ),//注意左后车辆/注意右后车辆 diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_changelanes.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_changelanes.png new file mode 100755 index 0000000000000000000000000000000000000000..96ba576d5cfc04a739fd5645d9d08b05743c8007 GIT binary patch literal 17105 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 M07*qoM6N<$f&y#)ga7~l literal 0 HcmV?d00001 From 615512a845df0a013e9c642d4c9af10e819121c4 Mon Sep 17 00:00:00 2001 From: renwj Date: Tue, 14 Mar 2023 14:12:22 +0800 Subject: [PATCH 02/20] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7LancetX=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index afc1ee4733..4cca99fc4e 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ buildscript { classpath 'com.mogo.cloud:systrace:1.0.1' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' classpath 'com.mogo.sticky:service:1.0.8' - classpath 'io.github.knight-zxw:lancet-plugin:0.0.4_mogo' + classpath 'io.github.knight-zxw:lancet-plugin:0.0.4.5_mogo' // classpath ("com.tencent.matrix:matrix-gradle-plugin:0.6.6") { changing = true } } From 7e3abc88e0cc14af0207ef9faf05dd16b34ed6d4 Mon Sep 17 00:00:00 2001 From: renwj Date: Tue, 14 Mar 2023 14:14:00 +0800 Subject: [PATCH 03/20] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96UiThreadHandler=E5=92=8CThreadUtils=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E4=B8=BB=E7=BA=BF=E7=A8=8B=E7=9A=84=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E4=B8=BB=E7=BA=BF=E7=A8=8B=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=98=9F=E5=88=97=E8=BF=87=E5=A4=9A=EF=BC=8C=E9=80=A0=E6=88=90?= =?UTF-8?q?=E5=8D=A1=E9=A1=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/bus/util/BusAnalyticsManager.java | 3 +- .../sweeper/util/SweeperAnalyticsManager.java | 3 +- .../mulprocess/OrderServiceImpl.java | 2 +- .../passenger/ui/leftmenu/LeftMenuOpen.kt | 12 +++--- .../ui/video/FloatingDistanceInfoUtils.kt | 4 +- .../utils/TaxiPassengerAnalyticsManager.java | 3 +- .../och/taxi/utils/TaxiAnalyticsManager.java | 3 +- app/build.gradle | 3 ++ .../com/mogo/launcher/lancet/MemoryLeakFix.kt | 6 ++- .../launcher/lancet/ObjectHashCodeProxy.java | 37 ++++++++++++++++++ .../eagle/core/utilcode/util/ThreadUtils.java | 23 ++++++----- .../core/utilcode/util/UiThreadHandler.java | 38 ++++++++----------- 12 files changed, 86 insertions(+), 51 deletions(-) create mode 100644 app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java index a8af2bdb38..b37e399e18 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java @@ -65,8 +65,7 @@ public class BusAnalyticsManager { } private void removeWaitingCallback() { - if (startAutopilotRunnable != null && - UiThreadHandler.getsUiHandler().hasCallbacks(startAutopilotRunnable)) { + if (startAutopilotRunnable != null) { UiThreadHandler.removeCallbacks(startAutopilotRunnable); } } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java index 16832a6c2b..b73559496e 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java @@ -68,8 +68,7 @@ public class SweeperAnalyticsManager { if (send) { // 开启成功,上报埋点 - if (startAutopilotRunnable != null && - UiThreadHandler.getsUiHandler().hasCallbacks(startAutopilotRunnable)) { + if (startAutopilotRunnable != null) { UiThreadHandler.removeCallbacks(startAutopilotRunnable); } mStartAutopilotParams.put(SweeperConst.EVENT_PARAM_START_RESULT, true); diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/OrderServiceImpl.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/OrderServiceImpl.java index 006be38689..f98ac9cc33 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/OrderServiceImpl.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/OrderServiceImpl.java @@ -15,7 +15,7 @@ public class OrderServiceImpl extends ILeftMenuService.Stub { @Override public void transmissionIndex(int index) throws RemoteException { CallerLogger.INSTANCE.d(SceneConstant.M_TAXI_P + TAG, "跨进程 transmissionIndex"+index); - UiThreadHandler.getsUiHandler().post(() -> { + UiThreadHandler.post(() -> { OverlayLeftViewUtils.INSTANCE.transmissionIndexGet(index); }); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/LeftMenuOpen.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/LeftMenuOpen.kt index 25e67ec138..3cea1f73ac 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/LeftMenuOpen.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/LeftMenuOpen.kt @@ -123,25 +123,25 @@ object LeftMenuOpen { windowManager?.let { windowManager -> if (it.x > NEGATIVEDEVIATION && movedX > 0) { open?.let { it1 -> - UiThreadHandler.getsUiHandler().post { + UiThreadHandler.post { it1(windowView, windowManager) } } } else { //更新悬浮球控件位置 - UiThreadHandler.getsUiHandler().post { + UiThreadHandler.post { windowManager.updateViewLayout(windowView, it) } } if (it.x < OverlayLeftViewUtils.DEVIATION_WIDTH + DEVIATION && movedX < 0) { close?.let { it1 -> - UiThreadHandler.getsUiHandler().post { + UiThreadHandler.post { it1(windowView, windowManager) } } } else { //更新悬浮球控件位置 - UiThreadHandler.getsUiHandler().post { + UiThreadHandler.post { windowManager.updateViewLayout(windowView, it) } } @@ -157,14 +157,14 @@ object LeftMenuOpen { if (startX > OverlayLeftViewUtils.DEVIATION_WIDTH / 2 && startX < 0) { //拖动距离大于一半 自动打开 open?.let { - UiThreadHandler.getsUiHandler().post { + UiThreadHandler.post { it(windowView!!, windowManager) } } } else if (startX < OverlayLeftViewUtils.DEVIATION_WIDTH / 2 && startX >= OverlayLeftViewUtils.DEVIATION_WIDTH) { // 拖动距离小于一半自动关闭 close?.let { - UiThreadHandler.getsUiHandler().post { + UiThreadHandler.post { it(windowView!!, windowManager) } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FloatingDistanceInfoUtils.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FloatingDistanceInfoUtils.kt index 5122739983..41622d9785 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FloatingDistanceInfoUtils.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/FloatingDistanceInfoUtils.kt @@ -177,13 +177,13 @@ object FloatingDistanceInfoUtils { fun setSpeed(speed: Float) { val newSpeed: Int = (Math.abs(speed) * 3.6f).toInt() // 倒车时工控机反馈定位信息中speed为负值 - UiThreadHandler.getsUiHandler().post { + UiThreadHandler.post { actvSpeed?.text = "$newSpeed" } } fun setDistance(meters:Long,remainDis: String?, disUnit: String, time: Int, arriveTime: String) { - UiThreadHandler.getsUiHandler().post { + UiThreadHandler.post { actvDistancew?.text = "$remainDis" actvDistancewUnit?.text = "距离($disUnit)" actvSurplusTime?.text = "$time" diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java index 5b55a89cca..21ff9ef517 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java @@ -78,8 +78,7 @@ public class TaxiPassengerAnalyticsManager { } private void removeWaitingCallback() { - if (startAutopilotRunnable != null && - UiThreadHandler.getsUiHandler().hasCallbacks(startAutopilotRunnable)) { + if (startAutopilotRunnable != null) { UiThreadHandler.removeCallbacks(startAutopilotRunnable); } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/TaxiAnalyticsManager.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/TaxiAnalyticsManager.java index 51b18b574f..49e2bd29bf 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/TaxiAnalyticsManager.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/TaxiAnalyticsManager.java @@ -47,8 +47,7 @@ public class TaxiAnalyticsManager { } private void removeWaitingCallback() { - if (startAutopilotRunnable != null && - UiThreadHandler.getsUiHandler().hasCallbacks(startAutopilotRunnable)) { + if (startAutopilotRunnable != null) { UiThreadHandler.removeCallbacks(startAutopilotRunnable); } } diff --git a/app/build.gradle b/app/build.gradle index fcec11c180..b215e3967f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,6 +64,9 @@ if (!isAndroidTestBuild()) { memory_leak { enable true } + object_hashcode { + enable true + } } } } 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 5357e485f6..dff034aefa 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/MemoryLeakFix.kt +++ b/app/src/main/java/com/mogo/launcher/lancet/MemoryLeakFix.kt @@ -11,6 +11,7 @@ import androidx.lifecycle.* import androidx.lifecycle.Lifecycle.Event import androidx.lifecycle.Lifecycle.Event.ON_DESTROY import com.knightboost.lancet.api.* +import com.knightboost.lancet.api.Scope.LEAF import com.knightboost.lancet.api.annotations.* import com.knightboost.lancet.api.annotations.Weaver import com.mogo.eagle.core.utilcode.kotlin.* @@ -24,8 +25,9 @@ import java.util.concurrent.ConcurrentHashMap @Group("memory_leak") class MemoryLeakFix { - @Insert - @ImplementedInterface("java.lang.Runnable") + @NameRegex("(com\\.mogo|com\\.zhidao|com\\.elegant|com\\.zhidaoauto|com\\.zhjt).*") + @Insert(mayCreateSuper = true) + @ImplementedInterface("java.lang.Runnable", scope = LEAF) @TargetMethod(methodName = "run") fun runProxy() { if (AccessSyntheticUtils.isTargetAlive(This.get())) { diff --git a/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java b/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java new file mode 100644 index 0000000000..136585b373 --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java @@ -0,0 +1,37 @@ +package com.mogo.launcher.lancet; + +import androidx.annotation.Keep; +import com.knightboost.lancet.api.Scope; +import com.knightboost.lancet.api.annotations.Group; +import com.knightboost.lancet.api.annotations.ImplementedInterface; +import com.knightboost.lancet.api.annotations.NameRegex; +import com.knightboost.lancet.api.annotations.ReplaceInvoke; +import com.knightboost.lancet.api.annotations.TargetMethod; +import com.knightboost.lancet.api.annotations.Weaver; +import java.util.concurrent.ConcurrentHashMap; + +@Weaver +@Group("object_hashcode") +@Keep +public class ObjectHashCodeProxy { + + public static final ConcurrentHashMap hashCodes = new ConcurrentHashMap<>(); + + @NameRegex("(com\\.mogo\\.eagle\\.core\\.utilcode\\.util\\.ThreadUtils|com\\.mogo\\.eagle\\.core\\.utilcode\\.util\\.UiThreadHandler)") + @ImplementedInterface(value = "java.lang.Object",scope = Scope.SELF) + @TargetMethod(methodName = "hashCode") + @ReplaceInvoke + public static int hashCodeProxy(Object r) { + Class clazz = r.getClass(); + String className = clazz.getName(); + if (hashCodes.containsKey(className)) { + Integer value = hashCodes.get(className); + if (value != null) { + return value; + } + } + int hashCode = System.identityHashCode(r); + hashCodes.put(className, hashCode); + return hashCode; + } +} diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ThreadUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ThreadUtils.java index 841f5bb5a9..40bc4cc367 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ThreadUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ThreadUtils.java @@ -2,6 +2,7 @@ package com.mogo.eagle.core.utilcode.util; import android.os.Handler; import android.os.Looper; +import android.os.Message; import android.util.Log; import java.util.HashMap; @@ -61,20 +62,24 @@ public final class ThreadUtils { return Looper.myLooper() == Looper.getMainLooper(); } - public static Handler getMainHandler() { - return HANDLER; - } - - public static void runOnUiThread(final Runnable runnable) { + public static void runOnUiThread(final Runnable r) { if (Looper.myLooper() == Looper.getMainLooper()) { - runnable.run(); + r.run(); } else { - HANDLER.post(runnable); + int what = r.hashCode(); + HANDLER.removeMessages(what); + Message msg = Message.obtain(HANDLER, r); + msg.what = what; + HANDLER.sendMessage(msg); } } - public static void runOnUiThreadDelayed(final Runnable runnable, long delayMillis) { - HANDLER.postDelayed(runnable, delayMillis); + public static void runOnUiThreadDelayed(final Runnable r, long delayMillis) { + int what = r.hashCode(); + HANDLER.removeMessages(what); + Message msg = Message.obtain(HANDLER, r); + msg.what = what; + HANDLER.sendMessageDelayed(msg, delayMillis); } /** diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/UiThreadHandler.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/UiThreadHandler.java index 8bfad615ad..b3a65e4f68 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/UiThreadHandler.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/UiThreadHandler.java @@ -2,40 +2,32 @@ package com.mogo.eagle.core.utilcode.util; import android.os.Handler; import android.os.Looper; +import android.os.Message; public class UiThreadHandler { private static final Handler sUiHandler = new Handler( Looper.getMainLooper() ); - private static final Object sToken = new Object(); - - public UiThreadHandler() { - } + private UiThreadHandler() { } public static boolean post( Runnable r ) { - return sUiHandler != null && sUiHandler.post( r ); + int what = r.hashCode(); + sUiHandler.removeMessages(what); + Message msg = Message.obtain(sUiHandler, r); + msg.what = what; + return sUiHandler.sendMessage(msg); } public static boolean postDelayed( Runnable r, long delayMillis ) { - return sUiHandler != null && sUiHandler.postDelayed( r, delayMillis ); + int what = r.hashCode(); + sUiHandler.removeMessages(what); + Message msg = Message.obtain(sUiHandler, r); + msg.what = what; + return sUiHandler.sendMessageDelayed(msg, delayMillis); } - public static Handler getsUiHandler() { - return sUiHandler; - } - - public static boolean postOnceDelayed( Runnable r, long delayMillis ) { - if ( sUiHandler == null ) { - return false; - } else { - sUiHandler.removeCallbacks( r, sToken ); - return sUiHandler.postDelayed( r, delayMillis ); - } - } - - public static void removeCallbacks( Runnable runnable ) { - if ( sUiHandler != null ) { - sUiHandler.removeCallbacks( runnable ); - } + public static void removeCallbacks( Runnable r ) { + int what = r.hashCode(); + sUiHandler.removeMessages(what); } } \ No newline at end of file From 33a2f2dfe465d2f3a9d8bd6ef6f21a0f10cf9b27 Mon Sep 17 00:00:00 2001 From: renwj Date: Tue, 14 Mar 2023 16:02:27 +0800 Subject: [PATCH 04/20] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96TextView=E9=A2=91=E7=B9=81=E8=B0=83=E7=94=A8setText?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84=E9=A2=91=E7=B9=81=E7=BB=98=E5=88=B6?= =?UTF-8?q?=E9=97=AE=E9=A2=98;=20=E4=BC=98=E5=8C=96=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=A0=8F=E4=B8=8A=E5=B7=A5=E6=8E=A7=E6=9C=BA=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E7=9A=84=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 + .../launcher/lancet/ObjectHashCodeProxy.java | 3 +- .../launcher/lancet/TextViewSetTextOpt.java | 40 ++++++++++++ build.gradle | 2 +- .../status/flow/can/CanImpl.kt | 23 ------- .../status/flow/trace/TracingImpl.kt | 63 ++++++++++++++----- .../function/hmi/ui/widget/VersionNameView.kt | 13 ++-- .../eagle/core/utilcode/kotlin/Extensions.kt | 18 +++--- 8 files changed, 112 insertions(+), 53 deletions(-) create mode 100644 app/src/main/java/com/mogo/launcher/lancet/TextViewSetTextOpt.java diff --git a/app/build.gradle b/app/build.gradle index b215e3967f..7015ee7a02 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,6 +67,9 @@ if (!isAndroidTestBuild()) { object_hashcode { enable true } + TextView_setTextProxy { + enable true + } } } } diff --git a/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java b/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java index 136585b373..428a52158a 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java +++ b/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java @@ -6,6 +6,7 @@ import com.knightboost.lancet.api.annotations.Group; import com.knightboost.lancet.api.annotations.ImplementedInterface; import com.knightboost.lancet.api.annotations.NameRegex; import com.knightboost.lancet.api.annotations.ReplaceInvoke; +import com.knightboost.lancet.api.annotations.TargetClass; import com.knightboost.lancet.api.annotations.TargetMethod; import com.knightboost.lancet.api.annotations.Weaver; import java.util.concurrent.ConcurrentHashMap; @@ -18,7 +19,7 @@ public class ObjectHashCodeProxy { public static final ConcurrentHashMap hashCodes = new ConcurrentHashMap<>(); @NameRegex("(com\\.mogo\\.eagle\\.core\\.utilcode\\.util\\.ThreadUtils|com\\.mogo\\.eagle\\.core\\.utilcode\\.util\\.UiThreadHandler)") - @ImplementedInterface(value = "java.lang.Object",scope = Scope.SELF) + @TargetClass(value = "java.lang.Object",scope = Scope.SELF) @TargetMethod(methodName = "hashCode") @ReplaceInvoke public static int hashCodeProxy(Object r) { diff --git a/app/src/main/java/com/mogo/launcher/lancet/TextViewSetTextOpt.java b/app/src/main/java/com/mogo/launcher/lancet/TextViewSetTextOpt.java new file mode 100644 index 0000000000..0a0ed2611f --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/lancet/TextViewSetTextOpt.java @@ -0,0 +1,40 @@ +package com.mogo.launcher.lancet; + +import android.os.Looper; +import android.util.Log; +import android.widget.TextView; + +import com.knightboost.lancet.api.Scope; +import com.knightboost.lancet.api.annotations.Group; +import com.knightboost.lancet.api.annotations.NameRegex; +import com.knightboost.lancet.api.annotations.ReplaceInvoke; +import com.knightboost.lancet.api.annotations.TargetClass; +import com.knightboost.lancet.api.annotations.TargetMethod; +import com.knightboost.lancet.api.annotations.Weaver; + +@Weaver +@Group("TextView_setTextProxy") +public class TextViewSetTextOpt { + + @NameRegex("(com\\.mogo|com\\.zhidao|com\\.elegant|com\\.zhidaoauto|com\\.zhjt).*") + @TargetClass(value = "android.widget.TextView",scope = Scope.ALL) + @TargetMethod(methodName = "setText") + @ReplaceInvoke + public static void setText(TextView view, CharSequence text) { + if (Looper.myLooper() != Looper.getMainLooper()) { + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + StringBuilder sb = new StringBuilder(); + for (StackTraceElement trace : stackTrace) { + sb.append(trace.getClassName()).append(".").append(trace.getMethodName()).append("(").append(trace.getLineNumber()).append(")").append("\n"); + } + if (sb.length() > 1) { + sb.setLength(sb.length() - 1); + } + Log.e("ALERT", sb.toString()); + } + CharSequence old = view.getText(); + if (old != null && !old.equals(text)) { + view.setText(text); + } + } +} diff --git a/build.gradle b/build.gradle index 4cca99fc4e..15dd159557 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ buildscript { classpath 'com.mogo.cloud:systrace:1.0.1' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' classpath 'com.mogo.sticky:service:1.0.8' - classpath 'io.github.knight-zxw:lancet-plugin:0.0.4.5_mogo' + classpath 'io.github.knight-zxw:lancet-plugin:0.0.4.8_mogo' // classpath ("com.tencent.matrix:matrix-gradle-plugin:0.6.6") { changing = true } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt index f586b22478..0355ebb2b9 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt @@ -10,10 +10,7 @@ import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.utilcode.kotlin.safeCancel import com.zhjt.mogo_core_function_devatools.status.entity.CanStatus import com.zhjt.mogo_core_function_devatools.status.flow.IFlow -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import mogo_msg.MogoReportMsg.MogoReportMessage import system_master.SystemStatusInfo.StatusInfo import java.util.concurrent.atomic.AtomicInteger @@ -55,7 +52,6 @@ internal class CanImpl(ctx: Context) : override fun onAutopilotLightSwitchData(lightSwitch: LightSwitch?) { send(CanStatus(isCanEnabled())) - timeOutCheck() } private fun isCanEnabled(): Boolean { @@ -66,23 +62,19 @@ internal class CanImpl(ctx: Context) : override fun onAutopilotBrakeLightData(brakeLight: Boolean) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotSteeringData(steering: Float) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotGearData(gear: GearPosition) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) { super.onAutopilotIpcConnectStatusChanged(status, reason) send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotDataException(timestamp: Long) { @@ -92,28 +84,23 @@ internal class CanImpl(ctx: Context) : override fun onAutopilotAcc(carAcc: Float) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotThrottle(throttle: Float) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotBrake(brake: Float) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onSweeperFutianCleanSystemState(cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotGuardian(guardianInfo: MogoReportMessage?) { super.onAutopilotGuardian(guardianInfo) send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotStatusRespByQuery(status: StatusInfo) { @@ -124,24 +111,14 @@ internal class CanImpl(ctx: Context) : } } - private fun timeOutCheck() { - job?.safeCancel() - launch(Dispatchers.Unconfined) { - delay(4000) - send(CanStatus(isCanEnabled())) - }.also { job = it } - } - override fun onDestroy() { super.onDestroy() job?.safeCancel() - CallerChassisAccStateListenerManager.removeListener(TAG) CallerChassisBrakeStateListenerManager.removeListener(TAG) CallerChassisGearStateListenerManager.removeListener(TAG) CallerChassisSteeringStateListenerManager.removeListener(TAG) CallerChassisThrottleStateListenerManager.removeListener(TAG) - CallerAutoPilotStatusListenerManager.removeListener(TAG) CallerChassisLamplightListenerManager.removeListener(TAG) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt index f7018bcd9d..c9f9ff338c 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt @@ -9,6 +9,8 @@ import com.zhjt.mogo_core_function_devatools.status.entity.* import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.* import com.zhjt.mogo_core_function_devatools.status.flow.* import mogo_msg.MogoReportMsg.MogoReportMessage +import java.util.concurrent.atomic.AtomicInteger +import java.util.concurrent.atomic.AtomicReference internal class TracingImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotStatusListener { @@ -18,6 +20,14 @@ internal class TracingImpl(ctx: Context): IFlow(ctx), IMoGoAutopi private var old: TracingStatus.Tracing = UNKNOWN + private val ipcConnectStatus by lazy { AtomicInteger() } + + private val ipcStatus by lazy { AtomicInteger() } + + private val reportCode by lazy { AtomicReference() } + + private val reportMsg by lazy { AtomicReference() } + override fun onCreate() { val code = CallerAutoPilotStatusListenerManager.getAutoPilotReportMessageCode() val msg = CallerAutoPilotStatusListenerManager.getAutoPilotReportMessageContent() @@ -30,32 +40,53 @@ internal class TracingImpl(ctx: Context): IFlow(ctx), IMoGoAutopi override fun onAutopilotGuardian(guardianInfo: MogoReportMessage?) { super.onAutopilotGuardian(guardianInfo) - val current = guardianInfo?.code - val newState = current?.toState(guardianInfo.msg) - if (newState != null) { - old = newState - send(TracingStatus(newState)) + val code = guardianInfo?.code + val message = guardianInfo?.msg + try { + if (code != reportCode.get() || message != reportMsg.get()) { + val newState = code?.toState(message) + if (newState != null) { + old = newState + send(TracingStatus(newState)) + } + } + } finally { + reportCode.set(code) + reportMsg.set(message) } } override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) { super.onAutopilotIpcConnectStatusChanged(status, reason) - if (!CallerAutoPilotControlManager.isConnected()) { - old = UNKNOWN - send(TracingStatus(UNKNOWN)) + try { + if (ipcConnectStatus.get() != status) { + if (!CallerAutoPilotControlManager.isConnected()) { + old = UNKNOWN + send(TracingStatus(UNKNOWN)) + } + } + } finally { + ipcConnectStatus.set(status) } } override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { super.onAutopilotStatusResponse(autoPilotStatusInfo) - if (autoPilotStatusInfo.state != STATUS_AUTOPILOT_RUNNING) { - old = UNKNOWN - send(TracingStatus(UNKNOWN)) - return - } - if (old.isException()) { - old = TRACK_LOADED - send(TracingStatus(TRACK_LOADED)) + val state = autoPilotStatusInfo.state + try { + if (ipcStatus.get() != state) { + if (state != STATUS_AUTOPILOT_RUNNING) { + old = UNKNOWN + send(TracingStatus(UNKNOWN)) + return + } + if (old.isException()) { + old = TRACK_LOADED + send(TracingStatus(TRACK_LOADED)) + } + } + } finally { + ipcStatus.set(state) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt index 383f583392..38f45fd28e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt @@ -11,10 +11,12 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.main.AppListActivity +import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.view_version_name.view.* +import kotlinx.coroutines.* /** * @author XuXinChao @@ -65,13 +67,16 @@ class VersionNameView @JvmOverloads constructor( */ @SuppressLint("SetTextI18n") private fun showCurrentMapVersion() { - UiThreadHandler.post { - tvMapVersionName?.let { - if (!dockerVersion.isNullOrEmpty()) { - it.text = "MAP:${dockerVersion}" + val old = tvMapVersionName?.text + val version = dockerVersion + if (!version.isNullOrEmpty() && old != version) { + scope.launch { + tvMapVersionName?.also { + it.text = version } } } + } override fun onAttachedToWindow() { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/Extensions.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/Extensions.kt index 69426b4941..1906970bf1 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/Extensions.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/Extensions.kt @@ -39,16 +39,18 @@ val T.lifecycleOwner: LifecycleOwner init { if (ViewCompat.isAttachedToWindow(this@lifecycleOwner)) { lifecycle.let { - if (it.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) { - it.currentState = Lifecycle.State.CREATED - } + post { + if (it.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) { + it.currentState = Lifecycle.State.CREATED + } - if (it.currentState.isAtLeast(Lifecycle.State.CREATED)) { - it.currentState = Lifecycle.State.STARTED - } + if (it.currentState.isAtLeast(Lifecycle.State.CREATED)) { + it.currentState = Lifecycle.State.STARTED + } - if (it.currentState.isAtLeast(Lifecycle.State.STARTED)) { - it.currentState = Lifecycle.State.RESUMED + if (it.currentState.isAtLeast(Lifecycle.State.STARTED)) { + it.currentState = Lifecycle.State.RESUMED + } } } } From dc13d84957e090569a53f8bbb2c83bd3eed3e972 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Tue, 14 Mar 2023 18:01:03 +0800 Subject: [PATCH 05/20] [dev_arch_opt_3.0] add log --- .../binding/BindingCarNetWorkManager.kt | 13 +++++++++---- .../function/hmi/ui/setting/DebugSettingView.kt | 3 +++ .../src/main/java/com/mogo/map/AMapViewWrapper.java | 3 +++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt index e7a8d157db..7d4909b308 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt @@ -72,7 +72,7 @@ class BindingCarNetWorkManager private constructor() { override fun onSubscribe(d: Disposable) {} override fun onNext(info: BindingCarInfo) { if (info != null && info.getData() != null) { - d(SceneConstant.M_BINDING + TAG, "getBindingCarInfo data =" + info.getData().toString()) + d(SceneConstant.M_BINDING + TAG, "getBindingCarInfo data =" + info.getData().toString() + "---getDefaultId() : ${getDefaultId()}") SharedPrefsMgr.getInstance(context).putString( SharedPrefsConstants.CAR_INFO, GsonUtils.toJson(info.getData()) @@ -82,16 +82,16 @@ class BindingCarNetWorkManager private constructor() { "3" -> showModifyBindingCarDialog() "null" -> TipToast.shortTip("当前工控机没有入库") } - updateCarVrIconRes(info.getData().brandId); + updateCarVrIconRes(info.getData().brandId) } else { SharedPrefsMgr.getInstance(context).putString(SharedPrefsConstants.CAR_INFO, "") - e(SceneConstant.M_BINDING + TAG, "getBindingCarInfo data = null ") + e(SceneConstant.M_BINDING + TAG, "getBindingCarInfo data = null ---getDefaultId() : ${getDefaultId()} ") } } override fun onError(e: Throwable) { SharedPrefsMgr.getInstance(context).putString(SharedPrefsConstants.CAR_INFO, "") - e(SceneConstant.M_BINDING + TAG, "getBindingCarInfo onError e = " + e.toString() + "---e.getMessage = " + e.message) + e(SceneConstant.M_BINDING + TAG, "getBindingCarInfo onError e = " + e.toString() + "---e.getMessage = " + e.message + "---getDefaultId() : ${getDefaultId()}") } override fun onComplete() {} @@ -156,22 +156,27 @@ class BindingCarNetWorkManager private constructor() { d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes : $brandId") when (brandId) { "1" -> { //东风 + d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes -------1-------") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.chuzuche) HdMapBuildConfig.currentCarVrIconRes = R.raw.chuzuche } "2" -> { //红旗 + d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes -------2-------") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.hq_h9) HdMapBuildConfig.currentCarVrIconRes = R.raw.hq_h9 } "3" -> { //金旅 + d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes -------3-------") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.xiaobache) HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaobache } "4" -> { //开沃 + d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes -------4-------") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.xiaobache) HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaobache } "5" -> { //福田 + d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes -------5-------") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.huanwei) HdMapBuildConfig.currentCarVrIconRes = R.raw.huanwei } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index a59e5d2ef7..f83e23ef14 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -68,6 +68,7 @@ import com.mogo.eagle.core.utilcode.kotlin.currentPadding import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant @@ -534,9 +535,11 @@ internal class DebugSettingView @JvmOverloads constructor( tbChangeCurrentCarIcon.setOnCheckedChangeListener { _, isChecked -> if (!isChecked) { // 替换为出租车图标 + CallerLogger.d(SceneConstant.M_BINDING + TAG, " debugsettingview chuzuche ") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.chuzuche) } else { // 替换为小巴车图标 + CallerLogger.d(SceneConstant.M_BINDING + TAG, " debugsettingview xiaobache ") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.xiaobache) } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java index e8761a7d41..a69c6b5431 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -4,6 +4,7 @@ import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_ALIAS_CODE import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_ALIAS_CODE_INIT_ON_MAP_LOADED; import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_INIT; import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LOG_CONNECT_STATUS; +import static com.mogo.eagle.core.utilcode.mogo.logger.Logger.d; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_MAP; import static com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_300; import static com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS; @@ -40,6 +41,7 @@ import com.mogo.eagle.core.function.call.map.CallerMapDevaListenerManager; import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager; import com.mogo.eagle.core.function.call.map.CallerMapStyleListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant; import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.hdcache.IHdCacheListener; @@ -679,6 +681,7 @@ public class AMapViewWrapper implements IMogoMapView, @Override public void changeCurrentIcon(int iconId) { if (checkAMapView()) { + d(SceneConstant.M_BINDING + TAG, "changeCurrentIcon iconId = " + iconId); mMapView.getMapAutoViewHelper().getMyLocationStyle().myLocationIcon(iconId, true); } } From cc069c578cb686f9d635d2a01888941be3c48e27 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Tue, 14 Mar 2023 18:17:30 +0800 Subject: [PATCH 06/20] [dev_arch_opt_3.0] opt --- .../binding/BindingCarNetWorkManager.kt | 5 ----- .../eagle/core/function/hmi/ui/setting/DebugSettingView.kt | 2 -- .../mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java | 1 - 3 files changed, 8 deletions(-) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt index 7d4909b308..af836ff881 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt @@ -156,27 +156,22 @@ class BindingCarNetWorkManager private constructor() { d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes : $brandId") when (brandId) { "1" -> { //东风 - d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes -------1-------") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.chuzuche) HdMapBuildConfig.currentCarVrIconRes = R.raw.chuzuche } "2" -> { //红旗 - d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes -------2-------") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.hq_h9) HdMapBuildConfig.currentCarVrIconRes = R.raw.hq_h9 } "3" -> { //金旅 - d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes -------3-------") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.xiaobache) HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaobache } "4" -> { //开沃 - d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes -------4-------") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.xiaobache) HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaobache } "5" -> { //福田 - d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes -------5-------") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.huanwei) HdMapBuildConfig.currentCarVrIconRes = R.raw.huanwei } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index f83e23ef14..c660e3ca31 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -535,11 +535,9 @@ internal class DebugSettingView @JvmOverloads constructor( tbChangeCurrentCarIcon.setOnCheckedChangeListener { _, isChecked -> if (!isChecked) { // 替换为出租车图标 - CallerLogger.d(SceneConstant.M_BINDING + TAG, " debugsettingview chuzuche ") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.chuzuche) } else { // 替换为小巴车图标 - CallerLogger.d(SceneConstant.M_BINDING + TAG, " debugsettingview xiaobache ") CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.xiaobache) } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java index a69c6b5431..81685eb25c 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -681,7 +681,6 @@ public class AMapViewWrapper implements IMogoMapView, @Override public void changeCurrentIcon(int iconId) { if (checkAMapView()) { - d(SceneConstant.M_BINDING + TAG, "changeCurrentIcon iconId = " + iconId); mMapView.getMapAutoViewHelper().getMyLocationStyle().myLocationIcon(iconId, true); } } From 2543a0e05eca45d4c0a9a76fa1d591b931cf3eb4 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 14 Mar 2023 18:41:33 +0800 Subject: [PATCH 07/20] =?UTF-8?q?[opt-3.0]=E4=BF=AE=E5=A4=8D=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E7=AA=97=E5=88=87=E6=8D=A2=E8=87=AA=E8=BD=A6=E6=A8=A1?= =?UTF-8?q?=E5=9E=8BBug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eagle/core/function/hmi/ui/setting/DebugSettingView.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index c660e3ca31..b784faaac9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -806,9 +806,9 @@ internal class DebugSettingView @JvmOverloads constructor( } //初始化切换自车按钮文本(Bus版本默认显示:切换自车为出租车) - if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { - tbChangeCurrentCarIcon.isChecked = true - } +// if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { +// tbChangeCurrentCarIcon.isChecked = true +// } //初始化ADAS日志开关状态 tbADASLog.isChecked = CallerAutoPilotControlManager.isEnableLog() From 44081ab185b9311a0b36fe9eaa05e4c0695d1810 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Tue, 14 Mar 2023 18:58:24 +0800 Subject: [PATCH 08/20] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eagle/core/data/enums/EventTypeEnumNew.kt | 8 ++++---- .../icon_warning_v2x_abnormal_car.png | Bin 0 -> 15870 bytes .../icon_warning_v2x_abnormal_vehicle.png | Bin 15888 -> 17968 bytes .../icon_warning_v2x_car_breakdown.png | Bin 0 -> 16810 bytes .../icon_warning_v2x_collision_warning.png | Bin 18178 -> 17993 bytes .../icon_warning_v2x_crossroads_warning.png | Bin 0 -> 18386 bytes .../icon_warning_v2x_turn_left.png | Bin 0 -> 16603 bytes 7 files changed, 4 insertions(+), 4 deletions(-) create mode 100755 core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_abnormal_car.png create mode 100644 core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_car_breakdown.png create mode 100644 core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_crossroads_warning.png create mode 100644 core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_turn_left.png diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt index 550ae846f1..aea8bbfd7e 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt @@ -153,14 +153,14 @@ enum class EventTypeEnumNew( TYPE_USECASE_ID_ICW( 2009.toString(), "交叉路口碰撞预警", - poiTypeSrcVr = R.drawable.icon_warning_v2x_collision_warning, + poiTypeSrcVr = R.drawable.icon_warning_v2x_crossroads_warning, content = "交叉路口碰撞预警", tts = "注意交叉路口车辆" ), TYPE_USECASE_ID_LTA( 2001.toString(), "左转辅助", - poiTypeSrcVr = R.drawable.icon_warning_v2x_collision_warning, + poiTypeSrcVr = R.drawable.icon_warning_v2x_turn_left, content = "左转碰撞预警", tts = "注意路口对向来车" ), @@ -196,7 +196,7 @@ enum class EventTypeEnumNew( TYPE_USECASE_ID_AVW( 2006.toString(), "异常车辆提醒", - poiTypeSrcVr = R.drawable.icon_warning_v2x_abnormal_vehicle, + poiTypeSrcVr = R.drawable.icon_warning_v2x_abnormal_car, content = "%s车异常", tts = "小心%s异常车辆" ), @@ -269,7 +269,7 @@ enum class EventTypeEnumNew( TYPE_USECASE_ID_BREAKDOWN_WARNING( //故障车辆 101.toString(), "车辆故障", - poiTypeSrcVr = R.drawable.icon_warning_v2x_collision_warning, + poiTypeSrcVr = R.drawable.icon_warning_v2x_car_breakdown, content = "前方%s米有故障车辆,影响路段%s米", tts = "前方%s米有故障车辆,影响路段%s米" ), diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_abnormal_car.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_abnormal_car.png new file mode 100755 index 0000000000000000000000000000000000000000..019b02ef39fdca31bf13909d8a6c1775af43b24e GIT binary patch literal 15870 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 literal 0 HcmV?d00001 diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_abnormal_vehicle.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_abnormal_vehicle.png index e316ad9b1ce506c8fd732091a1f7062ff5c901f5..d5e06b5a94a3e20363849230f018388b6addfda4 100644 GIT binary patch literal 17968 zcmV)SK(fDyP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91c%TCS1ONa40RR91cmMzZ00`n$?f?Kl07*naRCod1y$P6YS6S!1_Nl5n zWP%J3AR`%WNB|*(7y=|*!ju33v>5_4C<6N6r?%bNwu+B}t69okK%hfSvKuxV?DwP|~3n|8ZSr_)^&;;s|H-L&o6TBo1MhBlpUm`u72 zqpocb|AuKdy`fE}m$o*#WIF9G8SOc_?2%_)x%tOEJ>8FE0M{LV=;70Cizlc+PoK8w zQ7Y{IDpIEca#n4d>PKYLCY*l283C$IC(zV_Nxjklqh^O?H3bmqrrlLidfvFTGZ&`q z^aIcT&P5^k<8%J8DDZXb*X=dkw(W&ldnZgMlM|Hsy(`5o+a$uEJTab8T|Cn-@MN05ri&jfut~-d*2y-RT;hvGeMM4?p6(OK%kCk95QDAIUa7>5$dm z-!wjXyx6^3IX+QUnRnvlajZaRUqzu_BgLS!0}JX`D3O7v7O)GfZMd-3;c5y4i*^Lg zp-X2M9&XUu(+zgrqBu^QPP+HD{pUV%=xN{DV#1HuX%^*=h+{WCd2}KPv4YK z>B)5Nt%qLxtuxK@0G}d;2hfR|pS|v+#l`XObkpgvWUO*UCRsssos1$-2H}-y9PbMp zqbR6Wn3b4L;;Dkg2D&x2!nB7`XF?~+&FY3l=iYw7sN@jUB5;AI5jT07G*WWTs2jcI zkPE+knurfrD$hIg$!`*ZPYhmC>RfP$QJ9i5 zJE!F1Qq80>oybL_6tSYA;R!3+g;pm9h>WvQe;l!%LV}|upC!_Wc9-*n{*`qXUipP! z`nNsLJpVVcd)sp!y~nt1`EN?*>%4`M8@5k1UZzCL1XEFxX=3EsITr>Aukh^QvmPZ@ zH$I_8d{#k$QN;}s%BtX&g&@2YCV>HFAsI$U69XR5@)JKm1RH}K3xv(A;_#$F-DGs? z>V=(tYrhLFxY@k_MyK@S{syUD-%D?46n^G7F9A((Tz-uLMI|t zE`$7PtR@tbhBO<0vu?zG^Pmg9{r~CZR&c;|KQ=7i?``7?58iLfmiG4w@~Iee9-N^t z?;MbzBo0?HIIkFblGLX~ux3lpMf9~#Bk7%v=G-?up`iKp2vUC&22SM}OJ3V{S1TGG z3j|<$b}qgNer{g(eTFl+wUEW+v0{}PJ!rXEPQPZ|MVEin zg!}0<^Y%VAFn!bd`P;s9?OXNS_t*4vfY9UG=VY*CGBE^Bao_;%Ad`hrWfs zJpn+m6_&_>iBfj{^x(Y@`0eh@GZ$gIuUlpEKGnPNCF}NC+&p=|B6^Y|LAxUI>J!4D z5}|R?6LP;gtI)cZT0VJ$C;6EaJ>II6#N4ut*QqbCWU_h7Ou6(#6GUmqtk+$2q+e%@ zXc90FY!KPN&iqf3xCjZlukTC}#-3C~W0DqQ*&KD}E-uW!?69w2dacFp!xL`br)|Se z9eTKC_{X)X_9ajk#g)KJ1nj$5^5%=Acoei*C@3jmwv!oF35zclpa76M!w+vxges1= zOy~$Bt7~u+v2MBoZ`}gn6PI}87plRaA$xtIBObS>C7Y0HV0&juQgM1az+KtgkmJ;tYmR{koKlBMdQ19IUamjitsP_qU z>5x1ce5E%o{D1*flApa$hzqYLArxA;Wk!vV4cJx%S_kN^(;n1beaJ=MexF7^R4WgE zU?rPhyzV5uocw1cWWG(@v>X}{z&_R2DIa99LCtqWtJ3x&NrYC^TUkiikTXrq#mui$4i zNn0j-CKt8K<1~Dp9+;LM?E+)HMt{){yOPoM1GkMYJN!v)aq?*uW~W)=i7Ep_a}2|V z3rr4qFIC5jRb&7_&sohEX(U z&e(b>j&Q}wGH`)Hu1~nK)E5R`ba4=IP8cM5U6^q;@_Owo!%ysg$Yb^pVf@V8oGl{ z{;($|T(q0yQ4+xF$~rn+2;&4(3E&(@QKB66NZB+5X?^8VR;VJAyI5 zkG&8a-rz^TybzlG;I2mKa9`|!!_SD(La8-w8AB$t>xsEs4Xut%Vu*6&DPHc4x_!58 zo4ik-9-SBEUbTBIu;s$*x~#vJy6=?pLE6duYHR~zmb@G)D6|%t-$6}4t<_( z1U{n0Fsp$4ppN#EAttO{c!Nr%&$uoGtuBH=401~iYyi_QEf zgISYOwkF-ptLIi9wa@wI-=nu0(S5f~iSD+%{IIiR{kWc)J5yZnkuJ~~%;FTYymnz3 zi*7l3#Nj6+j!Y4N&pYv&7=G+1e79z|w))89+v+2p)VhUL7Oj;i4J)q7zVK#kZq~1xQrtXQ*;6rgRRFk$rMB>Dwl%F zBM=9T+YNM9_QHEpK6}9V7e8GSvsgi{*k&>-k^{N*6^Ff6Z@Ik_C+tfGF<(puf+PuM7Mo4bi?>^|b6fqyXSY?4`pMSK>DC0k)YHQQ+^|TN zPnuy?=t{CUHRKz@DPwtgw(*?LwA(-Qk8OPWZQ&rYYS5*`&U*!elOC^X1>~K=Oi>ue z*au8ZBF1kiv$`OlJ1hVR_wxsyf62Q7-tk#l@48K2`{+HkZQORLinC`FP6ZiC;ZPQ; z9IzWcMX)imU3wW4PJ5ckmJ5`<&^W~45v;+2in{tIPi&*L{D~1bX{+n!vh9=vZdcsm z9Tp5e=|YcnQiLHr@po15>E=ySihRdepNcm(TtFN|w|tZV$HM*%E=)Q0NT2T_5C|VU z4MGTvGXx-J_{oKOFmAGN^W13FqwelAUSX@GR_M3Ba@}96fUmcOUOi%wq{5rzlihJ4 z(vul42=T;A55ZaJn%VIngV1!H+hvco=IN)j`G*~dl=W2+jG#z^!t}UpTc?ZHe7h~) za7`QE^!+xz@%lF2c!%$trqcQg`6r4IWh@a^Yz`i?>#%h@Oa4jA`JW_-acoHP#Y?D6!b3x)y~e zOn2%57hL)a$+TjZp07x2TVHj=G2PHOKus6=JRB;D*I3PDwRf$yPtU?WVT%qVw9;Z=c`B*IyG)w&3&K z4@vBe8%JT>j7K+{DE@VAexC!{s>2`K)*k)THrnf_Ak3*We6klhNE$9{G(6cleRq z5)bZW=WQ=v_a&)(Vn1t9+i4dBJWVX02Qs zVkDp;Z1imN7D1UXbk;dK?|=&~I%X!g6k1|sNLqZQ-rt?Hf3;KjWC(iQ*_zix?6Y6s zMRYEty$M_dhDZ52IVXb?LsBXD+z8soqT(I?#gkqMHhfkAAFm1DH$UTx=Rzo4ys%G3Ko z+dq+)6kCPf{FN_FZ~n`-x3+Ct2vcA|@b|4;D1_~BVjoZIb}AVlMOM_CrFR+1xSKoq zz;9l-;$Khnlyx~#yaV8a+vk^y=c^b9P@Au71jxSxqKBa~zO}>BssP$5G zMvuiF$?UnMpA6!R4Z(@cx>eK&dosle;fGjNZz7Xc>bIWz z(YEDlXQw=R5`+QYuupHDXu&rf(!;J}v*HD7ZqD#p#uyRgKM2c#gF9u>W0|h)wEo#` z*Hd1tk2lQw;5i5VbEY!kpV>lZ|sM%LE|Zkt-0f-L4c2r zSFtT?BnZTtFJn*4kiCR_Q%ia;p@eDSJcP@F-xFX+qWH#ju* zyHbt;{}G$@u*QZh9ErEhY1??_C)zDWFTSU)5vdc}?a_ zRoDz0!JmZkRVMtysr06LhPLA#SiS*M7vtuBOVD-=(vmj)*+(C}xNY%^J<>ttNC~ch z!DPGvFpw9Tg0nF^i8mUUgC@fKQM#de?D2+!&2u(_6U$`7O>NU@?`qRq^@sFgh?^(+ zkdG*HOu#i?J+U+n5%H`^Yyot}AOxArMdlW6ERHBA^Ngdc*y z@1L3fp(xKoG;ocrmKiDG@$|JzWHeY(;OQ@)v|7Qv6sB}D`1^ok=pYEB4$x(A2^>7$ z+Ds3oZs$GP!joStQyNQ0-y^H>_}a_7Eq7ZtXVB;uFXD*sBR+n7?VtmOUU9JD0`Zns^2vhw&~(?cel z^6DH&NqZO;lLS2Lo%!%Qrc=2LPCU*A&X3x{@h@-P>YW^jwGyokbWU!+v28j1z0%94 zJR(?l2p1k716MMY!oVzge?1-WvpwPf9Wcw-IwS+i6qW!Z{gxeiqf$3xKu@-ynXbum z`~Q4L8(()V6corD_N=V6HEX)vf9*G2{Mls34Rnx^h`r|r0ReG-?0f8<=GGV=V^^xl zsIk8C;@WGkIvE$LEh+GLsxLelHV0yt6B~Am#m+KFM`PL!$C9-U;ZP&K(K@|h@R0qD zFU^(EsaEWkPrSRe%^MZgKoxzW&kwmJ~L0@_U!;peSEKa9= zODmbgNRz1~o8oyQQ3-z3Hf?IR{HflL*NxZES773sf8;^kPS1_p6N(E&k1P#7>11M1 z&?sK?*s5Xzdw0PP_7L}B1HEdm@;Og%xlMomsJ%o#(H6_9J;5Lb#8&u{2}vgeQcos# zna+*}KuPG<>e=s+VIl(3&4Fzw@k;X6GxQgxx7;B9fi{Dw0JQ@!1_UW2zdF3#V_kzN zC_;gc+Zgf5mdk57@u}AaF7yOUny)&6p`n~UCj%1$n3+Mbq15aOZV3&Muv7w;`vlUcx;J%uw0VP}zw=fvxdI%+Q=-TDHz zO&edR2cH21N5%VfXYf|jLOJ)=r z>TVdWK0Mepu-7=mb}w9Q$%_|X*zS1Gsr}ea=XTxgv{Sdst6w9OWQd_wtK$I|2Qr57 z0UI1Ez&%f|r_)E%I{op%win_vtuOGTo1S1@U<*L+pn2$(Oq4|B-#BGK?GOZl^2~Ph z`h%7Swb3C*TX!X+oS)vLcYZE7TRO2IIXd~ExYbxOMhF+XNl%9?K0ag)2QEat^rj0% z<;F^HXpGZ0US3gjebfm-^Y=3TD6Pd^FNpkoLAoL{g0Q2`;>2e)VcY!Hs@?h%r?qVt zUnpTugPsrf)~>-K)Q-Snj)9G22_zB>D?fqr{FXheW-#)oRFV4Oqc>*)!${zG>n zo)FtxvB5HcnemQJIAHyHOvkWTtA~y}zjA1FxZXg}^Ja^Q65=FTZyJ2=fA{YIS%Bc& zLOzs((?Q3sARe>HCnkXH>uIEm$ZAG@=iT&D>w@;V@kL|=80i3NC$}X>eLtFFg=f>=TmT@36c~)Gr!z0@G>!%|SG8T?g=*rxnr|gPsd3taf zai+MGcB1!?cY5XP+v*dZtCwPWKY3oa6?ITt9a>d!=%#P&^MAVS`pbHxsE^fp;z$`4 zby4M)3yB4cWL`WChB<}> zaOzKE#v8_b9Y~sgn^&<5tWOGhV11l&`dVMu@TIY*+dNKWU-)vL8?scPxvgK?R!eba<>aQ%)H;H(Nmxos${;f^5X$cYpf>DO8O zc2?~0PH+5v+kEC3LTSu3+p!?fwKdOtmN+ub#D_ld!jA$U1u!g{aNOVcx4aYopy{*X z>lso3+7slCx>N>eXCbN8I30_#MPB;? zo~~gRht#QJJVWNk+pcV+w+_>;+IvTUMB>Gjacn+Ke-B>`TnM$f{SWBo4?Z}gh4bX- zji&>WBf>aPQqHN*+@P-}hGB6tmef&5jHW-kevP>IXJDbsv&ZF6;YvS-^3K&ZaoSTw zYT=<;GrCF*Y@X&(#7?? zLuDP#OmLs&S;B3p92XrH?_(L5ohTTh8tjtm^gb`Wv8-NnsZGB1m6?8+aY0-JP%=uQFk9&@c)w&(Hn-)-Oh<2Sdt6jyH{7%O|)1ld@CKvkgCEZ@;Gk(WWNyb-kmy~2%+j7?F5kjv7m0eqS{E_D4 zRPyxDbk-5D$AyDnJUuOVLG@_F^n3k=4Tp{t4PSrXCow#MIVE82>39!bjcG1gsE2`8 zG6F$Sw7nl0AaXdF{p6~Pdbl^9YWnR8bJim{dJ;}yr7;St8!O?MYYRs_-m8<U>Gh3V zUuYr}5_bqCT(NJSn1l$9rq~^?FpFRMqJ}ZHROVp*QHT5HPO3sMh23SYlGVDxqIt3I z13$P=7%)US<>siH9L9d9&x(dm;h4@M`bae7U`a;w(dfv60Szo?i%?s)=YG1eSslT# zdWG|$H}R)8D#7q@0_m1ImiQ}uaDfva{E_^)9#dSdzjKe+FIFXm(#=$x)1fW;&T~K8 zw%&S+Cjzd*zwP!r+RY#Q$Jm;E4c4S!V(6x9{*i}RAM;48VG#3%IqOg?HFj?rIQ=*` z!VYpYzWO`5nY`WV>TcQty+&R*TsMTU*H6aY>+SJjI`9^-T%Oc9OZ4G{hf@`}8y&`@ z!Duq;g5}UoN?9Li@h$CpXSlP=XV1nx=%F@jaf#SAh5p{<(y7ObG;F}YQHpvWgs>0E zC)f`e%*yJWeZph3yZ#Q{tCtmA1zTvFzI|D*pVem*(zE5-TEWRrp>;hT?I}HQ;h+4# z6~8)AZ&x_ss}m0nA2rOoT2qAcibf`X7SI0%%*n4lSM>aW2ZpAil|+tFEwHeuV>S-^ zSW#@|gJv&~QGr|AJ29xT0@EXk0FhLSbD%0nYb9U@4GjQJseka^ARN?i=1yq=C0zzZ22A)oT+6kWGI#_V5 z;M=}$XW*f5MPnE$Q*j0ou0;Sw`T7PoEqFJd{b_H>z9Uw_xSr~-4%(fUUZNdU_nce; z;nr!74WAX(*1DJ*H5!ml`QGr>($!K8>T*RI;h*r>ZhQiY3*`E9*OLY3Yb2(q)jHjFU zyfB!YD19{O5Z*L_)-Ol3kyu`2P;Ae9jNR|vV#j!WTgl&@+Qxr-sy@=F)w_|uLlR&4 zD4vDA_i6k7H$CLn1n`n(HPxYAVezty+sz;PfInp&L5DleqT~x#pwn!3Wh8vCo16l{ zHQe0#Y}u`jp;kG87~Y9bw!p(gjyPkCJ?TL|y6KH5FJ^t=gTZ3fC?QsG7h5!3;fs1S zYU~|42_$_9J`_bUVAc_@VN#LCJPWo=x}0#+CpV%YC%u@U*%U<=z@%Xn^*(6qND~LI z8;Q~u%q$QIHz!-RwRsiJR~WO4zG_w5_pNW&O_VMhRaAO!_nLJ2Du?U-%dhHUsSO%G zrN?teATi{9bEXJnHi0oB#&SxSoTQE%27ThAFD|0kpi_ZEfjCnSdC3rD4li zP$%~pO~#S=+DMw_c{h#&rIzpclZdff@%To%>^ zmcBdhY}ftL>-7B`SGNV>upo}O)0G_;NruRE6iGzr1@|1_A*6}rcmxxdDkM<6 zB0%d28l;|j_Do`2NU>GJ8LO1to@RtNP@!DlQVhaAiC4Y6Me{~K<%ql$+emaJ3%qQS z-?c{_)z&=srv`UmF;M39o6C8z~SB5r7rT(~kAX*^CtLU|IP*rrp z8o+0melT9ttmRp+=!ifCZu;0x+kEGMHRZisiYF(1R#ylmSu>oi*m}HDg;w=c>$ zWKccPwjM8^^j0J>3Ax7`{$t!ov2wGpc2}$Fd;jqbZR7dpOV3DGgeWjNIj~Cy?80m0 zNr@rnMfxZrT>OHwLmtXkAv5xBwZGvWHXH?0zhE^&)_|bMp3n8lrc@^n zEZ)T|;@w1YqYZe-f8xYq93?5+2ji-O`;>M4EYqLj}pq$MW7TEz_SvSYeQpZ!i;-=}uQ=qg)=xrD$E zrR0XNX{PEl-9W@qV0!>ns~6g$p;F}cp@HMmbHD0Q9bi`XFXfyfyeST(O>^x z|K4{?F4E^qqvYq5Ko0yxuUD};npdcEkYl>?PrL=nu9W)MAkK{*yt@>n*YpK%+-PM< zaU4FOjEP|?eL|U=7^Rdt*DZN9GNhAMa5vh}8!I%fR+5X?4&}g+z#{>}>dWDBUh>lo zJVlBP#%zN9h;DbDaHTvpu~qgMuhhg6*3qFu{58WVZ<%EkGZ{>i!2Es(tfZ}NJOAr^ zO`vbo=P0ZS#1Sv6qPX#ZL@@egKUyV3qaFu^BH)ui;^goTG`Y0zevu+(BXh=I(OJ7M>=CehhotRp6D9PDuStu_sIrdb_7>5$Z1FyqZSS-xaqMWJ+T52 z>^@sVx5vYrj$j6rG}{H%VSfVjA8-rgT^_rLPXf#WLPh1SFJI+2M zuD41oh2`2kr>#7$>s-s@$Z|;<9YZ}fZfD95J7kvSyejY`4+@9Nj}U5;tG-j1rG2W% za4I|fYF*+=NlL~$jeQV2>24t7mlWLrn26d`T^3+Ur}|h)oDb2EOSp_oZ~mSOU{Ur? z$-5x?9wOKqA4*eB3X%@L@z^t69r`6xuVKASix%6HMU_SLN0CC8zEa_WZ?+9@`vZT= zjx?y>+BUrXkJ_fMeKiZKm8(1J*>yKobrsej%Z{(}+=1f;iqzaY?%6o#_(8mONFi(T zJnqPF(h9}p*yN82%O~p$ zFi0Erf=j39t{p7kcs*#JW_Yh=Xf%4mDx3O;;;5kN?7y%EBaho@iOsCX2ufXq?rMF20CxEArR9`s-`=yUVYi9d-s_<`M=66 z81Mmk0OQ2axpE5SRnVSJ#PB08LznBb&!UkunqMX{)^|C#eGUc_y!0f8))(3X>#-ed z!Q)GU_{+A91+T4OD{b!f?@sB93kPlCn5VP{z39b~iq(sZS2a(%7~qC6YUEb#KzIEpri*r^KO!n3e3r|nO3-hTT!bK)G09~sMt{0)Q%D$> z&Xfjlo`B$iBi+%5NQkoG>ywi&&@*t$1h3U-JiYqr>Ex1&Lu;9^N=czJWkUPxY&+2I zrs*@?u4xu{bVfLfR0^jtJ6AY*@U@bPhu$rNV1*S;GLs9=4Ka9z&OcVkf3V)ZtCi^0 zQqHHX(p9TglO%%Am0+EOf$i*jf25j^?5xnH8}xjq?uv7@V!2XTTlaSHYnA%zAkgVN z$g$r4@FDJ?1@HBcHuszp9dqwO7H<5>k4GH#J1tk?+y~C~QwBIpG7CICJ-Cw72^wSxPHU?^`M?z$J>%kIoPkd-`jRdb8c}4EH<@Ydl$0UWeiEdj+f1|kegPo;TmDoo6 z?AzvE_#(WCR=U-XKlzE)>F<`p(W1}#V#SS$(W!w*W==UyOmC^OfuKKty881a#v zYE=9cHQ264Nd{-dFx0r19XrXeXZGK`;+uTo<8AJ!r#nwL2x~a1Rs8%{waGi*5^`kR z6~dlCZd|neR&WnNSSb4A%ib*X|vy6 zc^O8`@C}=BLqx$=ZW~C<|H`k%r!;diTbE>c+&X^m-s2(1PA0`AHR+zNg^_iq^eBQ~0QblGpkM=*bb;mpt zbQIKf(x{5-pqMnEu;GFWuHuS=*MBqu@>VULkzUKPs^WT@cbol~N0D(ow~SX`=<#bw zsq>bNZgk2nhoCqN3#5T6y!yElpWEj6Snjgo!ZkVLj5fVi9~-vqu#bg-=DUQ4mWHt9 z@e$;7r2?;A{bAAL|H;5qtpdqp7JA9^U2+@w4Kgrt#_5zgCTD&~j|%mwjIjTtWaFOQ)}B_{VzCY&3PRto>5kWY$qv0c)+~4W?|vO zHSSk%_t)p$sN{ak366OX$;LKLcts*6wX7EKPHy7BgYz&=GiK!_uDf$Xo1Ff?Lr$`N zGD)^Rmpu21Uy8fxFLUX}*hA zTweX+!Hf%KZuXy4rDAVzVW-?rE9PM9y$~_ zjPSkmS07Q#>=u4`U;fw|+01oviBgf&D5;naGMe>#lNpx81 zecpI8pTg%Vc5&d*!AdT@*g-HS7U+P}f!>cE;KOrm;rCVC-FFXJWYEE(Ho07XM*9Bu zhn~b^w|MM>J;0B^7u~c0Z^>-eBRQI%)lhc(6>Kl|*ykf+(YKPQ;d>oMgro8(RvreI z&|v~6B=}nK;^Q+?A+57k-1vikqn9pQE{^~&2DC;sk-7H?|uT_W5 z*eV2W#=ozZcKuK`Tf0U%BvWYHsNKY@KJwf;kd5q}La{t<>j@(`~EP zuKfu9R9jNu?th%NMOU+bG!f_A$V9SvMr%x>QhyJ-PS+KnEdm5 z%sZ0_mB^2dII_*XMk`t0n-NOIWkz+Gv@n~+O&VtUEnK*o`TgguC^q_actX*0q+Ggb z)#y;(pG9yXL9=B0SLzYBs|35 z6&(ESecfrN>2p%EwxqzIwNt&*$s}nmXgXvW;3~Gja)=e`l`Elv9AJEo8M&p$^c!E$ zOQ+M91TqY2^q8Y`v+`#BA(8$<5t}Lw{&fBXqEI9OoAyB~&Bj=9z;Sb>az;VLUE4En z4T{52Xq}sGZ7K*wcfrx=m@p%l!yvuWuTH%Dx0ZMOc@($!hP}AQr|ApcbVM$#WTvxt zQ)g&Sd*#ovo{0lr@7F+wUNxL53rpH|1@8X-f-fn^Pnip07i@`4;Cd7cG=k5DoLWE2 z6Kz3A7SSWje|c}4T=Z2tYm}T1l9(K9~SDkg19vLoe+Z7nHR=^*|-Kj@;J;gx|G!_i6U{ExA!-=b) zmg8Xpx2TV(|NURK=@pkmlEv?2BbRWu>uzoCm*3b%$31JH8{y;uVpxSrSzTzQf>p28 z>Ld8Ps^K-i=;ntn^)MEVUmpdaD`_LW{Wt%%Kjlq)3~LsZ9ti=fP4rCyi*Nc}?>J#A zZAxGLSYgb%&|SXMGpU9Xs~_X2f1?N1p^qE=p$#uPiL`Q?obs5@X`_2`7%GivGmC0r zU}eYGMiT8qI2_7^)D0ITd&Nr|2a)`1c4~94{q@!z^r)1Pxah-TBRTo@C2jlV$os94=c{fMKEarAQDCnC z7^=Ye#h)RhGhQl5Jn)};@oU=XDSB)kjpD6ofkDV36aU zV~n9OHb>B7$|Y~%!x4{sdgMWE^t_YX=s73FyFwtXFZ=Q_aokLe|Kx4)awv>hjU6hv z#H2GG4ZSGx4*Sw8p>Vf5Z{e)7j@}VJY&&ezQ;s@DuUgO1cVR?6aywpf-PN6F{}*)J zo08RPUg7wWW~#u}Bc@_yY=?D{eD_5CTe(wS$Nv#rvIWBKmpACIf}=*?m^1m@S#9z) zy~oYRP|@X+m4+QB82!+6qPIeD0-!VA|A00+>gYClhW?QJpo3<1sz7D8dg1+_#Q*Fa zZOYxU^;oeDqz8i4L}Mp`N-G+cy~6+$F<9>Qtbe_G?5Z=)_`;4Dv2mAe{PM@^pHois z&nd;`g5}nnQho947#{Wn0jO63?6u%p-6R3Hcr6mVL};D*W9|8$`xSj6@sUo96Nem) zzTixBU9+e9+N7zzvw3>em2G<6wJN@@*SFoKw=A_~^1d*>@V%L9HF+NN;MVDFJs(=F z-Q)CCOuOsGX}SKgHS80fUU@}Z{QWn#cIA~So_xn2_33H&t21WN3%F-nr_Gvwl9tE1#G9u^rd+wa4x;xpUK{`o5?=u^HDgi6N;Xg;`wG*au9p zHG4t`+4Jy+L(nSBDsm+byjX}elBHLw`u4if3s3PMN~5Q)#eIR19jqp?$gC0xUdK?z z6Ad)q$3aV;URUW^PAk5`i;s`qPTuqGHvPZ{v?c3{Ti_WM7Q@TiP)}4`9G(m-aW9u% zI_~uEWmm0U*M0os`A1$$$u*K!ci$FYa^!1O&3D4-0!P;Lbj$!){EQyJE45S)R&eeB zPAL5F5p>A|7T#d!=pM9t8~yYvTleIrX@1OE2DaL+hXoZnbXu?AD%vo)6v%ASUwq5x zOYrDKk9fG>n4WQZoBY*ZwZ@zF$n~qwO5x6Y1i0i}_69O&Si*CU2HorD&pdOx2OG;p zBZJGa%f_1d-T0-CJ4>%9kBb7xAA;>?;lM?^irT=%{4D>Ik73V;v6(z7YnSkEhy7wc+}Y z#bZkrU3{{b)bF8(`?w-LM9E{NgA4_vvK(>xxVW9sNrm=o%~FC}h&?DK}jLDvTZ{ z5i^IJZ_1>v*w}!WNcFPJ^)4c|3a(!7$#(jpm2STS^`UzGr?E%q4tei~>5h3P{ZkNq zT@hcSfPdTcC#9S9rpu;{`d2tNw06zazT@T{pXmkX=R*qVccU)@APR5djD(-!^UlS& zM1@K^~} zY)So~!CU?rEd)4P+6oWL*CLw1Y&$-cy_t+Kv%wAoHM!57JAVD~-J9ODxC53I(PeE# z;*OBhmmIs#WU}QP-9_&gD=@E>N|rsXYo-RZ3WGo>AhX~YK%kC3sS$G3AXbG^DnwoT ztH7aGIxOpQ%Y=GI7J9+BazW2pUJ-L9;Gbk`@wB`B&8@5a@#H>#* z2M91ySh~7)jovUhwmbdw!QI`A{jMOV;jS2VM4P_s35QR%w$JD(mR=vDMu!}7G5T+f z$uul~y$e49AXB|p5@Vr_qu1D-Rvmrr0N(zv<)j8roMFnNl4Bm>tO1%3ru7mKqrnT! zGQA*3p_9L-F}6U+E#cx>OBV>H^N;y(WeEiN_*`G;!L z7d`PLEzo~fdFCU*Qd!qpwqmc|O2%M5IRP^5giEHc&d??BPsa!T93D2;LL>H*>p|95_xef)fPUF^&sa3+Ll** zm#EisH^3m{cf+{@a`&MxpQfGkRf>==T9&JW01Xeur2|y)0atu%$;k)dv)oUXL(u1P!mf8ZJpB74kI}7dRNJt0WuFF*^dufd-pkClj8U zC_NnpSc5kQgE2aX4ZR|xrry0L@)n<+Y87WbHYR?xcs(0hU7X??_);kMAr^At!8&qFWS0mm8}(%=CPv!!M}db|wBu=t2B zc~TqHWi3-sg`+sMlJl5B;RP4ZfDh1ZNGl~hNvpPX|D}EEQ}0rd(?SyOr|y1V!R0pr z&428iQ|ERaty6;jhO(MA2(u4aN$OXPn7nG>t0ExCm}D+VD1_~CypZ@fz(}h}TewK_kev872NLVOsMx-7{H4b_dmpTX!Y4}ntSn`~5 zJr29BsC%8h+|4cgl0Jd4!;iN1qW1%^+`Ie1#9gagJn1PX>0P4V(YsPlj!bIh3?F#7 zkaDx;yo;MUo&TiuS!FCj(xgqyv+>NE0Ul%(ILeY|l+aRV&yzUQ>NMl!aw5B*7v&G` zt0z)r<=*y0`6JP`o%q!CZ8CnN-pkdWH7KQ369!zPhsmv6I`L*e0zj?$&|x`Gie4y- zzm(UamY&I5)xBJ~dQAH%t^PmM4b+*X^MULK(L9iD%xq6jeA?05Cga!Xdo^CFRsG;t zxpK1#Jg8F?lMr$?P>~$cS+?ZLM9G`MCsXc2gd#mtxiumY4vz~$H}_;ezpGS`$S!v^=Z1HyDPz&bmiR;z1f!Y zia>2>IRRoT4^%&4pe-+O`k-xin^x+_q~LGcs#PCZ{+IQo>4ENtkw4JB?9l%7`&U@{#`AY|_GyT(>mJA366{c4+#{;}6%L!<{f4PgL-czBab)uTPHjx71Nwg;pyN zH8mj|@ht4^w`Q1KZtmr;5_q0IwQ`1Zoqm5jE5_RW*=CX6pH}W?-P504zouO?IdnYL ze>0y>4$~?-OeXhMaduUJ`X^2N15W>+WO_CIuPFUbA<;Le!1`CH-3G~Aua8pe`~LMm rEIJ+g?t5AH?sw-O`C915^7MZI7Xu3)HVz2<00000NkvXXu0mjfZhOG= literal 15888 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 literal 0 HcmV?d00001 diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_collision_warning.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_collision_warning.png index 942da02ff62c385b08afaa6ffb6041dbb9b60558..d54bc861128eb77e3019a28ade336b1704f53e14 100644 GIT binary patch literal 17993 zcmV)HK)t_-P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91c%TCS1ONa40RR91cmMzZ00`n$?f?Kl07*naRCod1oe6*?RekPH-Fv%x zX4r;dab#1385kBtkWBbIhyugD&cJNl_tyJ<-~XJt)jbU}gENZnbXT2o{`+#4s=C#;tMvatsTVGs zaoeg}=2e4ww?UnDt5e!7)oI&QSDV#!y{TN>Y@l{kr_EBT^fOqN>U!B=P%Z0JX_@Gk z)m43W8q_zW)VaQ{tLr;k4Q||d@h?~Yu7{`kU3B2~!{#lh$0v?Zf}UHadOsz0Cnc#; z0y!(UN%_OGItiv9U|J?4%8}1e56S`pc6SCBcb{)HCMgN%oM0KiS ze6+ICbKqrh%s@w9Ng-by`Jk}VR;!tzcm|-9Xgk4Lh6~g(oJ~O>(Tc!1Wa;e0Lk(DK zx|>xsA&T?sL3MW8seA6c^MAg|h$q--=;af{uzR2PwEg?z)#(cBi3;cz4yxB#8CYhj z0!?DeylN6kj`2viT;=45w(2x(Shf6mN%q1nfW?_BWRqSGfU!Q@E0=Zd7g|VLXIk-bl#i-PcRaogc5lLIO;M0 z2t52G+$1_fBRp{U*|42E?X(a<2hxd0rVh)w}3{i4~D#29

l0X^+SEMn#NpSQcp_*Y9VmyH- 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 QVgLXD07*qoM6N<$f}#MPlK=n! literal 18178 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 t>euy9?}oYOeD_u*xxEH#q3@9b_&+ diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_crossroads_warning.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_crossroads_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..69c4eed819736ba9ce53e43705533cd6153a694f GIT binary patch literal 18386 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 literal 0 HcmV?d00001 diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_turn_left.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_warning_v2x_turn_left.png new file mode 100644 index 0000000000000000000000000000000000000000..b1aa464dd130c9a635f5a12fa548b779a219e47d GIT binary patch literal 16603 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 e3;yrk^Zx_6szwV6BCc-$0000 Date: Tue, 14 Mar 2023 23:12:09 +0800 Subject: [PATCH 09/20] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 5 +-- .../launcher/lancet/ObjectHashCodeProxy.java | 38 ------------------- .../launcher/lancet/TextViewSetTextOpt.java | 4 +- .../utilcode/util/ObjectHashCodeUtils.java | 28 ++++++++++++++ .../eagle/core/utilcode/util/ThreadUtils.java | 4 +- .../core/utilcode/util/UiThreadHandler.java | 6 +-- 6 files changed, 36 insertions(+), 49 deletions(-) delete mode 100644 app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java create mode 100644 core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ObjectHashCodeUtils.java diff --git a/app/build.gradle b/app/build.gradle index 7015ee7a02..fc132b3b79 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,10 +64,7 @@ if (!isAndroidTestBuild()) { memory_leak { enable true } - object_hashcode { - enable true - } - TextView_setTextProxy { + textview_opt { enable true } } diff --git a/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java b/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java deleted file mode 100644 index 428a52158a..0000000000 --- a/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.mogo.launcher.lancet; - -import androidx.annotation.Keep; -import com.knightboost.lancet.api.Scope; -import com.knightboost.lancet.api.annotations.Group; -import com.knightboost.lancet.api.annotations.ImplementedInterface; -import com.knightboost.lancet.api.annotations.NameRegex; -import com.knightboost.lancet.api.annotations.ReplaceInvoke; -import com.knightboost.lancet.api.annotations.TargetClass; -import com.knightboost.lancet.api.annotations.TargetMethod; -import com.knightboost.lancet.api.annotations.Weaver; -import java.util.concurrent.ConcurrentHashMap; - -@Weaver -@Group("object_hashcode") -@Keep -public class ObjectHashCodeProxy { - - public static final ConcurrentHashMap hashCodes = new ConcurrentHashMap<>(); - - @NameRegex("(com\\.mogo\\.eagle\\.core\\.utilcode\\.util\\.ThreadUtils|com\\.mogo\\.eagle\\.core\\.utilcode\\.util\\.UiThreadHandler)") - @TargetClass(value = "java.lang.Object",scope = Scope.SELF) - @TargetMethod(methodName = "hashCode") - @ReplaceInvoke - public static int hashCodeProxy(Object r) { - Class clazz = r.getClass(); - String className = clazz.getName(); - if (hashCodes.containsKey(className)) { - Integer value = hashCodes.get(className); - if (value != null) { - return value; - } - } - int hashCode = System.identityHashCode(r); - hashCodes.put(className, hashCode); - return hashCode; - } -} diff --git a/app/src/main/java/com/mogo/launcher/lancet/TextViewSetTextOpt.java b/app/src/main/java/com/mogo/launcher/lancet/TextViewSetTextOpt.java index 0a0ed2611f..ad11c130cd 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/TextViewSetTextOpt.java +++ b/app/src/main/java/com/mogo/launcher/lancet/TextViewSetTextOpt.java @@ -3,7 +3,6 @@ package com.mogo.launcher.lancet; import android.os.Looper; import android.util.Log; import android.widget.TextView; - import com.knightboost.lancet.api.Scope; import com.knightboost.lancet.api.annotations.Group; import com.knightboost.lancet.api.annotations.NameRegex; @@ -13,7 +12,7 @@ import com.knightboost.lancet.api.annotations.TargetMethod; import com.knightboost.lancet.api.annotations.Weaver; @Weaver -@Group("TextView_setTextProxy") +@Group("textview_opt") public class TextViewSetTextOpt { @NameRegex("(com\\.mogo|com\\.zhidao|com\\.elegant|com\\.zhidaoauto|com\\.zhjt).*") @@ -31,6 +30,7 @@ public class TextViewSetTextOpt { sb.setLength(sb.length() - 1); } Log.e("ALERT", sb.toString()); + return; } CharSequence old = view.getText(); if (old != null && !old.equals(text)) { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ObjectHashCodeUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ObjectHashCodeUtils.java new file mode 100644 index 0000000000..026c8fcef2 --- /dev/null +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ObjectHashCodeUtils.java @@ -0,0 +1,28 @@ +package com.mogo.eagle.core.utilcode.util; + +import java.util.concurrent.ConcurrentHashMap; + +/** + * 根据对象的类名,返回一致的hashCode + * 如果缓存中不存在,则创建hashCode并存入缓存 + * 如果缓存中存在,直接用缓存数据 + */ +public class ObjectHashCodeUtils { + + private static final ConcurrentHashMap hashCodes = new ConcurrentHashMap<>(); + + + public static int getHashCodeIfNeed(Object obj) { + if (obj == null) { + return -1; + } + String name = obj.getClass().getName(); + Integer value = hashCodes.get(name); + if (value != null) { + return value; + } + int hashCode = System.identityHashCode(obj); + hashCodes.put(name, hashCode); + return hashCode; + } +} diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ThreadUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ThreadUtils.java index 40bc4cc367..42044644ee 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ThreadUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ThreadUtils.java @@ -66,7 +66,7 @@ public final class ThreadUtils { if (Looper.myLooper() == Looper.getMainLooper()) { r.run(); } else { - int what = r.hashCode(); + int what = ObjectHashCodeUtils.getHashCodeIfNeed(r); HANDLER.removeMessages(what); Message msg = Message.obtain(HANDLER, r); msg.what = what; @@ -75,7 +75,7 @@ public final class ThreadUtils { } public static void runOnUiThreadDelayed(final Runnable r, long delayMillis) { - int what = r.hashCode(); + int what = ObjectHashCodeUtils.getHashCodeIfNeed(r); HANDLER.removeMessages(what); Message msg = Message.obtain(HANDLER, r); msg.what = what; diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/UiThreadHandler.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/UiThreadHandler.java index b3a65e4f68..a8fc918cda 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/UiThreadHandler.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/UiThreadHandler.java @@ -11,7 +11,7 @@ public class UiThreadHandler { private UiThreadHandler() { } public static boolean post( Runnable r ) { - int what = r.hashCode(); + int what = ObjectHashCodeUtils.getHashCodeIfNeed(r); sUiHandler.removeMessages(what); Message msg = Message.obtain(sUiHandler, r); msg.what = what; @@ -19,7 +19,7 @@ public class UiThreadHandler { } public static boolean postDelayed( Runnable r, long delayMillis ) { - int what = r.hashCode(); + int what = ObjectHashCodeUtils.getHashCodeIfNeed(r); sUiHandler.removeMessages(what); Message msg = Message.obtain(sUiHandler, r); msg.what = what; @@ -27,7 +27,7 @@ public class UiThreadHandler { } public static void removeCallbacks( Runnable r ) { - int what = r.hashCode(); + int what = ObjectHashCodeUtils.getHashCodeIfNeed(r); sUiHandler.removeMessages(what); } } \ No newline at end of file From af8b173b683dda26211549b77d53fb99a24c8626 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Wed, 15 Mar 2023 14:39:40 +0800 Subject: [PATCH 10/20] [2.13.0-arch-opt] fix bug of debugsettingview of sp is null --- .../mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index b784faaac9..ca5137082f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -1597,7 +1597,7 @@ internal class DebugSettingView @JvmOverloads constructor( tvAutopilotInfo.text = autopilotJson tvIpcInfo.text = autopilotJson tvIpcInfoKey.text = autopilotJson - tvCmdbCarInfoContent.text = SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.CAR_INFO) + tvCmdbCarInfoContent.text = SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.CAR_INFO)?:"" tvCarInfo.text = "GPS时间:${(mGnssInfo?.satelliteTime?.times(1000))?.toLong()}\n" + From cf45177f66a0d757ebef5fa490044f104d5afb41 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Wed, 15 Mar 2023 15:27:21 +0800 Subject: [PATCH 11/20] =?UTF-8?q?[opt3.0]=E6=B7=BB=E5=8A=A0OBU=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E7=8A=B6=E6=80=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/zhidao/adas/client/ObuTest.java | 6 ++++++ config.gradle | 2 +- .../function/datacenter/obu/MogoPrivateObuNewManager.kt | 9 +++++++++ .../datacenter/obu/adapter/MoGoObuListenerImpl.kt | 9 +++++++++ .../main/java/com/zhidao/support/obu/OnObuListener.java | 7 +++++++ 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ObuTest.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ObuTest.java index 8a43063ab6..6f470a39a4 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ObuTest.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ObuTest.java @@ -13,6 +13,7 @@ import com.mogo.support.obu.model.MogoObuRsiWarningData; import com.mogo.support.obu.model.MogoObuRsmWarningData; import com.mogo.support.obu.model.MogoObuRvWarningData; import com.mogo.support.obu.model.MogoObuSpatWarningData; +import com.mogo.support.obu.model.MogoObuSystemStatusData; import com.mogo.support.obu.model.advance.AccFourAxes; import com.mogo.support.obu.model.advance.DateTime; import com.mogo.support.obu.model.advance.NodeId; @@ -293,6 +294,11 @@ public class ObuTest { } + @Override + public void onObuSystemStatus(MogoObuSystemStatusData data) { + + } + @Override public void onGnssInfo(MessagePad.GnssInfo gnssInfo) { Log.i("ddddd", "onGnssInfo=\n" + TextFormat.printer().escapingNonAscii(false).printToString(gnssInfo)); diff --git a/config.gradle b/config.gradle index c0e098760b..aa0cfc053e 100644 --- a/config.gradle +++ b/config.gradle @@ -93,7 +93,7 @@ ext { // obu sdk obusdk : "com.zhidao.enterprise.smartv2x:smartv2x:1.0.0.3", - mogoobu : 'com.mogo.support.obu:mogo-obu:1.1.0_beta3', + mogoobu : 'com.mogo.support.obu:mogo-obu:1.1.0_beta4', // google googlezxing : "com.google.zxing:core:3.3.3", diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt index 5f182177b6..6046849510 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt @@ -194,6 +194,15 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { } } + /** + * OBU 系统状态 + * + * @param data 系统状态 + */ + override fun onObuSystemStatus(data: MogoObuSystemStatusData?) { + + } + /** * HV车辆基础信息 gnssInfo */ diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/adapter/MoGoObuListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/adapter/MoGoObuListenerImpl.kt index 17e01071e0..1f3e178188 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/adapter/MoGoObuListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/adapter/MoGoObuListenerImpl.kt @@ -31,6 +31,15 @@ object MoGoObuListenerImpl : OnObuListener { CallerObuConnectListenerManager.invokeObuConnectListener() } + /** + * OBU 系统状态 + * + * @param data 系统状态 + */ + override fun onObuSystemStatus(data: MogoObuSystemStatusData?) { + + } + /** * HV车辆基础信息 diff --git a/libraries/mogo-obu/src/main/java/com/zhidao/support/obu/OnObuListener.java b/libraries/mogo-obu/src/main/java/com/zhidao/support/obu/OnObuListener.java index cfb3cc76e1..d7401f7a7d 100644 --- a/libraries/mogo-obu/src/main/java/com/zhidao/support/obu/OnObuListener.java +++ b/libraries/mogo-obu/src/main/java/com/zhidao/support/obu/OnObuListener.java @@ -2,6 +2,7 @@ package com.zhidao.support.obu; import com.mogo.support.obu.ObuScene; import com.mogo.support.obu.constants.Define; +import com.mogo.support.obu.model.MogoObuSystemStatusData; import mogo.telematics.pad.MessagePad; @@ -15,6 +16,12 @@ public interface OnObuListener { */ void onConnectStatus(@Define.ConnectStatus int connectStatus); + /** + * OBU 系统状态 + * + * @param data 系统状态 + */ + void onObuSystemStatus(MogoObuSystemStatusData data); /** * HV车辆基础信息 From c720701746f373ef2a8272f018e873c49d3e0db8 Mon Sep 17 00:00:00 2001 From: renwj Date: Wed, 15 Mar 2023 15:29:12 +0800 Subject: [PATCH 12/20] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E5=90=8E=E5=8F=B0=E5=90=AF=E5=8A=A8=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/launcher/lancet/CrashFix.kt | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt b/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt index 73d69c4931..64b5d9e7ae 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt +++ b/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt @@ -14,23 +14,29 @@ import com.knightboost.lancet.api.annotations.* @Group("crash_fix") class CrashFix { - /** - * 修正Android8.0及之后,后台启动Service引起的崩溃 - * java.lang.IllegalStateException: Not allowed to start service Intent { - * act=com.zhidao.cosupload.service.UPLOAD_ACTION cmp=com.mogo.launcher.f/com.zhidao.cosupload.service.UploadService }: app is in background uid UidRecord{6443b7b u0a404 LAST bg:+1m15s362ms idle change:idle procs:1 seq(0,0,0)} - */ - @Insert(mayCreateSuper = true) - @TargetClass("android.content.Context", scope = LEAF) - @TargetMethod(methodName = "startService") - fun fixStartServiceCrash(intent: Intent): ComponentName? { - return try { - Origin.call() as ComponentName? - } catch (t: Throwable) { - t.printStackTrace() - null + + companion object { + + /** + * 修正Android8.0及之后,后台启动Service引起的崩溃 + * java.lang.IllegalStateException: Not allowed to start service Intent { + * act=com.zhidao.cosupload.service.UPLOAD_ACTION cmp=com.mogo.launcher.f/com.zhidao.cosupload.service.UploadService }: app is in background uid UidRecord{6443b7b u0a404 LAST bg:+1m15s362ms idle change:idle procs:1 seq(0,0,0)} + */ + @JvmStatic + @TargetClass("android.content.Context", scope = ALL) + @TargetMethod(methodName = "startService") + @ReplaceInvoke + fun fixStartServiceCrash(context: Context, intent: Intent): ComponentName? { + return try { + return context.startService(intent) + } catch (t: Throwable) { + t.printStackTrace() + null + } } } + /** * https://console.volcengine.com/apmplus/app/crash/detail/java/bb387ccd9c1a3c6ad2ede4e6f501a5e7?aid=302368&date=%7B%22granularity%22%3A%221h%22%2C%22duration%22%3A%22recently%22%2C%22range%22%3A%221w%22%7D&filters=%7B%22type%22%3A%22and%22%2C%22sub_conditions%22%3A%5B%7B%22dimension%22%3A%22os%22%2C%22op%22%3A%22in%22%2C%22type%22%3A%22expression%22%2C%22values%22%3A%5B%22Android%22%5D%7D%5D%7D&org_id=2100068151&os=Android&page_number=6&status=%5B%22pending%22%2C%22processing%22%2C%22solved%22%2C%22reopen%22%5D * java.lang.IllegalArgumentException: Invalid audio buffer size. From e28a2d8e25edc928dce6b148cd1d63c5708f0ffb Mon Sep 17 00:00:00 2001 From: renwj Date: Wed, 15 Mar 2023 15:37:03 +0800 Subject: [PATCH 13/20] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt b/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt index 64b5d9e7ae..a3a8a614f4 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt +++ b/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt @@ -28,7 +28,7 @@ class CrashFix { @ReplaceInvoke fun fixStartServiceCrash(context: Context, intent: Intent): ComponentName? { return try { - return context.startService(intent) + context.startService(intent) } catch (t: Throwable) { t.printStackTrace() null From 961b06f9a233c81dc3370a0ea9b2a1c1fa29ee80 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Wed, 15 Mar 2023 15:46:15 +0800 Subject: [PATCH 14/20] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96obu=E4=BF=A1=E6=81=AF=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/setting/DebugSettingView.kt | 6 +- .../main/res/layout/view_debug_setting.xml | 62 +++++++++---------- 2 files changed, 32 insertions(+), 36 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index b784faaac9..bdac5fc95c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -564,7 +564,7 @@ internal class DebugSettingView @JvmOverloads constructor( setLogCheckedChangeListener() //OBU配置信息 - tvObuInfo.text = CallerObuConnectListenerManager.getObuStatusInfoJsonString() +// tvObuInfo.text = CallerObuConnectListenerManager.getObuStatusInfoJsonString() //工控机配置信息 tvAutopilotInfo.text = @@ -1637,7 +1637,7 @@ internal class DebugSettingView @JvmOverloads constructor( //obu TODO 后面会添加很多os那边需要显示的内容 obuVersionNameTv.text = Html.fromHtml( - "OBU版本号:$mObuVersionName" + "OBU信息:$mObuVersionName" ) obuConnectStatusTv.text = Html.fromHtml( @@ -1657,7 +1657,7 @@ internal class DebugSettingView @JvmOverloads constructor( */ override fun onConnectStatus(obuStatusInfo: ObuStatusInfo) { lifecycleOwner.lifecycleScope.launch { - tvObuInfo.text = GsonUtils.toJson(obuStatusInfo) +// tvObuInfo.text = GsonUtils.toJson(obuStatusInfo) AppConfigInfo.obuSdkVersion = obuStatusInfo.obuSdkVersion AppConfigInfo.isConnectObu = obuStatusInfo.obuStatus diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index 0ab7cf9f74..d044cb3c01 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -1085,16 +1085,16 @@ android:background="#F0F0F0" app:layout_constraintTop_toBottomOf="@id/btnSetObuIP" /> - + + + + + + + + + + - - - - - - - - + + + + From 2f7ba56064eeaf24ff249605760e4cba7cd2b296 Mon Sep 17 00:00:00 2001 From: donghongyu Date: Wed, 15 Mar 2023 16:16:55 +0800 Subject: [PATCH 15/20] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20[Change]=20[?= =?UTF-8?q?=201=E3=80=81=E5=8D=87=E7=BA=A7AiCloudSDK=EF=BC=8C=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=89=93=E5=8D=B0=E6=94=B9=E4=B8=BA=E5=8E=9F=E7=94=9F?= =?UTF-8?q?=202=E3=80=81=E9=AB=98=E5=BE=B7=E5=AE=9A=E4=BD=8D=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E6=9C=AC=E5=9C=B0=E8=AE=B0=E5=BD=95=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E6=9D=A1=E4=BB=B6=203=E3=80=81=E5=8D=87?= =?UTF-8?q?=E7=BA=A7APM=E7=89=88=E6=9C=AC=EF=BC=8C=E5=B9=B6=E5=AF=B9crash?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E9=87=87=E9=9B=86=E4=BF=A1=E6=81=AF=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E6=95=B4=E7=90=86=EF=BC=8C=E8=AE=A9=E7=8E=B0=E5=9C=BA?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9B=B4=E5=8A=A0=E4=B8=B0=E5=AF=8C=E8=BE=85?= =?UTF-8?q?=E5=8A=A9=E6=8E=92=E6=9F=A5=E9=97=AE=E9=A2=98=204=E3=80=81?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E4=BA=86IjkPlayer=E6=97=A5=E5=BF=97=20]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: donghongyu --- .../mogo/launcher/startup/ConfigStartUp.kt | 5 + config.gradle | 4 +- .../business/identify/TrackManager.java | 2 +- gradle.properties | 18 +- .../com/mogo/map/location/GDLocationClient.kt | 26 +- test/crashreport-apmbyte/build.gradle | 4 + .../apm/ApmCrashReportProvider.java | 236 ++++++++++++------ 7 files changed, 196 insertions(+), 99 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt index 58d9d51187..b1b49757f4 100644 --- a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt @@ -12,10 +12,12 @@ import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.launcher.BuildConfig import com.mogo.launcher.R import com.mogo.test.crashreport.CrashReportConstants +import com.shuyu.gsyvideoplayer.player.IjkPlayerManager import com.zhidaoauto.map.sdk.open.HDTypes import com.zhidaoauto.map.sdk.open.MapAutoApi import com.zhidaoauto.map.sdk.open.MapParams import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager +import tv.danmaku.ijk.media.player.IjkMediaPlayer object ConfigStartUp { @@ -27,6 +29,9 @@ object ConfigStartUp { } private fun initBuildConfig() { + //ijk关闭log + IjkPlayerManager.setLogLevel(IjkMediaPlayer.IJK_LOG_SILENT); + // 初始化构建APP的时候的分支及提交HASH,用于辅助定位问题 AppConfigInfo.workingBranchName = BuildConfig.WORKING_BRANCH_NAME AppConfigInfo.workingBranchHash = BuildConfig.WORKING_BRANCH_HASH diff --git a/config.gradle b/config.gradle index c0e098760b..35460986eb 100644 --- a/config.gradle +++ b/config.gradle @@ -132,8 +132,8 @@ ext { crashreport : "com.mogo.test:crashreport:${CRASHREPORT_VERSION}", crashreportapmbyte : "com.mogo.test:crashreport-apmbyte:${CRASHREPORT_APMBYTE_VERSION}", crashreportnoop : "com.mogo.test:crashreport-noop:${CRASHREPORT_NOOP_VERSION}", - apm_insight : 'com.volcengine:apm_insight:1.4.9.cn-rc.5', - apm_insight_crash : 'com.volcengine:apm_insight_crash:1.4.6-rc.14', + apm_insight : 'com.volcengine:apm_insight:1.4.10.cn-rc.0', + apm_insight_crash : 'com.volcengine:apm_insight_crash:1.4.6-rc.17', cicle_indicator : 'me.relex:circleindicator:2.1.6', //========================= TTS语音 Maven 版本管理 ========================= diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackManager.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackManager.java index cd011c9c6d..363bae8ae8 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackManager.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackManager.java @@ -125,7 +125,7 @@ public class TrackManager { cellIdCaches.forcePut(uuid, trackObj.getCellIdPos()); mMarkersCaches.put(uuid, trackObj); trafficDataUuid.add(uuid); - Log.i("costTime","" + (System.currentTimeMillis() - cost)); + //Log.i("costTime","" + (System.currentTimeMillis() - cost)); } return mFilterTrafficData; } diff --git a/gradle.properties b/gradle.properties index e482fd6b80..fe06686df3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -66,23 +66,23 @@ SERVICE_BIZ_VERSION=1.2.4 LOGLIB_VERSION=1.5.11 ######## MogoAiCloudSDK Version ######## # 网络请求LOGLIB_VERSION -MOGO_NETWORK_VERSION=1.4.5.7 +MOGO_NETWORK_VERSION=1.4.5.10 # 鉴权 -MOGO_PASSPORT_VERSION=1.4.5.7 +MOGO_PASSPORT_VERSION=1.4.5.10 # 常链接 -MOGO_SOCKET_VERSION=1.4.5.7 +MOGO_SOCKET_VERSION=1.4.5.10 # 数据采集 -MOGO_REALTIME_VERSION=1.4.5.7 +MOGO_REALTIME_VERSION=1.4.5.10 # 探路,道路事件发布,获取 -MOGO_TANLU_VERSION=1.4.5.7 +MOGO_TANLU_VERSION=1.4.5.10 # 直播推流 -MOGO_LIVE_VERSION=1.4.5.7 +MOGO_LIVE_VERSION=1.4.5.10 # 直播拉流 -MOGO_TRAFFICLIVE_VERSION=1.4.5.7 +MOGO_TRAFFICLIVE_VERSION=1.4.5.10 # 定位服务 -MOGO_LOCATION_VERSION=1.4.5.7 +MOGO_LOCATION_VERSION=1.4.5.10 # 远程通讯模块 -MOGO_TELEMATIC_VERSION=1.4.5.7 +MOGO_TELEMATIC_VERSION=1.4.5.10 ######## MogoAiCloudSDK Version ######## # 自研地图 MAP_SDK_VERSION=2.10.0.9 diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/location/GDLocationClient.kt b/libraries/mogo-map/src/main/java/com/mogo/map/location/GDLocationClient.kt index 6edc26bd3c..a9f26b224c 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/location/GDLocationClient.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/location/GDLocationClient.kt @@ -77,7 +77,7 @@ class GDLocationClient private constructor(context: Context) : AMapLocationListe lastGaoDeLocation.lastReceiveTime = TimeUtils.getNowMills() // 将高德中的一些用于业务的数据进行融合,例如:CityCode、address等 - mapLocation?.let { + aMapLocation.let { // 转换 GCJ02-->WGS84 坐标 val wgs84Location = CoordinateTransform.GCJ02ToWGS84(it.longitude, it.latitude) @@ -112,17 +112,17 @@ class GDLocationClient private constructor(context: Context) : AMapLocationListe lastGaoDeLocation.errorInfo = it.errorInfo } - // 回掉给监听者 - CallerGaoDeMapLocationListenerManager.invokeMoGoLocationChanged(lastGaoDeLocation) - - mapLocation = aMapLocation - // 本地SP缓存城市Code - val cityCode = aMapLocation.cityCode - if (cityCode != null && cityCode.isNotEmpty()) { - mCityCode = aMapLocation.cityCode - SharedPrefsMgr.getInstance(AbsMogoApplication.getApp()) - .putString(SharedPrefsConstants.LOCATION_CITY_CODE, cityCode) + try { + mapLocation = aMapLocation + // 本地SP缓存城市Code + val cityCode = aMapLocation.cityCode + if (cityCode != null && cityCode.isNotEmpty()) { + mCityCode = aMapLocation.cityCode + SharedPrefsMgr.getInstance(AbsMogoApplication.getApp()) + .putString(SharedPrefsConstants.LOCATION_CITY_CODE, cityCode) + } + // 缓存经纬度 SharedPrefsMgr.getInstance(AbsMogoApplication.getApp()) .putString( SharedPrefsConstants.LOCATION_LATITUDE, @@ -133,7 +133,11 @@ class GDLocationClient private constructor(context: Context) : AMapLocationListe SharedPrefsConstants.LOCATION_LONGITUDE, aMapLocation.longitude.toString() ) + } catch (e: Exception) { + e.printStackTrace() } + // 回掉给监听者 + CallerGaoDeMapLocationListenerManager.invokeMoGoLocationChanged(lastGaoDeLocation) } } diff --git a/test/crashreport-apmbyte/build.gradle b/test/crashreport-apmbyte/build.gradle index eeab9e0aa8..65f85c0980 100644 --- a/test/crashreport-apmbyte/build.gradle +++ b/test/crashreport-apmbyte/build.gradle @@ -39,6 +39,10 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { diff --git a/test/crashreport-apmbyte/src/main/java/com/mogo/test/crashreport/apm/ApmCrashReportProvider.java b/test/crashreport-apmbyte/src/main/java/com/mogo/test/crashreport/apm/ApmCrashReportProvider.java index 30588f1161..0f953a63cf 100644 --- a/test/crashreport-apmbyte/src/main/java/com/mogo/test/crashreport/apm/ApmCrashReportProvider.java +++ b/test/crashreport-apmbyte/src/main/java/com/mogo/test/crashreport/apm/ApmCrashReportProvider.java @@ -3,8 +3,6 @@ package com.mogo.test.crashreport.apm; import android.content.Context; import com.alibaba.android.arouter.facade.annotation.Route; -import com.apm.insight.AttachUserData; -import com.apm.insight.CrashType; import com.apm.insight.MonitorCrash; import com.apm.insight.log.VLog; import com.bytedance.apm.insight.ApmInsight; @@ -12,8 +10,9 @@ import com.bytedance.apm.insight.ApmInsightAgent; import com.bytedance.apm.insight.ApmInsightInitConfig; import com.mogo.commons.constants.SharedPrefsConstants; import com.mogo.commons.debug.DebugConfig; -import com.mogo.eagle.core.data.deva.bindingcar.CarInfo; +import com.mogo.eagle.core.data.app.AppConfigInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; +import com.mogo.eagle.core.data.deva.bindingcar.CarInfo; import com.mogo.eagle.core.function.api.devatools.apm.IApmEnvProvider; import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; @@ -22,11 +21,11 @@ import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.CommonUtils; import com.mogo.eagle.core.utilcode.util.DeviceUtils; import com.mogo.eagle.core.utilcode.util.GsonUtils; +import com.mogo.eagle.core.utilcode.util.MetaDataUtils; import com.mogo.test.crashreport.CrashReportConstants; import com.mogo.test.crashreport.ITestCrashReportProvider; import java.util.HashMap; -import java.util.Map; /** @@ -38,7 +37,9 @@ import java.util.Map; @Route(path = CrashReportConstants.PATH) public class ApmCrashReportProvider implements ITestCrashReportProvider { private static final String BYTEAMP_APPID = "302368"; + private static final String BYTEAMP_AppToken = "de428a1a8b204c82ac60088aaf9205a3"; private static final String BYTEAMP_APPID_DEV = "379950"; + private static final String BYTEAMP_AppToken_DEV = "3a78191bc18842118c5b4515ec9bfefc"; private static final String TAG = "ApmCrashReportProvider"; private static final String MAP_SDK_VERSION = "MAP_SDK_VERSION"; @@ -49,11 +50,6 @@ public class ApmCrashReportProvider implements ITestCrashReportProvider { @Override public void init(Context context) { - initCrash(context); - initApmInsight(context); - } - - private void initCrash(final Context context) { IApmEnvProvider provider = CallerDevaToolsManager.INSTANCE.apmEnvProvider(); boolean isDebug = DebugConfig.isDebug(); if (provider != null) { @@ -62,85 +58,167 @@ public class ApmCrashReportProvider implements ITestCrashReportProvider { isDebug = enabled; } } - MonitorCrash crash = MonitorCrash.init(context, isDebug ? BYTEAMP_APPID_DEV : BYTEAMP_APPID, CommonUtils.getVersionCode(context), CommonUtils.getVersionName(context)) - .setCustomDataCallback(new AttachUserData() { - @Override - public Map getUserData(CrashType type) { - HashMap map = new HashMap<>(); - //车辆信息 - String carInfoString = SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.CAR_INFO); + initCrash(context, isDebug); + initApmInsight(context, isDebug); + } - if (carInfoString != null && !carInfoString.isEmpty()) { - mInfo = GsonUtils.fromJson(carInfoString, CarInfo.class); - } + private void initCrash(final Context context, boolean isDebug) { + MonitorCrash.Config config = + MonitorCrash.Config + .app(isDebug ? BYTEAMP_APPID_DEV : BYTEAMP_APPID) + .token(isDebug ? BYTEAMP_AppToken_DEV : BYTEAMP_AppToken)// 设置鉴权token,可从平台应用信息处获取,token错误无法上报数据 + .versionCode(CommonUtils.getVersionCode(context))// 可选,默认取PackageInfo中的versionCode + .versionName(CommonUtils.getVersionName(context))// 可选,默认取PackageInfo中的versionName + .channel(MetaDataUtils.getMetaDataInApp("BUGLY_APP_CHANNEL"))// 可选,设置App发布渠道,在平台可以筛选 + // .url("www.xxx.com")// 默认不需要,私有化部署才配置上报地址 + //可选,可以设置自定义 did,不设置会使用内部默认的 + .dynamicParams(new MonitorCrash.Config.IDynamicParams() { + @Override + public String getDid() {//返回空会使用内部默认的did + String sn = SharedPrefsMgr.getInstance(context).getString("sn"); + if (sn != null && !sn.isEmpty()) { + return sn; + } else { + return DeviceUtils.getDeviceSN().isEmpty() ? null : DeviceUtils.getDeviceSN(); + } + } - //车辆所在位置 - mCityCode = SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.LOCATION_CITY_CODE); - mLat = SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.LOCATION_LATITUDE); - mLogt = SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.LOCATION_LONGITUDE); - //地图版本 - String mapSDKVersion = DebugConfig.getMapVersion(); - map.put("MAP_SDK_VERSION", mapSDKVersion); - map.put("CITYCODE", mCityCode); - map.put("LATITUDE", mLat); - map.put("LONGITUTE", mLogt); + @Override + public String getUserId() { + return DeviceUtils.getDeviceSN(); + } + }) + //应用崩溃后会执行这里,可选,添加业务自定义数据,在崩溃详情页->现场数据展示->自定义数据 + .customData(crashType -> { + //车辆所在位置 + mCityCode = SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.LOCATION_CITY_CODE); + mLat = SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.LOCATION_LATITUDE); + mLogt = SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.LOCATION_LONGITUDE); + //车辆信息 + String carInfoString = SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.CAR_INFO); + if (carInfoString != null && !carInfoString.isEmpty()) { + mInfo = GsonUtils.fromJson(carInfoString, CarInfo.class); + } - if (mInfo != null) { - CallerLogger.INSTANCE.d(TAG, "nuber = " + mInfo.getNumber_plate() + "--brand = " + mInfo.getBrand() + "--modle = " + mInfo.getModel()); - map.put("PLATE_NUMBER", mInfo.getNumber_plate()); - map.put("BRAND", mInfo.getBrand()); - map.put("MODEL", mInfo.getModel()); - } - return map; - } - }); - String mapSDKVersion = DebugConfig.getMapVersion(); - crash.config().setChannel("MAP_SDK_VERSION:" + mapSDKVersion); - //可选,可以设置自定义did,不设置会使用内部默认的 - String sn = SharedPrefsMgr.getInstance(context).getString("sn"); - if (sn != null && !sn.isEmpty()) { - crash.config().setDeviceId(sn); - } else { - crash.config().setDeviceId(DeviceUtils.getDeviceSN()); - } - crash.addTags(MAP_SDK_VERSION, mapSDKVersion); - crash.addTags("CITYCODE", mCityCode); - crash.addTags("LATITUDE", mLat); - crash.addTags("LONGITUTE", mLogt); - crash.addTags("CAR_TYPE", AppIdentityModeUtils.INSTANCE.getBuildCarType(FunctionBuildConfig.appIdentityMode)); + //======================================== 自定义维度值 begin======================================== + HashMap dimension = new HashMap<>(); + // dimension.put("Devices_SN_DeviceId", sn + "__" + DeviceUtils.getDeviceSN()); + // dimension.put("Devices_SN_WidevineID_MD5", sn + "__" + DeviceIdUtils.getWidevineIDWithMd5(context)); + // dimension.put("Devices_SN_WidevineID", sn + "__" + DeviceIdUtils.getWidevineID(context)); + //************************************* APP构建的信息 *********************************************** + // Git版本信息 + dimension.put("GIT_BRANCH", AppConfigInfo.INSTANCE.getWorkingBranchName()); + dimension.put("GIT_HASH", AppConfigInfo.INSTANCE.getWorkingBranchHash()); + // 地图版本 + dimension.put("APP_MAP_SDK_VERSION", DebugConfig.getMapVersion()); + // 渠道信息 + dimension.put("APP_CHANNEL", MetaDataUtils.getMetaDataInApp("BUGLY_APP_CHANNEL")); + // 车辆类型 + dimension.put("APP_CAR_TYPE", AppIdentityModeUtils.INSTANCE.getBuildCarType(FunctionBuildConfig.appIdentityMode)); + //************************************* APP构建的信息 *********************************************** -// crash.setReportUrl("www.xxx.com"); // 私有化部署:私有化部署才配置上报地址 -// crash.addTags("key", "value"); // 自定义筛选tag, 按需添加、可多次覆盖 + //************************************* 与车辆连接的 IPC(工控机)、OBU 等信息 *********************************************** + // 连接的OBU 状态 + dimension.put("OBU_CONNECT_STATUS", "" + AppConfigInfo.INSTANCE.isConnectObu()); + // 车牌号,从工控机获取的数据 + dimension.put("IPC_PLATE_NUMBER", AppConfigInfo.INSTANCE.getPlateNumber()); + // 连接的工控机 状态 + dimension.put("IPC_CONNECT_STATUS", "" + AppConfigInfo.INSTANCE.isConnectAutopilot()); + // 连接的工控机 MAC地址 + dimension.put("IPC_MAC", AppConfigInfo.INSTANCE.getIPCMacAddress()); + // 连接的工控机 Docker版本 + dimension.put("IPC_MAP_VERSION", AppConfigInfo.INSTANCE.getDockerVersion()); + // 连接的工控机 Protocol版本 + dimension.put("IPC_MAP_PROTOCOL_VERSION", "" + AppConfigInfo.INSTANCE.getProtocolVersionNumber()); + //************************************* 与车辆连接的 IPC(工控机)、OBU 等信息 *********************************************** - HashMap dimension = new HashMap<>(); - //维度值 - dimension.put("Devices_SN_DeviceId", sn + "__" + DeviceUtils.getDeviceSN()); -// dimension.put("Devices_SN_WidevineID_MD5", sn + "__" + DeviceIdUtils.getWidevineIDWithMd5(context)); -// dimension.put("Devices_SN_WidevineID", sn + "__" + DeviceIdUtils.getWidevineID(context)); - dimension.put(MAP_SDK_VERSION, mapSDKVersion); - dimension.put("CITYCODE", mCityCode); - dimension.put("LATITUDE", mLat); - dimension.put("LONGITUTE", mLogt); - if (mInfo != null) { - dimension.put("PLATE_NUMBER", mInfo.getNumber_plate()); - dimension.put("BRAND", mInfo.getBrand()); - dimension.put("MODEL", mInfo.getModel()); - } + //************************************* 位置信息 *********************************************** + // 城市信息 + dimension.put("LOCATION_CITY_CODE", mCityCode); + dimension.put("LOCATION_LATITUDE", mLat); + dimension.put("LOCATION_LONGITUTE", mLogt); + //************************************* 位置信息 *********************************************** - HashMap metric = new HashMap<>(); - //指标值 - //metric.put("Devices_ID_metric", (double) 100); - ApmInsightAgent.monitorEvent("Devices_ID_EVENT", dimension, metric); + //************************************* CMDB绑定的信息 *********************************************** + if (mInfo != null) { + dimension.put("CMDB_PLATE_NUMBER", mInfo.getNumber_plate()); + dimension.put("CMDB_BRAND", mInfo.getBrand()); + dimension.put("CMDB_MODEL", mInfo.getModel()); + } + //************************************* CMDB绑定的信息 *********************************************** + + HashMap metric = new HashMap<>(); + //指标值 + //metric.put("Devices_ID_metric", (double) 100); + ApmInsightAgent.monitorEvent("Devices_ID_EVENT", dimension, metric); + //======================================== 自定义维度值 end======================================== + + + //===================================== 自定义收集一些信息,在崩溃详情页->现场数据展示->自定义数据 begin======================================== + HashMap map = new HashMap<>(); + + //************************************* APP构建的信息 *********************************************** + // Git版本信息 + map.put("GIT_BRANCH", AppConfigInfo.INSTANCE.getWorkingBranchName()); + map.put("GIT_HASH", AppConfigInfo.INSTANCE.getWorkingBranchHash()); + // 地图版本 + map.put("APP_MAP_SDK_VERSION", DebugConfig.getMapVersion()); + // 渠道信息 + map.put("APP_CHANNEL", MetaDataUtils.getMetaDataInApp("BUGLY_APP_CHANNEL")); + // 车辆类型 + map.put("APP_CAR_TYPE", AppIdentityModeUtils.INSTANCE.getBuildCarType(FunctionBuildConfig.appIdentityMode)); + //************************************* APP构建的信息 *********************************************** + + //************************************* 与车辆连接的 IPC(工控机)、OBU 等信息 *********************************************** + // 连接的OBU 状态 + map.put("OBU_CONNECT_STATUS", "" + AppConfigInfo.INSTANCE.isConnectObu()); + // 车牌号,从工控机获取的数据 + map.put("IPC_PLATE_NUMBER", AppConfigInfo.INSTANCE.getPlateNumber()); + // 连接的工控机 状态 + map.put("IPC_CONNECT_STATUS", "" + AppConfigInfo.INSTANCE.isConnectAutopilot()); + // 连接的工控机 MAC地址 + map.put("IPC_MAC", AppConfigInfo.INSTANCE.getIPCMacAddress()); + // 连接的工控机 Docker版本 + map.put("IPC_MAP_VERSION", AppConfigInfo.INSTANCE.getDockerVersion()); + // 连接的工控机 Protocol版本 + map.put("IPC_MAP_PROTOCOL_VERSION", "" + AppConfigInfo.INSTANCE.getProtocolVersionNumber()); + //************************************* 与车辆连接的 IPC(工控机)、OBU 等信息 *********************************************** + + //************************************* 位置信息 *********************************************** + // 城市信息 + map.put("LOCATION_CITY_CODE", mCityCode); + map.put("LOCATION_LATITUDE", mLat); + map.put("LOCATION_LONGITUTE", mLogt); + //************************************* 位置信息 *********************************************** + + + //************************************* CMDB绑定的信息 *********************************************** + if (mInfo != null) { + CallerLogger.INSTANCE.d(TAG, "nuber = " + mInfo.getNumber_plate() + "--brand = " + mInfo.getBrand() + "--modle = " + mInfo.getModel()); + map.put("CMDB_PLATE_NUMBER", mInfo.getNumber_plate()); + map.put("CMDB_BRAND", mInfo.getBrand()); + map.put("CMDB_MODEL", mInfo.getModel()); + } + //************************************* CMDB绑定的信息 *********************************************** + + return map; + //===================================== 自定义收集一些信息,在崩溃详情页->现场数据展示->自定义数据 end======================================== + }) + // 可选,添加pv事件的自定义tag,可以用来筛选崩溃率计算的分母数据 + //.pageViewTags(<>>) + .build(); + MonitorCrash monitorCrash = MonitorCrash.init(context, config); } /** * ApmInsight性能监控初始化 */ - private void initApmInsight(Context context) { - + private void initApmInsight(Context context, boolean isDebug) { ApmInsightInitConfig.Builder builder = ApmInsightInitConfig.builder(); //设置分配的appid - builder.aid(BYTEAMP_APPID); + builder.aid(isDebug ? BYTEAMP_APPID_DEV : BYTEAMP_APPID); + //设置分配的AppToken + builder.token(isDebug ? BYTEAMP_AppToken_DEV : BYTEAMP_AppToken); //是否开启卡顿功能 builder.blockDetect(true); //是否开启严重卡顿功能 @@ -153,6 +231,12 @@ public class ApmCrashReportProvider implements ITestCrashReportProvider { builder.memoryMonitor(true); //控制是否打开电量监控 builder.batteryMonitor(true); + //控制是否打开CPU监控 + builder.cpuMonitor(true); + //控制是否打开磁盘监控 + builder.diskMonitor(true); + //控制是否打开流量监控 + builder.trafficMonitor(true); //是否打印日志,注:线上release版本要配置为false builder.debugMode(true); //支持用户自定义user_id把平台数据和自己用户关联起来,可以不配置 @@ -160,7 +244,7 @@ public class ApmCrashReportProvider implements ITestCrashReportProvider { //私有化部署:配置数据上报的域名 (私有化部署才需要配置,内部有默认域名),测试支持设置http://www.xxx.com 默认是https协议 // builder.defaultReportDomain("www.xxx.com"); //设置渠道。1.3.16版本增加接口 - builder.channel("local"); + builder.channel(MetaDataUtils.getMetaDataInApp("BUGLY_APP_CHANNEL")); //打开自定义日志回捞能力,1.4.1版本新增接口 builder.enableLogRecovery(true); //设置数据和Rangers Applog数据打通,设备标识did必填。1.3.16版本增加接口 From fdbc224adcddfc80fca15c267e18d1df5eb3ce27 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Wed, 15 Mar 2023 17:19:43 +0800 Subject: [PATCH 16/20] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0obu=E4=BF=A1=E6=81=AF=E5=B1=95=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?=E5=BE=85=E8=81=94=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../obu/MogoPrivateObuNewManager.kt | 3 +-- .../hmi/ui/setting/DebugSettingView.kt | 19 +++++-------------- .../main/res/layout/view_debug_setting.xml | 8 +++++++- .../datacenter/obu/IMoGoObuInfoListener.kt | 10 ++-------- .../call/obu/CallerObuInfoListenerManager.kt | 17 ++--------------- 5 files changed, 17 insertions(+), 40 deletions(-) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt index 6046849510..ec4ff4a718 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt @@ -109,7 +109,6 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { override fun onCurrentVersion(version: MogoObuSystemBConfigData) { CallerLogger.d("$M_OBU${MogoObuConst.TAG_UPGRADE_OBU}", "onCurrentVersion version = ${version.version}") if (!version.version.isNullOrEmpty()) { - CallerObuInfoListenerManager.invokeObuVersionName(version.version) CallerDevaToolsManager.queryObuUpgrade(version.version) } } @@ -200,7 +199,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { * @param data 系统状态 */ override fun onObuSystemStatus(data: MogoObuSystemStatusData?) { - + CallerObuInfoListenerManager.invokeGetObuInfo(data.toString()) } /** diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index 238937f3a7..eba7451134 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -152,8 +152,7 @@ internal class DebugSettingView @JvmOverloads constructor( //OBU连接状态 private var obuConnectStatus: Boolean = false - private var mObuVersionName: String = "" - private var mObuDeviceId: String = "" + private var mObuInfoStr: String = "" //渠道包标签 private var onlineSelected: Boolean = true @@ -1527,7 +1526,6 @@ internal class DebugSettingView @JvmOverloads constructor( }" ) - tvServerSocketStatus.text = Html.fromHtml( "服务器Socket状态:${ if (MogoStatusManager.getInstance().isSocketOnLine) { @@ -1635,10 +1633,8 @@ internal class DebugSettingView @JvmOverloads constructor( tbIsDemoMode.text = "开启美化模式" } - //obu TODO 后面会添加很多os那边需要显示的内容 - obuVersionNameTv.text = Html.fromHtml( - "OBU信息:$mObuVersionName" - ) + //obu信息,排查obu相关问题使用 + tvObuInfoContent.text = mObuInfoStr obuConnectStatusTv.text = Html.fromHtml( "OBU连接状态:${ @@ -2048,12 +2044,7 @@ internal class DebugSettingView @JvmOverloads constructor( setLogCheckedChangeListener() } - override fun onGetObuVersionName(obuVersionName: String) { - mObuVersionName = obuVersionName + override fun onGetObuInfo(obuInfoStr: String) { + mObuInfoStr = obuInfoStr } - - override fun onObuDeviceId(obuDeviceId: String) { - mObuDeviceId = obuDeviceId - } - } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index d044cb3c01..20f98d2738 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -1117,13 +1117,19 @@ - + diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/obu/IMoGoObuInfoListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/obu/IMoGoObuInfoListener.kt index 82703fba36..f4c9d0dcfd 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/obu/IMoGoObuInfoListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/obu/IMoGoObuInfoListener.kt @@ -9,14 +9,8 @@ package com.mogo.eagle.core.function.api.datacenter.obu interface IMoGoObuInfoListener { /** - * @param obuVersionName OBU硬件版本 + * @param obuInfoStr OBU信息 */ - fun onGetObuVersionName(obuVersionName: String) - - /** - * obuDeviceId - */ - fun onObuDeviceId(obuDeviceId: String) - + fun onGetObuInfo(obuInfoStr: String) } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuInfoListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuInfoListenerManager.kt index de793b087d..b93cf4932e 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuInfoListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuInfoListenerManager.kt @@ -9,25 +9,12 @@ import com.mogo.eagle.core.function.call.base.CallerBase */ object CallerObuInfoListenerManager : CallerBase() { - fun invokeObuVersionName(obuVersionName: String) { + fun invokeGetObuInfo(obuInfoStr: String) { M_LISTENERS.forEach { val listener = it.value - listener.onGetObuVersionName(obuVersionName) + listener.onGetObuInfo(obuInfoStr) } } - fun invokeObuDeviceId(obuDeviceId: String) { - M_LISTENERS.forEach { - val listener = it.value - listener.onObuDeviceId(obuDeviceId) - } - } - -// fun invokeQueryContainersResponse(dockerList: List) { -// M_LISTENERS.forEach { -// val listener = it.value -// //TODO -// } -// } } \ No newline at end of file From aac230fecbe45ccb3de66cc37248cc1e59626c29 Mon Sep 17 00:00:00 2001 From: renwj Date: Wed, 15 Mar 2023 17:43:45 +0800 Subject: [PATCH 17/20] =?UTF-8?q?[m2]=20=E7=A7=BB=E9=99=A4=E5=85=B6?= =?UTF-8?q?=E5=AE=83application=E7=9A=84=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- settings.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings.gradle b/settings.gradle index 253517d62f..da0519ef75 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,7 @@ rootProject.name = 'MoGoEagleEye' include ':app' -include ':app_ipc_monitoring' -include ':app_mogo_magic_ring' +//include ':app_ipc_monitoring' +//include ':app_mogo_magic_ring' // 核心模块 From 94b29fe5d63a8f3f235c9e2a9f17cd81fdf71346 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Wed, 15 Mar 2023 19:28:49 +0800 Subject: [PATCH 18/20] =?UTF-8?q?[Opt3.0]=E8=A7=A3=E5=86=B3=E5=81=B6?= =?UTF-8?q?=E7=8E=B0=E9=AB=98=E7=B2=BE=E5=9C=B0=E5=9B=BE=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E7=9A=84ANR=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/map/AMapViewWrapper.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java index 81685eb25c..a355f8089c 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -4,7 +4,6 @@ import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_ALIAS_CODE import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_ALIAS_CODE_INIT_ON_MAP_LOADED; import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_INIT; import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LOG_CONNECT_STATUS; -import static com.mogo.eagle.core.utilcode.mogo.logger.Logger.d; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_MAP; import static com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_300; import static com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS; @@ -41,8 +40,8 @@ import com.mogo.eagle.core.function.call.map.CallerMapDevaListenerManager; import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager; import com.mogo.eagle.core.function.call.map.CallerMapStyleListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant; import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; +import com.mogo.eagle.core.utilcode.util.ThreadUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.hdcache.IHdCacheListener; import com.mogo.map.listener.MogoMapListenerHandler; @@ -168,17 +167,19 @@ public class AMapViewWrapper implements IMogoMapView, return; } MapAutoViewHelper options = mMapView.getMapAutoViewHelper(); - if (options != null) { - //设置手势是否可以缩放 isCanZoom true 可缩放 false 不可缩放 - options.setZoomGesturesEnabled(true); - options.setScaleVRMode(true); + ThreadUtils.getIoPool().submit(() -> { + if (options != null) { + //设置手势是否可以缩放 isCanZoom true 可缩放 false 不可缩放 + options.setZoomGesturesEnabled(true); + options.setScaleVRMode(true); // options.setAllGesturesEnabled(false); //禁止全部手势 - if (options.getMyLocationStyle() != null) { - options.getMyLocationStyle().setDisplayAnimEnable(true); + if (options.getMyLocationStyle() != null) { + options.getMyLocationStyle().setDisplayAnimEnable(true); + } + //修改自车模型,未来需区分车的类型 + options.setMyLocationStyle(options.getMyLocationStyle().myLocationIcon(HdMapBuildConfig.currentCarVrIconRes, true)); } - //修改自车模型,未来需区分车的类型 - options.setMyLocationStyle(options.getMyLocationStyle().myLocationIcon(HdMapBuildConfig.currentCarVrIconRes, true)); - } + }); } private void initListeners() { From 8171f641ce08ff68ceed41859eedbf20f906cf4b Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Thu, 16 Mar 2023 11:47:34 +0800 Subject: [PATCH 19/20] =?UTF-8?q?[opt=5F3.0]fix=E5=BD=95=E5=8C=85=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=95=B0=E6=8D=AE=E4=B8=BA=E7=A9=BABug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt index 85b14a2962..bc791705a3 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -626,6 +626,9 @@ class MoGoAdasListenerImpl : OnAdasListener { header: MessagePad.Header?, bagManager: BagManagerOuterClass.BagManager? ) { + bagManager?.let { + CallerAutopilotRecordListenerManager.invokeBagManagerResult(it) + } } /** From 8988688660fce8ae3020ec56491e50101106de6a Mon Sep 17 00:00:00 2001 From: renwj Date: Thu, 16 Mar 2023 19:09:21 +0800 Subject: [PATCH 20/20] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=B8=A5=E6=A0=BC=E6=A8=A1=E5=BC=8F=EF=BC=8C=E6=96=B9?= =?UTF-8?q?=E4=BE=BF=E6=A3=80=E6=B5=8B=E4=B8=BB=E7=BA=BF=E7=A8=8B=E8=80=97?= =?UTF-8?q?=E6=97=B6=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/launcher/MogoApplication.java | 16 +++++++++ .../DevaToolsProvider.kt | 7 +++- .../apm/ApmEnvProviderImpl.kt | 4 +-- .../strict/StrictModeProviderImpl.kt | 34 +++++++++++++++++++ .../hmi/ui/setting/DebugSettingView.kt | 29 ++++++++++++---- .../main/res/layout/view_debug_setting.xml | 12 +++++++ .../api/devatools/IDevaToolsProvider.kt | 3 ++ .../devatools/strict/IStrictModeProvider.kt | 10 ++++++ .../call/devatools/CallerDevaToolsManager.kt | 3 ++ 9 files changed, 108 insertions(+), 10 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/strict/StrictModeProviderImpl.kt create mode 100644 core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/strict/IStrictModeProvider.kt diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index a833aaaafd..f35d8258c0 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -1,9 +1,13 @@ package com.mogo.launcher; +import com.mogo.commons.debug.DebugConfig; +import com.mogo.eagle.core.function.api.devatools.strict.IStrictModeProvider; +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; import com.mogo.eagle.core.function.call.startup.CallerStartUpManager; import com.mogo.eagle.core.function.main.MainMoGoApplication; import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.eagle.core.utilcode.util.SharedPrefs; import com.mogo.launcher.crash.CrashSystem; import com.mogo.launcher.startup.ARouterStartUp; import com.mogo.launcher.startup.ConfigStartUp; @@ -21,9 +25,21 @@ public class MogoApplication extends MainMoGoApplication { ARouterStartUp.init(this); ConfigStartUp.init(this); CallerStartUpManager.initStageOne(); + tryEnableStrictMode(); super.onCreate(); } + private void tryEnableStrictMode() { + IStrictModeProvider strict = CallerDevaToolsManager.INSTANCE.strict(); + if (DebugConfig.isDebug() && strict != null) { + boolean enabled = SharedPrefs.getInstance(this).getBoolean("MOGO_STRICT_MODE_ENABLED", false); + Logger.e("StrictMode", "isEnabled:" + enabled); + if (enabled) { + strict.enable(); + } + } + } + @Override protected void initCrashConfig() { CrashSystem crashSystem = CrashSystem.getInstance(this); diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index c653f4bca4..1401d33981 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -16,6 +16,7 @@ import com.mogo.eagle.core.data.deva.scene.SceneTAG import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider import com.mogo.eagle.core.function.api.devatools.apm.* +import com.mogo.eagle.core.function.api.devatools.strict.* import com.mogo.eagle.core.function.call.map.* import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.zhjt.mogo_core_function_devatools.apm.* @@ -35,6 +36,7 @@ import com.zhjt.mogo_core_function_devatools.report.IPCReportManager import com.zhjt.mogo_core_function_devatools.report.IPCReportManager.Companion.iPCReportManager import com.zhjt.mogo_core_function_devatools.scene.SceneManager.Companion.sceneManager import com.zhjt.mogo_core_function_devatools.status.StatusManager +import com.zhjt.mogo_core_function_devatools.strict.* import com.zhjt.mogo_core_function_devatools.trace.TraceManager.Companion.traceManager import com.zhjt.mogo_core_function_devatools.tts.TtsManager.Companion.ttsManager import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeManager.Companion.upgradeManager @@ -48,7 +50,9 @@ class DevaToolsProvider : IDevaToolsProvider { private var mContext: Context? = null - private val apmEnvProvider by lazy { ApmEnvProviderImpl } + private val apmEnvProvider by lazy { ApmEnvProviderImpl() } + + private val strictModeProvider by lazy { StrictModeProviderImpl() } @Volatile private var mDockerVersion: String? = null @@ -253,4 +257,5 @@ class DevaToolsProvider : IDevaToolsProvider { override fun queryObuUpgrade(obuVersionName: String) { bindingCarManager.queryObuUpgrade(obuVersionName) } + override fun strict(): IStrictModeProvider = strictModeProvider } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt index 146ce9adc3..ddc8257335 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt @@ -17,9 +17,9 @@ import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference import kotlin.coroutines.* -object ApmEnvProviderImpl: IApmEnvProvider, CoroutineScope { +class ApmEnvProviderImpl: IApmEnvProvider, CoroutineScope { - private const val TAG = "ApmEnvProvider" + private val TAG = "ApmEnvProvider" private val scope by lazy { CoroutineScope(Dispatchers.IO + SupervisorJob()) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/strict/StrictModeProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/strict/StrictModeProviderImpl.kt new file mode 100644 index 0000000000..b364363093 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/strict/StrictModeProviderImpl.kt @@ -0,0 +1,34 @@ +package com.zhjt.mogo_core_function_devatools.strict + +import android.os.* +import android.os.StrictMode.ThreadPolicy.Builder +import android.os.StrictMode.VmPolicy +import com.mogo.eagle.core.function.api.devatools.strict.* + +/** + * 严格模式功能管理 + * 1. 监测主线程磁盘读写 + * 2. 监测主线程网络请求 + * 3. 监测磁盘输入输出流使用异常(未及时关闭) + * 4. 监测数据库查询操作异常(cursor使用未关闭) + * 5. 监测资源类型不匹配(TypedValue) + * 6. 监测文件读写未使用Buffer(增加buffer可以减少系统调用,降低性能损耗) + */ +class StrictModeProviderImpl: IStrictModeProvider { + + + override fun enable() { + StrictMode.setThreadPolicy( + Builder() + .detectAll() + .penaltyLog() + .penaltyDropBox() + .build()) + StrictMode.setVmPolicy( + VmPolicy.Builder() + .detectAll() + .penaltyLog() + .penaltyDropBox() + .build()) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index eba7451134..c32a366d08 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -7,6 +7,7 @@ import android.content.ClipboardManager import android.content.Context import android.graphics.Color import android.os.Build +import android.os.Process import android.text.Html import android.util.AttributeSet import android.util.Log @@ -64,9 +65,7 @@ import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.logcatch.ILogViewListener import com.mogo.eagle.core.function.hmi.ui.logcatch.LogInfoView import com.mogo.eagle.core.function.hmi.ui.widget.DemoModeView -import com.mogo.eagle.core.utilcode.kotlin.currentPadding -import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner -import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel @@ -81,7 +80,7 @@ import com.mogo.map.uicontroller.VisualAngleMode.* import kotlinx.android.synthetic.main.view_debug_setting.view.* import kotlinx.android.synthetic.main.view_debug_setting.view.tbRouteDynamicEffect import kotlinx.android.synthetic.main.view_sop_setting.view.* -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg import java.text.SimpleDateFormat @@ -621,6 +620,18 @@ internal class DebugSettingView @JvmOverloads constructor( tbIsDemoMode.visibility = View.GONE } + tbIsStrictMode?.also { + it.isChecked = SharedPrefs.getInstance(Utils.getApp()).getBoolean("MOGO_STRICT_MODE_ENABLED", false) + it.setOnCheckedChangeListener { _, isChecked -> + SharedPrefs.getInstance(Utils.getApp()).putBoolean("MOGO_STRICT_MODE_ENABLED", isChecked) + scope.launch { + ToastUtils.showShort("配置生效, 2秒后重启应用...") + delay(2000) + restartApp() + } + } + } + // 雨天模式,上一次勾选的数据 tbIsRainMode.isChecked = FunctionBuildConfig.isRainMode //雨天模式 @@ -1628,11 +1639,10 @@ internal class DebugSettingView @JvmOverloads constructor( mRouteInfoSize = 0 if (FunctionBuildConfig.isDemoMode) { - tbIsDemoMode.text = "关闭美化模式" + tbIsDemoMode?.text = "关闭美化模式" } else { - tbIsDemoMode.text = "开启美化模式" + tbIsDemoMode?.text = "开启美化模式" } - //obu信息,排查obu相关问题使用 tvObuInfoContent.text = mObuInfoStr @@ -2035,6 +2045,11 @@ internal class DebugSettingView @JvmOverloads constructor( } } + private fun restartApp() { + Utils.getApp().startActivity(Utils.getApp().packageManager.getLaunchIntentForPackage(Utils.getApp().packageName)) + Process.killProcess(Process.myPid()) + } + override fun fwThreadClose() { refreshTraceInfo() } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index 20f98d2738..fbd4be94fa 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -229,6 +229,18 @@ android:layout_height="1dp" android:background="#F0F0F0" /> + +