Merge branch 'dev_arch_opt_3.0' of gitlab.zhidaoauto.com:zhjt/AndroidApp/MoGoEagleEye into dev_arch_opt_3.0

This commit is contained in:
lixiaopeng
2023-03-20 19:04:46 +08:00
15 changed files with 195 additions and 70 deletions

View File

@@ -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);

View File

@@ -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",

View File

@@ -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
}

View File

@@ -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()) }

View File

@@ -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())
}
}

View File

@@ -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()
}

View File

@@ -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()){
//将角标改为“下载中”

View File

@@ -229,6 +229,18 @@
android:layout_height="1dp"
android:background="#F0F0F0" />
<ToggleButton
android:id="@+id/tbIsStrictMode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:padding="@dimen/dp_20"
android:textOff="开启严格模式"
android:textOn="关闭严格模式"
android:textSize="@dimen/dp_24" />
<ToggleButton
android:id="@+id/tbIsDemoMode"
android:layout_width="match_parent"

View File

@@ -324,6 +324,50 @@ public class MogoLocation implements Cloneable {
return this;
}
public MogoLocation copy(MogoLocation lastLocation, double longitude, double latitude) {
MogoLocation mogoLocation = new MogoLocation();
mogoLocation.accuracy = lastLocation.accuracy;
mogoLocation.adCode = lastLocation.adCode;
mogoLocation.address = lastLocation.address;
mogoLocation.aoiName = lastLocation.aoiName;
mogoLocation.buildingId = lastLocation.buildingId;
mogoLocation.cityCode = lastLocation.cityCode;
mogoLocation.cityName = lastLocation.cityName;
mogoLocation.description = lastLocation.description;
mogoLocation.district = lastLocation.district;
mogoLocation.errorCode = lastLocation.errorCode;
mogoLocation.errorInfo = lastLocation.errorInfo;
mogoLocation.floor = lastLocation.floor;
mogoLocation.gpsAccuracyStatus = lastLocation.gpsAccuracyStatus;
mogoLocation.lastReceiveTime = lastLocation.lastReceiveTime;
mogoLocation.locationDetail = lastLocation.locationDetail;
mogoLocation.locType = lastLocation.locType;
mogoLocation.poiName = lastLocation.poiName;
mogoLocation.provider = lastLocation.provider;
mogoLocation.province = lastLocation.province;
mogoLocation.satellite = lastLocation.satellite;
mogoLocation.street = lastLocation.street;
mogoLocation.streetNum = lastLocation.streetNum;
MessagePad.GnssInfo gnssInfo =
MessagePad.GnssInfo.newBuilder()
.setLongitude(longitude) //经度
.setLatitude(latitude)//纬度
.setAltitude(lastLocation.gnssInfo.getAltitude()) //海拔
.setHeading(lastLocation.gnssInfo.getHeading()) //航向角
.setAcceleration(lastLocation.gnssInfo.getAcceleration()) //加速度
.setYawRate(lastLocation.gnssInfo.getYawRate()) //曲率
.setGnssSpeed(lastLocation.gnssInfo.getGnssSpeed()) //惯导车速 m/s
.setVehicleSpeed(lastLocation.gnssInfo.getVehicleSpeed()) //车辆车速 m/s
.setSatelliteTime(lastLocation.gnssInfo.getSatelliteTime()) //gps时间 单位秒s
.setSystemTime(lastLocation.gnssInfo.getSystemTime()) //系统时间 单位秒s
.build();
mogoLocation.gnssInfo = gnssInfo;
return mogoLocation;
}
public long getLastReceiveTime() {
return lastReceiveTime;
}

View File

@@ -12,6 +12,7 @@ import com.mogo.eagle.core.data.deva.scene.SceneModule
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.apm.*
import com.mogo.eagle.core.function.api.devatools.strict.*
/**
* 开发套件工具接口
@@ -195,4 +196,6 @@ interface IDevaToolsProvider : IProvider {
fun dockerVersion(dockerVersion: String?)
fun apmEnvProvider(): IApmEnvProvider
fun strict(): IStrictModeProvider
}

View File

@@ -0,0 +1,10 @@
package com.mogo.eagle.core.function.api.devatools.strict
/**
* 系统严格模式功能封装
*/
interface IStrictModeProvider {
fun enable()
}

View File

@@ -18,7 +18,7 @@ object CallerChassisLocationGCJ02ListenerManager : CallerBase<IMoGoChassisLocati
private const val TAG = "CallerChassisLocationGCJ20ListenerManager"
@Volatile
private var mGnssInfo: MogoLocation? = null
private var mGnssInfo: MogoLocation = MogoLocation()
/**
* 添加监听并指定回掉频率
@@ -35,8 +35,8 @@ object CallerChassisLocationGCJ02ListenerManager : CallerBase<IMoGoChassisLocati
setListenerHz(tag, callBackHz)
}
fun getChassisLocationGCJ02(): MogoLocation? {
return mGnssInfo
fun getChassisLocationGCJ02(): MogoLocation {
return mGnssInfo.clone()
}
/**
@@ -46,46 +46,42 @@ object CallerChassisLocationGCJ02ListenerManager : CallerBase<IMoGoChassisLocati
@Synchronized
fun invokeChassisLocationGCJ02(gnssInfo: MogoLocation?, sourceType: DataSourceType) {
gnssInfo?.let {
// 克隆定位数据,防止原数据被篡改导致位置跳变
mGnssInfo = gnssInfo.clone()
// 转换 WGS84-->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)
}
}
}

View File

@@ -17,7 +17,7 @@ object CallerChassisLocationWGS84ListenerManager : CallerBase<IMoGoChassisLocati
private var mGnssInfo: MogoLocation = MogoLocation()
fun getChassisLocationWGS84(): MogoLocation {
return mGnssInfo
return mGnssInfo.clone()
}
/**

View File

@@ -14,6 +14,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.base.CallerBase
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
@@ -248,4 +249,6 @@ object CallerDevaToolsManager {
fun queryObuUpgrade(obuVersionName: String) {
devaToolsProviderApi?.queryObuUpgrade(obuVersionName)
}
fun strict(): IStrictModeProvider? = devaToolsProviderApi?.strict()
}

View File

@@ -24,7 +24,6 @@ import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import com.mogo.commons.debug.DebugConfig;
@@ -34,7 +33,7 @@ import com.mogo.eagle.core.data.map.CenterLine;
import com.mogo.eagle.core.data.map.MapRoadInfo;
import com.mogo.eagle.core.data.map.MogoLatLng;
import com.mogo.eagle.core.data.map.MogoLocation;
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager;
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager;
import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager;
import com.mogo.eagle.core.function.call.map.CallerMapDevaListenerManager;
import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager;
@@ -212,28 +211,11 @@ public class AMapViewWrapper implements IMogoMapView,
@Override
public void onStopLineInfo(@androidx.annotation.Nullable StopLine stopLine) {
MogoLocation carLoc = CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02();
MogoLocation carLoc = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84();
if (stopLine != null && stopLine.road_id != null && !stopLine.road_id.isEmpty() && stopLine.points != null && stopLine.points.size() > 0) {
ArrayList<LonLatPoint> 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);