[3.4.0][Block] 主线程卡顿检测

This commit is contained in:
renwj
2023-07-25 16:34:23 +08:00
parent c52d83596e
commit f7afd759e8
15 changed files with 748 additions and 3 deletions

View File

@@ -18,6 +18,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.block.*
import com.mogo.eagle.core.function.api.devatools.strict.*
import com.mogo.eagle.core.function.api.devatools.download.*
import com.mogo.eagle.core.function.api.devatools.logcat.*
@@ -40,6 +41,7 @@ import com.mogo.weak.network.SdtManager
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import com.zhjt.mogo_core_function_devatools.binding.*
import com.zhjt.mogo_core_function_devatools.block.*
import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager
import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter
import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigImpl
@@ -83,6 +85,8 @@ class DevaToolsProvider : IDevaToolsProvider {
private val logRecordProvider by lazy { MoGoLogRecordProviderImpl() }
private val block by lazy { MoGoBlockProviderImpl() }
@Volatile
private var mDockerVersion: String? = null
@@ -122,6 +126,11 @@ class DevaToolsProvider : IDevaToolsProvider {
logRecordProvider.init(it)
logRecordProvider.start()
}
mContext?.also {
block.init(it)
block.start()
}
}
override fun checkMonitorDb() {
@@ -377,4 +386,6 @@ class DevaToolsProvider : IDevaToolsProvider {
override fun mofang(): IMoGoMoFangProvider = mofangProvider
override fun logRecord(): IMoGoLogRecordProvider = logRecordProvider
override fun block(): IMoGoBlockProvider = block
}

View File

@@ -0,0 +1,23 @@
package com.zhjt.mogo_core_function_devatools.block
import com.mogo.eagle.core.data.deva.chain.*
import com.zhjt.service.chain.*
internal class MainBlockLinkedLog {
fun record(extra: Map<String, List<String>>) {
try {
recordInternal(extra)
} catch (t: Throwable) {
t.printStackTrace()
}
}
@ChainLog(
linkChainLog = ChainConstant.CHAIN_TYPE_HMI,
linkCode = ChainConstant.CHAIN_SOURCE_HMI,
nodeAliasCode = ChainConstant.CHAIN_CODE_MAIN_BLOCK,
paramIndexes = [0]
)
private fun recordInternal(extra: Map<String, List<String>>) {}
}

View File

@@ -0,0 +1,87 @@
package com.zhjt.mogo_core_function_devatools.block
import android.content.*
import android.util.*
import android.view.*
import androidx.metrics.performance.*
import com.mogo.eagle.core.block.runtime.*
import com.mogo.eagle.core.block.runtime.config.*
import com.mogo.eagle.core.block.runtime.config.recorder.*
import com.mogo.eagle.core.block.runtime.config.recorder.IMessageRecorder.OnDumpListener
import com.mogo.eagle.core.block.runtime.listener.*
import com.mogo.eagle.core.block.runtime.report.*
import com.mogo.eagle.core.function.api.devatools.block.*
import java.util.concurrent.TimeUnit.SECONDS
internal class MoGoBlockProviderImpl: IMoGoBlockProvider, IBlockListener {
@Volatile
private var hasInit = false
private val linkedLog by lazy { MainBlockLinkedLog() }
override fun init(ctx: Context) {
BlockDetector.init(BlockMetrics.Builder()
.context(ctx)
.multiplier(2.0f)
.isDebug(false)
.period(5, SECONDS)
.junkRateThreshold(0.8f)
.recorder(null, 1000, 512)
.build())
hasInit = true
}
override fun hasInit(): Boolean {
return hasInit
}
override fun start() {
BlockDetector.start()
BlockDetector.addListener(this)
}
override fun onBlockReport(info: ReportInfo) {
Log.d("BLOCK", "--- onBlockReport ---: ${info.frames.size}")
val map = mutableMapOf<String, List<String>>()
map["frames"] = info.frames.map { "$it" }
BlockDetector.recorder().dump(object: OnDumpListener {
override fun OnDumped(data: Map<Int, List<String>>) {
map["history"] = data[0] ?: emptyList()
map["pending"] = data[1] ?: emptyList()
linkedLog.record(map)
}
})
}
override fun monitor(window: Window) {
BlockDetector.monitor(window)
}
override fun pause(window: Window) {
BlockDetector.pause(window)
}
override fun addState(window: Window, key: String, status: String) {
val holder = PerformanceMetricsState.getHolderForHierarchy(window.decorView)
holder.state?.putState(key, status)
}
override fun resume(window: Window) {
BlockDetector.resume(window)
}
override fun pop(window: Window) {
BlockDetector.pop(window)
}
override fun stop() {
BlockDetector.removeListener(this)
BlockDetector.stop()
}
override fun recorder(): IMessageRecorder {
return BlockDetector.recorder()
}
}