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" />
+
+