KwaiAppTeam / KOOM

KOOM is an OOM killer on mobile platform by Kwai.
Other
3.19k stars 424 forks source link

偶现 kotlin.UninitializedPropertyAccessException: lateinit property commonConfig has not been initialized #219

Closed GJA-pun closed 1 year ago

GJA-pun commented 1 year ago

请问一下大佬,该报错需要如何处理。 该问题是偶现的,有时候能正常解析完成hprof。有时候会因为一下报错导致无法成功解析

FATAL EXCEPTION: IntentService[HeapAnalysisService] Process: com.mytest.test:heap_analysis, PID: 9490 kotlin.UninitializedPropertyAccessException: lateinit property commonConfig has not been initialized at com.kwai.koom.base.MonitorManager.getCommonConfig$koom_monitor_base_SharedCppRelease(MonitorManager.kt:33) at com.kwai.koom.base.MonitorBuildConfig$VERSION_NAME$2.invoke(MonitorBuildConfig.kt:29) at com.kwai.koom.base.MonitorBuildConfig$VERSION_NAME$2.invoke(MonitorBuildConfig.kt:23) at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74) at com.kwai.koom.base.MonitorBuildConfig.getVERSION_NAME(Unknown Source:2) at com.kwai.koom.javaoom.monitor.OOMFileManager.init(OOMFileManager.kt:65) at com.kwai.koom.javaoom.monitor.analysis.HeapAnalysisService.onHandleIntent(HeapAnalysisService.kt:190) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:77) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:236) at android.os.HandlerThread.run(HandlerThread.java:67)

我也已经在Application onCreate中与Demo一样进行初始化MonitorManager

val config = CommonConfig.Builder() .setApplication(application) // Set application .setVersionNameInvoker { "1.0.0" } // Set version name, java leak feature use it .setSdkVersionMatch( Build.VERSION.SDK_INT <= Build.VERSION_CODES.S && Build.VERSION.SDK_INT

= Build.VERSION_CODES.LOLLIPOP ) // Set if current sdk version is supported .build() MonitorManager.initCommonConfig(config).apply { onApplicationCreate() }

看其他反馈的问题说是HeapAnalysisService在子线程未初始化然后执行startLoop导致。那么请问有提供MonitorManager初始化结果回调吗?因为我无法知道我应该什么时候startLoop,因为HeapAnalysisService的初始化是异步的

GJA-pun commented 1 year ago

我找到原因了,是因为创建HeapAnalysisService的进程的时候会重新走Application的onCreate方法。但是我自己限制了只会在主线程中初始化MonitorManager。导致HeapAnalysisService无法顺利完成初始化

以下是我的错误代码: boolean isMainProcess = isMainProcess(this); if (isMainProcess) { initKoom(); }