[3.4.0][Block] 主线程卡顿检测
This commit is contained in:
@@ -98,6 +98,7 @@ dependencies {
|
||||
implementation group: "com.tencent.matrix", name: "matrix-hooks", version: MATRIX_VERSION, changing: true
|
||||
implementation rootProject.ext.dependencies.weak_network
|
||||
// implementation rootProject.ext.dependencies.btrace
|
||||
api rootProject.ext.dependencies.block_detector
|
||||
|
||||
implementation project(':foudations:mogo-commons')
|
||||
implementation project(':core:mogo-core-utils')
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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>>) {}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user