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/config.gradle b/config.gradle index dc2bd1e3d3..c2c71ebf9c 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_beta4', + mogoobu : 'com.mogo.support.obu:mogo-obu:1.1.0_beta5', // google googlezxing : "com.google.zxing:core:3.3.3", 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/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt index 52281e673c..1418bac233 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt @@ -141,7 +141,12 @@ class SystemVersionView @JvmOverloads constructor( } } - updateHDDataCacheStatus(CallerMapUIServiceManager.isCityDataCached()) + ThreadUtils.getIoPool().execute { + val isCached = CallerMapUIServiceManager.isCityDataCached() + UiThreadHandler.post { + updateHDDataCacheStatus(isCached) + } + } if(AdUpgradeStateHelper.isConfirmUpgrade()){ //将角标改为“下载中” 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" /> + + GCJ02 坐标 val gcj20Location = CoordinateTransform.WGS84ToGCJ02(gnssInfo.longitude, gnssInfo.latitude) - mGnssInfo?.let { - mGnssInfo!!.longitude = gcj20Location[0] - mGnssInfo!!.latitude = gcj20Location[1] + // 克隆定位数据,防止原数据被篡改导致位置跳变 + mGnssInfo = gnssInfo.copy(gnssInfo, gcj20Location[0], gcj20Location[1]) - M_LISTENERS.forEach { - val tag = it.key - // 获取数据监听需要的HZ - val hz = M_LISTENERS_HZ[tag] - if (hz != null && hz > 0) { - val hzTime = (1.0 / hz.toDouble()) * 1000 - // 获取最后一次回调的时间 - val hzLastSendTime = M_LISTENERS_HZ_LAST_SEND_TIME[tag] - if (hzLastSendTime != null && hzLastSendTime > 0) { - // 计算是否进入下一次回调周期 - val nowTime = TimeUtils.getNowMills() - if (nowTime - hzLastSendTime > hzTime) { - syncLocationCallback(tag, it, mGnssInfo!!, sourceType) - } - } else { - syncLocationCallback(tag, it, mGnssInfo!!, sourceType) + M_LISTENERS.forEach { + val tag = it.key + // 获取数据监听需要的HZ + val hz = M_LISTENERS_HZ[tag] + if (hz != null && hz > 0) { + val hzTime = (1.0 / hz.toDouble()) * 1000 + // 获取最后一次回调的时间 + val hzLastSendTime = M_LISTENERS_HZ_LAST_SEND_TIME[tag] + if (hzLastSendTime != null && hzLastSendTime > 0) { + // 计算是否进入下一次回调周期 + val nowTime = TimeUtils.getNowMills() + if (nowTime - hzLastSendTime > hzTime) { + syncLocationCallback(tag, it, mGnssInfo, sourceType) } } else { - //Logger.d(TAG, "没设置监听频率,使用默认5HZ") - val hzTime = (1.0 / 5) * 1000 - // 获取最后一次回调的时间 - val hzLastSendTime = M_LISTENERS_HZ_LAST_SEND_TIME[tag] - if (hzLastSendTime != null && hzLastSendTime > 0) { - // 计算是否进入下一次回调周期 - val nowTime = TimeUtils.getNowMills() - if (nowTime - hzLastSendTime > hzTime) { - syncLocationCallback(tag, it, mGnssInfo!!, sourceType) - } - } else { - syncLocationCallback(tag, it, mGnssInfo!!, sourceType) + syncLocationCallback(tag, it, mGnssInfo, sourceType) + } + } else { + //Logger.d(TAG, "没设置监听频率,使用默认5HZ") + val hzTime = (1.0 / 5) * 1000 + // 获取最后一次回调的时间 + val hzLastSendTime = M_LISTENERS_HZ_LAST_SEND_TIME[tag] + if (hzLastSendTime != null && hzLastSendTime > 0) { + // 计算是否进入下一次回调周期 + val nowTime = TimeUtils.getNowMills() + if (nowTime - hzLastSendTime > hzTime) { + syncLocationCallback(tag, it, mGnssInfo, sourceType) } + } else { + syncLocationCallback(tag, it, mGnssInfo, sourceType) } } } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerChassisLocationWGS84ListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerChassisLocationWGS84ListenerManager.kt index 7c38e0fad2..6c2465f0d9 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerChassisLocationWGS84ListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerChassisLocationWGS84ListenerManager.kt @@ -17,7 +17,7 @@ object CallerChassisLocationWGS84ListenerManager : CallerBase 0) { ArrayList points = stopLine.points; if (carLoc != null) { - /** - * //地图组提供的高德坐标切到WGS84坐标系 - * var cal = LonLatPoint(point!!.lon, point!!.lat) - * if(!point!!.provider.equals(MapAutoApi.GPS_FLAG)){ - * cal = MapTools.switchLonLatWGS84(cal) - * } - */ - String provider = carLoc.getProvider(); - //CallerLogger.INSTANCE.d(M_MAP + TAG, "car_loc: " + carLoc + ""); - if (!MapAutoApi.GPS_FLAG.equals(provider)) { - //CallerLogger.INSTANCE.d(M_MAP + TAG, "convert before: car_loc: {lon: " + carLoc.getLongitude() + ", lat: " + carLoc.getLatitude() + "}"); - LonLatPoint p = new LonLatPoint(carLoc.getLongitude(), carLoc.getLatitude()); - p = MapTools.INSTANCE.switchLonLatWGS84(p); - carLoc.setLongitude(p.longitude); - carLoc.setLatitude(p.latitude); - //CallerLogger.INSTANCE.d(M_MAP + TAG, "convert after: car_loc: {lon: " + carLoc.getLongitude() + ", lat: " + carLoc.getLatitude() + "}"); - } - //CallerLogger.INSTANCE.d(M_MAP + TAG, "onStopLineInfo:stop_line" + stopLine + ", car_loc:{lon: " + carLoc.getLatitude() + ", lat: " + carLoc.getLongitude() + "}"); +// //CallerLogger.INSTANCE.d(M_MAP + TAG, "onStopLineInfo:stop_line" + stopLine + ", car_loc:{lon: " + carLoc.getLatitude() + ", lat: " + carLoc.getLongitude() + "}"); MapRoadInfo.StopLine stopInfo = convert(stopLine); LonLatPoint p1 = points.get(0); LonLatPoint p2 = points.get(points.size() - 1);