diff --git a/config.gradle b/config.gradle index 4bedccbba8..0341f9f4a2 100644 --- a/config.gradle +++ b/config.gradle @@ -244,7 +244,11 @@ ext { //========================= Shizuku ====================== shizuku_api : "dev.rikka.shizuku:api:12.1.0", - shizuku_provider : "dev.rikka.shizuku:provider:12.1.0" + shizuku_provider : "dev.rikka.shizuku:provider:12.1.0", + + //========================= Koom ====================== + koomnative : "com.kuaishou.koom:koom-native-leak-static:2.2.0", + koomxhook : "com.kuaishou.koom:xhook-static:2.2.0" ] } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt index 824290a98d..5d38abba20 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt @@ -59,6 +59,10 @@ class TraceManager : IMoGoCloudListener { FwBuild(false, 30, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_PLANNING_OBJECTS) fwBuildMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_PLANNING_ACTIONS) + fwBuildMap[ChainConstant.CHAIN_LINK_LOG_NATIVE_LEAK] = + FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_RECORD_NATIVE_LEAK) + + traceInfoCache[ChainConstant.CHAIN_LINK_LOG_CONNECT_STATUS] = ChainLogParam(true, "ADAS连接状态") @@ -78,6 +82,8 @@ class TraceManager : IMoGoCloudListener { ChainLogParam(false, "ADAS PLANNING 感知障碍物") traceInfoCache[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS] = ChainLogParam(true, "ADAS PLANNING 决策行为") + traceInfoCache[ChainConstant.CHAIN_LINK_LOG_NATIVE_LEAK] = + ChainLogParam(true, "Native Leak Record") FileWriteManager.getInstance() .init(context, MoGoAiCloudClientConfig.getInstance().sn, pkgName, fwBuildMap) diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle index 9822314159..9f40e36205 100644 --- a/core/function-impl/mogo-core-function-hmi/build.gradle +++ b/core/function-impl/mogo-core-function-hmi/build.gradle @@ -75,6 +75,8 @@ dependencies { implementation rootProject.ext.dependencies.android_start_up implementation rootProject.ext.dependencies.cicle_indicator + implementation rootProject.ext.dependencies.koomnative + implementation rootProject.ext.dependencies.koomxhook if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { api rootProject.ext.dependencies.mogoaicloudservicesdk api rootProject.ext.dependencies.mogocommons diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java index 5fabab1775..ba48df44ff 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java @@ -1,5 +1,8 @@ package com.mogo.eagle.core.function.main; +import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_ALIAS_CODE_RECORD_NATIVE_LEAK; +import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LEAK; +import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LOG_NATIVE_LEAK; import static com.mogo.eagle.core.function.main.MainPresenter.MOGO_PERMISSION_REQUEST_CODE; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI; @@ -19,6 +22,10 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.alibaba.android.arouter.launcher.ARouter; +import com.kwai.koom.base.MonitorManager; +import com.kwai.koom.nativeoom.leakmonitor.LeakMonitor; +import com.kwai.koom.nativeoom.leakmonitor.LeakMonitorConfig; +import com.kwai.koom.nativeoom.leakmonitor.LeakRecord; import com.mogo.cloud.commons.BuildConfig; import com.mogo.commons.context.ContextHolderUtil; import com.mogo.commons.mvp.BaseFragment; @@ -54,6 +61,8 @@ import com.mogo.service.statusmanager.IMogoStatusManager; import com.rousetime.android_startup.StartupManager; import com.rousetime.android_startup.model.LoggerLevel; import com.rousetime.android_startup.model.StartupConfig; +import com.zhjt.service.chain.ChainLog; +import com.zhjt.service.chain.TracingConstants; import java.util.ArrayList; import java.util.HashMap; @@ -274,6 +283,8 @@ public class MainActivity extends MvpActivity implement // 启动一些基本的服务:定位等 startBaseService(); + // 启动Native内存泄漏监测 + startLeakMonitor(); } /** @@ -288,6 +299,38 @@ public class MainActivity extends MvpActivity implement // startService(intentCarcorderService); } + private void startLeakMonitor() { + LeakMonitorConfig leakMonitorConfig = new LeakMonitorConfig.Builder() + .setLoopInterval(50000) + .setMonitorThreshold(16) + .setNativeHeapAllocatedThreshold(0) + .setEnableLocalSymbolic(true) + .setLeakListener(leaks -> { + StringBuilder stringBuilder = new StringBuilder(); + if (!leaks.isEmpty()) { + for (LeakRecord leakRecord : leaks) { + stringBuilder.append(leakRecord.toString()); + } + printLeakMsg(stringBuilder.toString()); + } + }) + .build(); + MonitorManager.addMonitorConfig(leakMonitorConfig); + LeakMonitor.INSTANCE.start(); + } + + @ChainLog( + linkChainLog = CHAIN_LINK_LOG_NATIVE_LEAK, + linkCode = CHAIN_LINK_LEAK, + endpoint = TracingConstants.Endpoint.PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_RECORD_NATIVE_LEAK, + paramIndexes = {0}, + clientPkFileName = "sn" + ) + private void printLeakMsg(String leakRecord) { + CallerLogger.INSTANCE.d(M_HMI + TAG, "内存泄漏日志如下:\n" + leakRecord); + } + @Override public void hideCoverUpLayout() { mConnectInfoRV.setVisibility(View.GONE); @@ -388,7 +431,8 @@ public class MainActivity extends MvpActivity implement } @Override - public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) { } + public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) { + } @Override public void onAutopilotSNRequest() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java index fb1ee3827d..abe6e87ea1 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java @@ -7,7 +7,7 @@ import android.os.Process; import com.bytedance.boost_multidex.BoostMultiDex; import com.elegant.utils.UiThreadHandler; -import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.kwai.koom.base.DefaultInitTask; import com.mogo.cloud.socket.SocketBuildConfig; import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.data.config.FunctionBuildConfig; @@ -41,8 +41,6 @@ import java.util.List; public abstract class MainMoGoApplication extends AbsMogoApplication { private static final String TAG = "MogoApplication"; - // 配置云服务API - protected MoGoAiCloudClientConfig clientConfig = MoGoAiCloudClientConfig.getInstance(); private long start; @Override @@ -60,6 +58,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { initTipToast(); initModules(); + initKoom(); //查询是否有版本的更新 queryAppUpgrade(); checkMonitorDb(); @@ -92,6 +91,10 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { }).start(); } + private void initKoom() { + DefaultInitTask.INSTANCE.init(this); + } + /** * 初始化异常采集配置 */ diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt index 2c5377b5b0..bf710b77f2 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt @@ -10,6 +10,8 @@ class ChainConstant { const val CHAIN_LINK_ADAS = 1 // 鹰眼初始化流程顺序相关 const val CHAIN_LINK_INIT = 2 + // Native内存泄漏 + const val CHAIN_LINK_LEAK = 10 const val CHAIN_LINK_LOG_CONNECT_STATUS = 0 const val CHAIN_LINK_LOG_WEB_SOCKET_GNSSINFO = 1 @@ -20,6 +22,7 @@ class ChainConstant { const val CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT = 6 const val CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS = 7 const val CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS = 8 + const val CHAIN_LINK_LOG_NATIVE_LEAK = 100 const val CHAIN_LINK_LOG_ADAS_INIT = "-eagleInitStatus" const val CHAIN_LINK_LOG_ADAS_GNSS = "-adasWsGnssInfo" @@ -30,6 +33,7 @@ class ChainConstant { const val CHAIN_LINK_LOG_ADAS_TRAFFIC_LIGHT = "-adasWsTrafficLight" const val CHAIN_LINK_LOG_ADAS_PLANNING_OBJECTS = "-adasWsPlanningObj" const val CHAIN_LINK_LOG_ADAS_PLANNING_ACTIONS = "-adasWsPlanningActions" + const val CHAIN_LINK_LOG_RECORD_NATIVE_LEAK = "-eagleRecordNativeLeak" const val CHAIN_ALIAS_CODE_MULTI_CONNECT = "CHAIN_ALIAS_CODE_MULTI_CONNECT" const val CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_CONFIG = "CHAIN_ALIAS_CODE_CAR_CONFIG" @@ -48,6 +52,8 @@ class ChainConstant { const val CHAIN_ALIAS_CODE_ADAS_STATUS_QUERY_RESP = "CHAIN_ALIAS_CODE_ADAS_STATUS_QUERY_RESP" const val CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_WARN = "PAD_ADAS_MESSAGE_AUTOPILOT_WARN" + const val CHAIN_ALIAS_CODE_RECORD_NATIVE_LEAK = "CHAIN_ALIAS_CODE_RECORD_NATIVE_LEAK" + const val CHAIN_ALIAS_CODE_CLOUD_CONNECT_FAIL = "CHAIN_ALIAS_CODE_CLOUD_CONNECT_FAIL" const val CHAIN_ALIAS_CODE_CLOUD_CONNECT_SUCCESS = "CHAIN_ALIAS_CODE_CLOUD_CONNECT_SUCCESS" const val CHAIN_ALIAS_CODE_CLOUD_CONNECT_LOST = "CHAIN_ALIAS_CODE_CLOUD_CONNECT_LOST"