[Opt3.0]新增StartUp模块并调整启动顺序
This commit is contained in:
@@ -337,7 +337,7 @@ dependencies {
|
||||
implementation rootProject.ext.dependencies.android_start_up
|
||||
implementation rootProject.ext.dependencies.lancetx_runtime
|
||||
implementation rootProject.ext.dependencies.mogocustommap
|
||||
|
||||
implementation project(':core:function-impl:mogo-core-function-startup')
|
||||
// // 暂不使用Shizuku-API
|
||||
// implementation rootProject.ext.dependencies.shizuku_provider
|
||||
if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
|
||||
|
||||
@@ -1,28 +1,12 @@
|
||||
package com.mogo.launcher;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.mogo.commons.debug.DebugConfig;
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
|
||||
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.ProcessUtils;
|
||||
import com.mogo.launcher.crash.CrashSystem;
|
||||
import com.mogo.launcher.stageone.APMStartup;
|
||||
import com.mogo.launcher.stageone.ARouterStartUp;
|
||||
import com.mogo.launcher.stageone.ConfigStartUp;
|
||||
import com.mogo.launcher.stageone.HttpDnsStartUp;
|
||||
import com.mogo.launcher.stageone.ThreadOptStartup;
|
||||
import com.rousetime.android_startup.StartupListener;
|
||||
import com.rousetime.android_startup.StartupManager;
|
||||
import com.rousetime.android_startup.model.LoggerLevel;
|
||||
import com.rousetime.android_startup.model.StartupConfig;
|
||||
import com.zhidaoauto.map.sdk.open.HDTypes;
|
||||
import com.zhidaoauto.map.sdk.open.MapAutoApi;
|
||||
import com.zhidaoauto.map.sdk.open.MapParams;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import com.mogo.launcher.startup.ARouterStartUp;
|
||||
import com.mogo.launcher.startup.ConfigStartUp;
|
||||
|
||||
/**
|
||||
* @author congtaowang
|
||||
@@ -34,43 +18,12 @@ public class MogoApplication extends MainMoGoApplication {
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
startUpInStage1();
|
||||
ARouterStartUp.init(this);
|
||||
ConfigStartUp.init(this);
|
||||
CallerStartUpManager.initStageOne();
|
||||
super.onCreate();
|
||||
}
|
||||
|
||||
private final StartupListener startupListener = (l, costTimesModels) -> EventBus.getDefault().postSticky(costTimesModels);
|
||||
|
||||
/**
|
||||
* 第一阶段初始化
|
||||
*/
|
||||
public void startUpInStage1() {
|
||||
StartupConfig config = null;
|
||||
if (DebugConfig.isDebug()) {
|
||||
config = new StartupConfig.Builder()
|
||||
.setLoggerLevel(LoggerLevel.DEBUG)
|
||||
.setOpenStatistics(true)
|
||||
.setListener(startupListener)
|
||||
.build();
|
||||
} else {
|
||||
config = new StartupConfig.Builder()
|
||||
.setLoggerLevel(LoggerLevel.NONE)
|
||||
.setOpenStatistics(false)
|
||||
.setAwaitTimeout(10000L)
|
||||
.setListener(startupListener)
|
||||
.build();
|
||||
}
|
||||
new StartupManager.Builder()
|
||||
.addStartup(new HttpDnsStartUp())
|
||||
.addStartup(new APMStartup())
|
||||
.addStartup(new ConfigStartUp())
|
||||
.addStartup(new ARouterStartUp())
|
||||
.addStartup(new ThreadOptStartup())
|
||||
.setConfig(config)
|
||||
.build(this)
|
||||
.start()
|
||||
.await();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initCrashConfig() {
|
||||
CrashSystem crashSystem = CrashSystem.getInstance(this);
|
||||
|
||||
@@ -1,25 +1,22 @@
|
||||
package com.mogo.launcher.stageone
|
||||
package com.mogo.launcher.startup
|
||||
|
||||
import android.app.Application
|
||||
import android.content.Context
|
||||
import com.alibaba.android.arouter.launcher.ARouter
|
||||
import com.mogo.commons.debug.DebugConfig
|
||||
import com.mogo.eagle.core.utilcode.util.AppUtils
|
||||
import com.mogo.eagle.core.utilcode.util.CleanUtils
|
||||
import com.rousetime.android_startup.AndroidStartup
|
||||
import java.lang.Exception
|
||||
|
||||
class ARouterStartUp : AndroidStartup<String>() {
|
||||
override fun callCreateOnMainThread() = true
|
||||
|
||||
override fun create(context: Context): String {
|
||||
object ARouterStartUp {
|
||||
@JvmStatic
|
||||
fun init(app: Application) {
|
||||
try {
|
||||
if (DebugConfig.isDebug()) {
|
||||
ARouter.openDebug()
|
||||
ARouter.openLog()
|
||||
}
|
||||
// 初始化 arouter
|
||||
ARouter.init(context as Application?)
|
||||
ARouter.init(app)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
// 由于ARouter会在SP_AROUTER_CACHE.xml缓存路由表,如果出现了被删除的情况会报错,这里清除下就好了
|
||||
@@ -27,12 +24,5 @@ class ARouterStartUp : AndroidStartup<String>() {
|
||||
// 重启应用
|
||||
AppUtils.relaunchApp()
|
||||
}
|
||||
return this.javaClass.simpleName
|
||||
}
|
||||
|
||||
override fun waitOnMainThread() = false
|
||||
|
||||
override fun dependenciesByName(): List<String>? {
|
||||
return listOf("com.mogo.launcher.stageone.ThreadOptStartup")
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,9 @@
|
||||
package com.mogo.launcher.stageone
|
||||
package com.mogo.launcher.startup
|
||||
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import com.mogo.commons.debug.DebugConfig
|
||||
import com.mogo.eagle.core.data.app.AppConfigInfo.appBuildTime
|
||||
import com.mogo.eagle.core.data.app.AppConfigInfo.workingBranchHash
|
||||
import com.mogo.eagle.core.data.app.AppConfigInfo.workingBranchName
|
||||
import com.mogo.eagle.core.data.app.AppConfigInfo
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig
|
||||
import com.mogo.eagle.core.data.config.HdMapBuildConfig
|
||||
import com.mogo.eagle.core.data.config.HmiBuildConfig
|
||||
@@ -16,30 +14,25 @@ import com.mogo.eagle.core.utilcode.util.ProcessUtils
|
||||
import com.mogo.launcher.BuildConfig
|
||||
import com.mogo.launcher.R
|
||||
import com.mogo.test.crashreport.CrashReportConstants
|
||||
import com.rousetime.android_startup.AndroidStartup
|
||||
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
|
||||
|
||||
class ConfigStartUp : AndroidStartup<Boolean>() {
|
||||
object ConfigStartUp {
|
||||
|
||||
override fun callCreateOnMainThread() = true
|
||||
|
||||
override fun waitOnMainThread() = false
|
||||
|
||||
override fun create(context: Context): Boolean {
|
||||
initDebugConfig(context)
|
||||
@JvmStatic
|
||||
fun init(context: Context) {
|
||||
initDebugConfig()
|
||||
initBuildConfig()
|
||||
initOtherConfig(context)
|
||||
return true
|
||||
}
|
||||
|
||||
private fun initBuildConfig() {
|
||||
// 初始化构建APP的时候的分支及提交HASH,用于辅助定位问题
|
||||
workingBranchName = BuildConfig.WORKING_BRANCH_NAME
|
||||
workingBranchHash = BuildConfig.WORKING_BRANCH_HASH
|
||||
appBuildTime = BuildConfig.APP_BUILD_TIME
|
||||
AppConfigInfo.workingBranchName = BuildConfig.WORKING_BRANCH_NAME
|
||||
AppConfigInfo.workingBranchHash = BuildConfig.WORKING_BRANCH_HASH
|
||||
AppConfigInfo.appBuildTime = BuildConfig.APP_BUILD_TIME
|
||||
// 使用与渠道配置一样的gps提供者提供的数据,app/productFlavors/fPadLenovo.gradle GPS_PROVIDER 0-Android系统,1-工控机,2-OBU
|
||||
FunctionBuildConfig.gpsProvider = BuildConfig.GPS_PROVIDER
|
||||
// FunctionBuildConfig.gpsProvider = 2
|
||||
@@ -70,7 +63,7 @@ class ConfigStartUp : AndroidStartup<Boolean>() {
|
||||
FunctionBuildConfig.adasConnectIP = BuildConfig.ADAS_CONNECT_IP
|
||||
}
|
||||
|
||||
private fun initDebugConfig(context: Context) {
|
||||
private fun initDebugConfig() {
|
||||
var mode = BuildConfig.NET_ENV
|
||||
val envConfig = EnvChangeManager.getEnvConfig()
|
||||
if (envConfig != null) {
|
||||
@@ -86,7 +79,6 @@ class ConfigStartUp : AndroidStartup<Boolean>() {
|
||||
DebugConfig.setMapOptVersion(BuildConfig.MAP_SDK_OPT_VERSION)
|
||||
DebugConfig.setNeedUploadCoordinatesInTime(BuildConfig.IS_NEED_UPLOAD_COORDINATES_IN_TIME)
|
||||
DebugConfig.setMultiDisplay(BuildConfig.IS_MULTI_DISPLAY)
|
||||
|
||||
}
|
||||
|
||||
private fun initOtherConfig(context: Context) {
|
||||
@@ -105,30 +97,36 @@ class ConfigStartUp : AndroidStartup<Boolean>() {
|
||||
|
||||
if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
|
||||
if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
|
||||
//是否显示 限速UI
|
||||
HmiBuildConfig.isShowLimitingVelocityView = false
|
||||
//白天模式
|
||||
FunctionBuildConfig.skinMode = 1
|
||||
} else if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) {
|
||||
//是否显示 限速UI
|
||||
HmiBuildConfig.isShowLimitingVelocityView = false
|
||||
}
|
||||
}
|
||||
|
||||
val mapParams = MapParams.init()
|
||||
mapParams.setDebugMode(false) //todo 1-使用本地地图数据,0-使用在线地图数据
|
||||
//.setDataFileSource(1)
|
||||
.setCoordinateType(MapParams.COORDINATETYPE_GCJ02)
|
||||
.setPerspectiveMode(MapParams.MAP_PERSPECTIVE_UP_CAR)
|
||||
.setHDVisibileArray(intArrayOf(HDTypes.DIVIDER.type,
|
||||
HDTypes.ROAD_AREA.type,
|
||||
HDTypes.STOP_LINE.type,
|
||||
HDTypes.ARROW.type,
|
||||
HDTypes.STATION_BRIDGE.type,
|
||||
HDTypes.ZEBRA_LINE.type,
|
||||
HDTypes.GREEN_BELT.type,
|
||||
HDTypes.DIVERSION.type,
|
||||
HDTypes.SAFE_ISLAND.type,
|
||||
HDTypes.ALPHANUMERIC.type,
|
||||
HDTypes.GUARDBAR.type,
|
||||
HDTypes.TRAFFIC_DEVICE.type,
|
||||
HDTypes.CABLE.type,
|
||||
HDTypes.SIGNAL_LINE.type))
|
||||
//.setDataFileSource(1)
|
||||
.setCoordinateType(MapParams.COORDINATETYPE_GCJ02)
|
||||
.setPerspectiveMode(MapParams.MAP_PERSPECTIVE_UP_CAR)
|
||||
.setHDVisibileArray(intArrayOf(
|
||||
HDTypes.DIVIDER.type,
|
||||
HDTypes.ROAD_AREA.type,
|
||||
HDTypes.STOP_LINE.type,
|
||||
HDTypes.ARROW.type,
|
||||
HDTypes.STATION_BRIDGE.type,
|
||||
HDTypes.ZEBRA_LINE.type,
|
||||
HDTypes.GREEN_BELT.type,
|
||||
HDTypes.DIVERSION.type,
|
||||
HDTypes.SAFE_ISLAND.type,
|
||||
HDTypes.ALPHANUMERIC.type,
|
||||
HDTypes.GUARDBAR.type,
|
||||
HDTypes.TRAFFIC_DEVICE.type,
|
||||
HDTypes.CABLE.type,
|
||||
HDTypes.SIGNAL_LINE.type))
|
||||
// .setZoom( 20 )
|
||||
// .setPointToCenter( 0.734375f, 0.5f )
|
||||
//todo 2D模式下需要注意ADAS部分遮挡
|
||||
@@ -148,5 +146,4 @@ class ConfigStartUp : AndroidStartup<Boolean>() {
|
||||
MapAutoApi.init(context, mapParams)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -224,6 +224,8 @@ ext {
|
||||
|
||||
//========================= autosize ======================
|
||||
androidautoSize : 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1',
|
||||
|
||||
thread_opt : "com.mogo.thread.opt:lib:${THREAD_OPT_VERSION}"
|
||||
]
|
||||
android = [
|
||||
launcherApplicationId : "com.mogo.launcher",
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.mogo.eagle.core.function
|
||||
|
||||
import android.content.Context
|
||||
import com.alibaba.android.arouter.facade.annotation.Route
|
||||
import com.mogo.eagle.core.data.constants.MogoServicePaths
|
||||
import com.mogo.eagle.core.function.api.datacenter.IDataCenterProvider
|
||||
|
||||
@Route(path = MogoServicePaths.PATH_DATA_CENTER_MODULE)
|
||||
class DataCenterProvider: IDataCenterProvider {
|
||||
|
||||
override val functionName: String
|
||||
get() = "DataCenterProvider"
|
||||
|
||||
override fun init(context: Context?) {
|
||||
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import android.content.Context
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import com.alibaba.android.arouter.facade.annotation.Route
|
||||
import com.mogo.eagle.core.data.EnvConfig
|
||||
import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo
|
||||
import com.mogo.eagle.core.data.constants.MogoServicePaths
|
||||
import com.mogo.eagle.core.data.deva.chain.ChainLogParam
|
||||
@@ -13,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.zhjt.mogo_core_function_devatools.badcase.BadCaseManager
|
||||
import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager
|
||||
import com.zhjt.mogo_core_function_devatools.binding.BindingCarManager.Companion.bindingCarManager
|
||||
import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter
|
||||
import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigImpl
|
||||
@@ -142,6 +144,10 @@ class DevaToolsProvider : IDevaToolsProvider {
|
||||
traceManager.syncConfig()
|
||||
}
|
||||
|
||||
override fun getEnvConfig(): EnvConfig? {
|
||||
return EnvChangeManager.getEnvConfig()
|
||||
}
|
||||
|
||||
override fun modifyCarInfo(callBack: (ModifyBindingcarInfo) -> Unit) {
|
||||
bindingCarManager.modifyCarInfo(callBack)
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.content.Context.MODE_PRIVATE
|
||||
import android.os.Process
|
||||
import com.mogo.commons.constants.*
|
||||
import com.mogo.commons.debug.*
|
||||
import com.mogo.eagle.core.data.EnvConfig
|
||||
import com.mogo.eagle.core.function.call.map.*
|
||||
import com.mogo.eagle.core.utilcode.mogo.storage.*
|
||||
import com.mogo.eagle.core.utilcode.util.*
|
||||
@@ -47,6 +48,11 @@ object EnvChangeManager {
|
||||
}
|
||||
}
|
||||
|
||||
fun getConfigNetMode(): Int {
|
||||
val cache = getConfig()
|
||||
return cache?.second ?: -1
|
||||
}
|
||||
|
||||
fun getNetMode(): String {
|
||||
val cache = getConfig()
|
||||
return if (cache == null) {
|
||||
@@ -88,6 +94,4 @@ object EnvChangeManager {
|
||||
if (it.first == "010") 116.397446 else 112.582654,
|
||||
if (it.first == "010") 39.909004 else 26.816478)
|
||||
}
|
||||
|
||||
data class EnvConfig(val cityCode: String, val netMode: Int, val lat: Double, val lon: Double)
|
||||
}
|
||||
@@ -41,10 +41,10 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
|
||||
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
|
||||
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager;
|
||||
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager;
|
||||
import com.mogo.eagle.core.function.call.startup.CallerStartUpManager;
|
||||
import com.mogo.eagle.core.function.hmi.R;
|
||||
import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView;
|
||||
import com.mogo.eagle.core.function.main.modules.MogoModulesManager;
|
||||
import com.mogo.eagle.core.function.main.stagetwo.AutopilotStartup;
|
||||
import com.mogo.eagle.core.function.main.windowview.FloatingViewHandler;
|
||||
import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
|
||||
@@ -163,7 +163,7 @@ public class MainActivity extends MvpActivity<MainView, MainPresenter> implement
|
||||
ContextHolderUtil.holdContext(this);
|
||||
// 监听工控机连接信息
|
||||
CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this);
|
||||
startUpInStage2();
|
||||
CallerStartUpManager.initStageTwo();
|
||||
// 加载模块
|
||||
mPresenter.postLoadModuleMsg();
|
||||
// 监听网络状态
|
||||
@@ -218,26 +218,6 @@ public class MainActivity extends MvpActivity<MainView, MainPresenter> implement
|
||||
mConnectInfoRV.setAdapter(mConnAdapter);
|
||||
}
|
||||
|
||||
/**
|
||||
* 第二阶段初始化,第一阶段初始化可查看:{@link com.mogo.launcher.stageone}
|
||||
*/
|
||||
public void startUpInStage2() {
|
||||
StartupConfig config = null;
|
||||
if (DebugConfig.isDebug()) {
|
||||
config = new StartupConfig.Builder()
|
||||
.setLoggerLevel(LoggerLevel.DEBUG)
|
||||
.setOpenStatistics(true)
|
||||
.build();
|
||||
}
|
||||
new StartupManager.Builder()
|
||||
.addStartup(new AutopilotStartup())
|
||||
// .addStartup(new APMStartup())
|
||||
.setConfig(config)
|
||||
.build(this)
|
||||
.start()
|
||||
.await();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadModules() {
|
||||
final long start = System.currentTimeMillis();
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
package com.mogo.eagle.core.function.main.stagetwo;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.alibaba.android.arouter.launcher.ARouter;
|
||||
import com.mogo.eagle.core.data.constants.MogoServicePaths;
|
||||
import com.rousetime.android_startup.AndroidStartup;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class AutopilotStartup extends AndroidStartup<Boolean> {
|
||||
@Nullable
|
||||
@Override
|
||||
public Boolean create(@NonNull Context context) {
|
||||
ARouter.getInstance().build(MogoServicePaths.PATH_AUTO_PILOT).navigation();
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean callCreateOnMainThread() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean waitOnMainThread() {
|
||||
return false;
|
||||
}
|
||||
|
||||
// @Nullable
|
||||
// @Override
|
||||
// public List<String> dependenciesByName() {
|
||||
// List<String> deps = new ArrayList<>();
|
||||
// deps.add("com.mogo.eagle.core.function.main.stagetwo.APMStartup");
|
||||
// return deps;
|
||||
// }
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
package com.mogo.eagle.core.function.main.stagetwo;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.rousetime.android_startup.AndroidStartup;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class MapStartup extends AndroidStartup<Boolean> {
|
||||
@Nullable
|
||||
@Override
|
||||
public Boolean create(@NonNull Context context) {
|
||||
// TODO:暂不支持分步加载
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean callCreateOnMainThread() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean waitOnMainThread() {
|
||||
return false;
|
||||
}
|
||||
|
||||
// @Nullable
|
||||
// @Override
|
||||
// public List<String> dependenciesByName() {
|
||||
// List<String> deps = new ArrayList<>();
|
||||
// deps.add("com.mogo.eagle.core.function.main.stagetwo.APMStartup");
|
||||
// return deps;
|
||||
// }
|
||||
}
|
||||
1
core/function-impl/mogo-core-function-startup/.gitignore
vendored
Normal file
1
core/function-impl/mogo-core-function-startup/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/build
|
||||
@@ -21,12 +21,6 @@ android {
|
||||
arg("AROUTER_MODULE_NAME", project.getName())
|
||||
}
|
||||
}
|
||||
|
||||
javaCompileOptions {
|
||||
annotationProcessorOptions {
|
||||
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
@@ -48,25 +42,29 @@ dependencies {
|
||||
implementation rootProject.ext.dependencies.androidxccorektx
|
||||
implementation rootProject.ext.dependencies.androidxappcompat
|
||||
implementation rootProject.ext.dependencies.arouter
|
||||
implementation rootProject.ext.dependencies.rxandroid
|
||||
implementation project(path: ':foudations:mogo-commons')
|
||||
kapt rootProject.ext.dependencies.aroutercompiler
|
||||
|
||||
implementation rootProject.ext.dependencies.mogoami
|
||||
implementation rootProject.ext.dependencies.mogoaicloudtelematic
|
||||
|
||||
implementation rootProject.ext.dependencies.android_start_up
|
||||
implementation rootProject.ext.dependencies.mogocustommap
|
||||
implementation rootProject.ext.dependencies.thread_opt
|
||||
if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
|
||||
implementation rootProject.ext.dependencies.mogo_core_res
|
||||
implementation rootProject.ext.dependencies.mogo_core_data
|
||||
implementation rootProject.ext.dependencies.mogo_core_utils
|
||||
implementation rootProject.ext.dependencies.mogo_core_function_api
|
||||
implementation rootProject.ext.dependencies.mogo_core_function_call
|
||||
|
||||
implementation project(':libraries:mogo-adas')
|
||||
implementation rootProject.ext.dependencies.crashreport
|
||||
implementation rootProject.ext.dependencies.mogomap
|
||||
implementation rootProject.ext.dependencies.mogomapapi
|
||||
} else {
|
||||
implementation project(':core:mogo-core-res')
|
||||
implementation project(':core:mogo-core-data')
|
||||
implementation project(':core:mogo-core-utils')
|
||||
implementation project(':core:mogo-core-function-api')
|
||||
implementation project(':core:mogo-core-function-call')
|
||||
|
||||
implementation project(':libraries:mogo-adas')
|
||||
implementation project(':foudations:mogo-commons')
|
||||
implementation project(":test:crashreport")
|
||||
implementation project(':libraries:mogo-map')
|
||||
implementation project(":libraries:mogo-map-api")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Automatically generated file. DO NOT MODIFY
|
||||
*/
|
||||
package com.mogo.eagle.core.function.startup;
|
||||
|
||||
public final class BuildConfig {
|
||||
public static final boolean DEBUG = Boolean.parseBoolean("true");
|
||||
public static final String LIBRARY_PACKAGE_NAME = "com.mogo.eagle.core.function.startup";
|
||||
/**
|
||||
* @deprecated APPLICATION_ID is misleading in libraries. For the library package name use LIBRARY_PACKAGE_NAME
|
||||
*/
|
||||
@Deprecated
|
||||
public static final String APPLICATION_ID = "com.mogo.eagle.core.function.startup";
|
||||
public static final String BUILD_TYPE = "debug";
|
||||
public static final String FLAVOR = "";
|
||||
public static final int VERSION_CODE = 1;
|
||||
public static final String VERSION_NAME = "";
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.alibaba.android.arouter.routes;
|
||||
|
||||
import com.alibaba.android.arouter.facade.enums.RouteType;
|
||||
import com.alibaba.android.arouter.facade.model.RouteMeta;
|
||||
import com.alibaba.android.arouter.facade.template.IRouteGroup;
|
||||
import com.mogo.eagle.core.function.startup.MogoStartUpProvider;
|
||||
import java.lang.Override;
|
||||
import java.lang.String;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */
|
||||
public class ARouter$$Group$$start_up implements IRouteGroup {
|
||||
@Override
|
||||
public void loadInto(Map<String, RouteMeta> atlas) {
|
||||
atlas.put("/start_up/api", RouteMeta.build(RouteType.PROVIDER, MogoStartUpProvider.class, "/start_up/api", "start_up", null, -1, -2147483648));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.alibaba.android.arouter.routes;
|
||||
|
||||
import com.alibaba.android.arouter.facade.enums.RouteType;
|
||||
import com.alibaba.android.arouter.facade.model.RouteMeta;
|
||||
import com.alibaba.android.arouter.facade.template.IProviderGroup;
|
||||
import com.mogo.eagle.core.function.startup.MogoStartUpProvider;
|
||||
import java.lang.Override;
|
||||
import java.lang.String;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */
|
||||
public class ARouter$$Providers$$mogocorefunctionstartup implements IProviderGroup {
|
||||
@Override
|
||||
public void loadInto(Map<String, RouteMeta> providers) {
|
||||
providers.put("com.mogo.eagle.core.function.api.startup.IStartUpProvider", RouteMeta.build(RouteType.PROVIDER, MogoStartUpProvider.class, "/start_up/api", "start_up", null, -1, -2147483648));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.alibaba.android.arouter.routes;
|
||||
|
||||
import com.alibaba.android.arouter.facade.template.IRouteGroup;
|
||||
import com.alibaba.android.arouter.facade.template.IRouteRoot;
|
||||
import java.lang.Class;
|
||||
import java.lang.Override;
|
||||
import java.lang.String;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */
|
||||
public class ARouter$$Root$$mogocorefunctionstartup implements IRouteRoot {
|
||||
@Override
|
||||
public void loadInto(Map<String, Class<? extends IRouteGroup>> routes) {
|
||||
routes.put("start_up", ARouter$$Group$$start_up.class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.mogo.eagle.core.function.startup">
|
||||
<application>
|
||||
</application>
|
||||
</manifest>
|
||||
@@ -0,0 +1,89 @@
|
||||
package com.mogo.eagle.core.function.startup
|
||||
|
||||
import android.content.Context
|
||||
import com.alibaba.android.arouter.facade.annotation.Route
|
||||
import com.mogo.commons.debug.DebugConfig
|
||||
import com.mogo.eagle.core.data.constants.MogoServicePaths
|
||||
import com.mogo.eagle.core.function.api.startup.IStartUpProvider
|
||||
import com.mogo.eagle.core.function.startup.stageone.APMStartup
|
||||
import com.mogo.eagle.core.function.startup.stageone.HttpDnsStartUp
|
||||
import com.mogo.eagle.core.function.startup.stageone.ThreadOptStartup
|
||||
import com.mogo.eagle.core.function.startup.stagetwo.AutopilotStartUp
|
||||
import com.mogo.eagle.core.function.startup.stagetwo.DataCenterStartUp
|
||||
import com.mogo.eagle.core.function.startup.stagetwo.ObuStartUp
|
||||
import com.mogo.eagle.core.function.startup.stagetwo.V2XStartUp
|
||||
import com.rousetime.android_startup.StartupListener
|
||||
import com.rousetime.android_startup.StartupManager
|
||||
import com.rousetime.android_startup.model.CostTimesModel
|
||||
import com.rousetime.android_startup.model.LoggerLevel
|
||||
import com.rousetime.android_startup.model.StartupConfig
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
|
||||
@Route(path = MogoServicePaths.PATH_STARTUP_PROVIDER)
|
||||
class MogoStartUpProvider: IStartUpProvider {
|
||||
|
||||
private var context: Context? = null
|
||||
|
||||
override fun init(context: Context?) {
|
||||
this.context = context
|
||||
}
|
||||
|
||||
private val startupListener: StartupListener =
|
||||
object : StartupListener {
|
||||
override fun onCompleted(
|
||||
totalMainThreadCostTime: Long,
|
||||
costTimesModels: List<CostTimesModel>
|
||||
) {
|
||||
EventBus.getDefault().postSticky(costTimesModels)
|
||||
}
|
||||
}
|
||||
|
||||
override fun initStageOne() {
|
||||
var config: StartupConfig? = null
|
||||
config = if (DebugConfig.isDebug()) {
|
||||
StartupConfig.Builder()
|
||||
.setLoggerLevel(LoggerLevel.DEBUG)
|
||||
.setOpenStatistics(true)
|
||||
.setListener(startupListener)
|
||||
.build()
|
||||
} else {
|
||||
StartupConfig.Builder()
|
||||
.setLoggerLevel(LoggerLevel.NONE)
|
||||
.setOpenStatistics(false)
|
||||
.setAwaitTimeout(10000L)
|
||||
.setListener(startupListener)
|
||||
.build()
|
||||
}
|
||||
context?.let {
|
||||
StartupManager.Builder()
|
||||
.addStartup(HttpDnsStartUp())
|
||||
.addStartup(APMStartup())
|
||||
.addStartup(ThreadOptStartup())
|
||||
.setConfig(config)
|
||||
.build(it)
|
||||
.start()
|
||||
.await()
|
||||
}
|
||||
}
|
||||
|
||||
override fun initStageTwo() {
|
||||
var config: StartupConfig? = null
|
||||
if (DebugConfig.isDebug()) {
|
||||
config = StartupConfig.Builder()
|
||||
.setLoggerLevel(LoggerLevel.DEBUG)
|
||||
.setOpenStatistics(true)
|
||||
.build()
|
||||
}
|
||||
context?.let {
|
||||
StartupManager.Builder()
|
||||
.addStartup(DataCenterStartUp())
|
||||
.addStartup(AutopilotStartUp())
|
||||
.addStartup(ObuStartUp())
|
||||
.addStartup(V2XStartUp())
|
||||
.setConfig(config)
|
||||
.build(it)
|
||||
.start()
|
||||
.await()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,8 @@
|
||||
package com.mogo.launcher.stageone
|
||||
package com.mogo.eagle.core.function.startup.stageone
|
||||
|
||||
import android.content.Context
|
||||
import com.rousetime.android_startup.AndroidStartup
|
||||
import com.alibaba.android.arouter.launcher.ARouter
|
||||
import com.mogo.test.crashreport.upgrade.UpgradeReportConstants
|
||||
import com.mogo.test.crashreport.CrashReportConstants
|
||||
|
||||
class APMStartup : AndroidStartup<Boolean?>() {
|
||||
@@ -22,6 +21,6 @@ class APMStartup : AndroidStartup<Boolean?>() {
|
||||
}
|
||||
|
||||
override fun dependenciesByName(): List<String> {
|
||||
return listOf("com.mogo.launcher.stageone.ARouterStartUp","com.mogo.launcher.stageone.ConfigStartUp")
|
||||
return listOf("com.mogo.eagle.core.function.startup.stageone.ThreadOptStartup")
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.mogo.launcher.stageone
|
||||
package com.mogo.eagle.core.function.startup.stageone
|
||||
|
||||
import android.content.Context
|
||||
import com.mogo.aicloud.services.httpdns.HttpDnsConst
|
||||
@@ -34,6 +34,7 @@ import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener
|
||||
import com.mogo.eagle.core.function.call.analytics.AnalyticsManager
|
||||
import com.mogo.eagle.core.function.call.autopilot.*
|
||||
import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager
|
||||
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
|
||||
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
|
||||
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
|
||||
@@ -44,7 +45,6 @@ import com.mogo.eagle.core.utilcode.util.ProcessUtils
|
||||
import com.mogo.eagle.core.utilcode.util.ThreadPoolService
|
||||
import com.mogo.eagle.core.utilcode.util.TimeUtils
|
||||
import com.rousetime.android_startup.AndroidStartup
|
||||
import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager
|
||||
import com.zhjt.service.chain.ChainLog
|
||||
import com.zhjt.service.chain.TracingConstants.Endpoint.Companion.PAD
|
||||
import mogo.telematics.pad.MessagePad.GnssInfo
|
||||
@@ -73,17 +73,14 @@ class HttpDnsStartUp : AndroidStartup<Boolean>() {
|
||||
|
||||
override fun dependenciesByName(): List<String> {
|
||||
return listOf(
|
||||
"com.mogo.launcher.stageone.APMStartup"
|
||||
"com.mogo.eagle.core.function.startup.stageone.APMStartup"
|
||||
)
|
||||
}
|
||||
|
||||
override fun create(context: Context): Boolean {
|
||||
this.context = context
|
||||
// TODO 需要与,陈扶风,确认为啥要限制仅在主进程
|
||||
// if (ProcessUtils.isMainProcess(context)) {
|
||||
initGDLoc()
|
||||
initHttpDns()
|
||||
// }
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -146,7 +143,7 @@ class HttpDnsStartUp : AndroidStartup<Boolean>() {
|
||||
|
||||
clientConfig.iHttpDnsCurrentLocation = object : IHttpDnsCurrentLocation {
|
||||
override fun getCurrentLocation(): HttpDnsSimpleLocation {
|
||||
val envConfig = EnvChangeManager.getEnvConfig()
|
||||
val envConfig = CallerDevaToolsManager.getEnvConfig()
|
||||
if (envConfig != null) {
|
||||
return HttpDnsSimpleLocation(envConfig.cityCode, envConfig.lat, envConfig.lon)
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.mogo.launcher.stageone
|
||||
package com.mogo.eagle.core.function.startup.stageone
|
||||
|
||||
import com.mogo.launcher.BuildConfig
|
||||
import com.rousetime.android_startup.BuildConfig
|
||||
import com.rousetime.android_startup.StartupListener
|
||||
import com.rousetime.android_startup.model.CostTimesModel
|
||||
import com.rousetime.android_startup.model.LoggerLevel
|
||||
@@ -1,12 +1,9 @@
|
||||
package com.mogo.launcher.stageone
|
||||
package com.mogo.eagle.core.function.startup.stageone
|
||||
|
||||
import android.content.*
|
||||
import com.mogo.thread.ext.core.*
|
||||
import com.mogo.thread.ext.core.config.*
|
||||
import com.rousetime.android_startup.*
|
||||
import java.io.*
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import java.util.concurrent.TimeUnit.SECONDS
|
||||
|
||||
class ThreadOptStartup: AndroidStartup<Boolean>() {
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.mogo.eagle.core.function.startup.stagetwo
|
||||
|
||||
import android.content.Context
|
||||
import com.alibaba.android.arouter.launcher.ARouter
|
||||
import com.mogo.eagle.core.data.constants.MogoServicePaths
|
||||
import com.rousetime.android_startup.AndroidStartup
|
||||
|
||||
class AutopilotStartUp: AndroidStartup<Boolean>() {
|
||||
|
||||
override fun create(context: Context): Boolean? {
|
||||
ARouter.getInstance().build(MogoServicePaths.PATH_AUTO_PILOT).navigation()
|
||||
return true
|
||||
}
|
||||
|
||||
override fun callCreateOnMainThread(): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun waitOnMainThread(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun dependenciesByName(): List<String>? {
|
||||
val deps = arrayListOf<String>()
|
||||
deps.add("com.mogo.eagle.core.function.startup.stagetwo.DataCenterStartUp")
|
||||
return deps
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.mogo.eagle.core.function.startup.stagetwo
|
||||
|
||||
import android.content.Context
|
||||
import com.alibaba.android.arouter.launcher.ARouter
|
||||
import com.mogo.eagle.core.data.constants.MogoServicePaths
|
||||
import com.rousetime.android_startup.AndroidStartup
|
||||
|
||||
class DataCenterStartUp: AndroidStartup<Boolean>() {
|
||||
|
||||
override fun create(context: Context): Boolean? {
|
||||
ARouter.getInstance().build(MogoServicePaths.PATH_DATA_CENTER_MODULE).navigation()
|
||||
return true
|
||||
}
|
||||
|
||||
override fun callCreateOnMainThread(): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun waitOnMainThread(): Boolean {
|
||||
return true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.mogo.eagle.core.function.startup.stagetwo
|
||||
|
||||
import android.content.Context
|
||||
import com.alibaba.android.arouter.launcher.ARouter
|
||||
import com.mogo.eagle.core.data.constants.MogoServicePaths
|
||||
import com.rousetime.android_startup.AndroidStartup
|
||||
|
||||
class ObuStartUp: AndroidStartup<Boolean>() {
|
||||
|
||||
override fun create(context: Context): Boolean? {
|
||||
ARouter.getInstance().build(MogoServicePaths.PATH_V2X_OBU_MOGO).navigation()
|
||||
return true
|
||||
}
|
||||
|
||||
override fun callCreateOnMainThread(): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun waitOnMainThread(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun dependenciesByName(): List<String>? {
|
||||
val deps = arrayListOf<String>()
|
||||
deps.add("com.mogo.eagle.core.function.startup.stagetwo.DataCenterStartUp")
|
||||
return deps
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.mogo.eagle.core.function.startup.stagetwo
|
||||
|
||||
import android.content.Context
|
||||
import com.alibaba.android.arouter.launcher.ARouter
|
||||
import com.mogo.eagle.core.data.constants.MogoServicePaths
|
||||
import com.rousetime.android_startup.AndroidStartup
|
||||
|
||||
class V2XStartUp: AndroidStartup<Boolean>() {
|
||||
|
||||
override fun create(context: Context): Boolean? {
|
||||
ARouter.getInstance().build(MogoServicePaths.PATH_V2X_MODULE).navigation()
|
||||
return true
|
||||
}
|
||||
|
||||
override fun callCreateOnMainThread(): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun waitOnMainThread(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun dependenciesByName(): List<String>? {
|
||||
val deps = arrayListOf<String>()
|
||||
deps.add("com.mogo.eagle.core.function.startup.stagetwo.DataCenterStartUp")
|
||||
return deps
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
package com.mogo.eagle.core.data
|
||||
|
||||
data class EnvConfig(val cityCode: String, val netMode: Int, val lat: Double, val lon: Double)
|
||||
@@ -74,4 +74,10 @@ public class MogoServicePaths {
|
||||
|
||||
@Keep
|
||||
public static final String PATH_MSG_BOX_MODULE = "/msg_box/api";
|
||||
|
||||
@Keep
|
||||
public static final String PATH_STARTUP_PROVIDER = "/start_up/api";
|
||||
|
||||
@Keep
|
||||
public static final String PATH_DATA_CENTER_MODULE = "/data_center/api";
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.mogo.eagle.core.function.api.datacenter
|
||||
|
||||
import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider
|
||||
|
||||
interface IDataCenterProvider: IMoGoFunctionServerProvider {
|
||||
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import android.content.Context
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import com.alibaba.android.arouter.facade.template.IProvider
|
||||
import com.mogo.eagle.core.data.EnvConfig
|
||||
import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo
|
||||
import com.mogo.eagle.core.data.deva.chain.ChainLogParam
|
||||
import com.mogo.eagle.core.data.deva.scene.SceneModule
|
||||
@@ -157,4 +158,6 @@ interface IDevaToolsProvider : IProvider {
|
||||
* 查询app是否有更新
|
||||
*/
|
||||
fun queryAppUpgrade()
|
||||
|
||||
fun getEnvConfig(): EnvConfig?
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.mogo.eagle.core.function.api.startup
|
||||
|
||||
import com.alibaba.android.arouter.facade.template.IProvider
|
||||
|
||||
interface IStartUpProvider: IProvider {
|
||||
fun initStageOne()
|
||||
|
||||
fun initStageTwo()
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import com.mogo.eagle.core.data.EnvConfig
|
||||
import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig
|
||||
import com.mogo.eagle.core.data.constants.MogoServicePaths
|
||||
@@ -172,6 +173,10 @@ object CallerDevaToolsManager {
|
||||
devaToolsProviderApi?.syncConfig()
|
||||
}
|
||||
|
||||
fun getEnvConfig(): EnvConfig? {
|
||||
return devaToolsProviderApi?.getEnvConfig()
|
||||
}
|
||||
|
||||
fun modifyCarInfo(callBack: (ModifyBindingcarInfo) -> Unit){
|
||||
devaToolsProviderApi?.modifyCarInfo(callBack)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.mogo.eagle.core.function.call.startup
|
||||
|
||||
import com.mogo.eagle.core.data.constants.MogoServicePaths
|
||||
import com.mogo.eagle.core.function.api.startup.IStartUpProvider
|
||||
import com.mogo.eagle.core.function.call.base.CallerBase
|
||||
|
||||
object CallerStartUpManager {
|
||||
private val TAG = "CallerStartUpManager"
|
||||
|
||||
private val providerApi: IStartUpProvider?
|
||||
get() = CallerBase.getApiInstance(
|
||||
IStartUpProvider::class.java,
|
||||
MogoServicePaths.PATH_STARTUP_PROVIDER
|
||||
)
|
||||
|
||||
@JvmStatic
|
||||
fun initStageOne() {
|
||||
providerApi?.initStageOne()
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun initStageTwo() {
|
||||
providerApi?.initStageTwo()
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,7 @@ include ':core:function-impl:mogo-core-function-chat'
|
||||
include ':core:function-impl:mogo-core-function-biz'
|
||||
// 消息盒子、自研OBU业务
|
||||
include ':core:function-impl:mogo-core-function-datacenter'
|
||||
// 启动
|
||||
// 初始化
|
||||
include ':core:function-impl:mogo-core-function-startup'
|
||||
|
||||
// 模块
|
||||
|
||||
Reference in New Issue
Block a user