package com.example.your_project_name
import android.app.Application
import android.content.Context
import com.apm.insight.MonitorCrash
import com.bytedance.apm.insight.ApmInsight
import com.bytedance.apm.insight.ApmInsightAgent
import com.bytedance.apm.insight.ApmInsightInitConfig
import com.bytedance.apm.insight.IDynamicParams
import com.apm.insight.log.VLog
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import org.json.JSONObject
class APMPlusFlutterBridgePlugin : FlutterPlugin, MethodChannel.MethodCallHandler {
private lateinit var channel: MethodChannel
private lateinit var context: Context
private lateinit var mMonitorCrash: MonitorCrash
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "apmplus_flutter_bridge")
channel.setMethodCallHandler(this)
context = flutterPluginBinding.applicationContext
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
val config = call.arguments as? Map<String, Any> ?: return
val userId = (call.arguments as? Map<String, Any>)?.get("userId") as? String
mMonitorCrash?.config()?.setUID(userId)
"reportCustomError" -> {
val args = call.arguments as? Map<String, Any>
"reportCustomEvent" -> {
val args = call.arguments as? Map<String, Any>
val args = call.arguments as? Map<String, Any>
else -> result.notImplemented()
private fun initializeApm(config: Map<String, Any>) {
val appID = config["appID"] as? String ?: return
val appToken = config["appToken"] as? String ?: return
val channel = config["channel"] as? String ?: "unknown"
val enableDebug = config["enableDebug"] as? Boolean ?: false
val crashConfig = MonitorCrash.Config.app(appID)
mMonitorCrash = MonitorCrash.init(context as? Application, crashConfig)
ApmInsight.getInstance().init(context as? Application)
val builder = ApmInsightInitConfig.builder()
.blockDetect(config["blockDetect"] as? Boolean ?: false)
.seriousBlockDetect(config["seriousBlockDetect"] as? Boolean ?: false)
.fpsMonitor(config["fpsMonitor"] as? Boolean ?: false)
.memoryMonitor(config["memoryMonitor"] as? Boolean ?: false)
.batteryMonitor(config["batteryMonitor"] as? Boolean ?: false)
.cpuMonitor(config["cpuMonitor"] as? Boolean ?: false)
.diskMonitor(config["diskMonitor"] as? Boolean ?: false)
.trafficMonitor(config["trafficMonitor"] as? Boolean ?: false)
.operateMonitor(config["operateMonitor"] as? Boolean ?: false)
.startMonitor(config["startMonitor"] as? Boolean ?: false)
.pageMonitor(config["pageMonitor"] as? Boolean ?: false)
.netMonitor(config["netMonitor"] as? Boolean ?: false)
.enableLogRecovery(config["enableLogRecovery"] as? Boolean ?: false)
ApmInsight.getInstance().start(builder.build())
private fun reportCustomError(args: Map<String, Any>?) {
if (args == null) return
val type = args["type"] as? String ?: "unknown_error"
val message = args["message"] as? String ?: ""
val stack = args["stack"] as? String
val severity = args["severity"] as? String ?: "error"
val tags = args["tags"] as? Map<String, String> ?: emptyMap()
val extrasAny = args["extras"] as? Map<String, Any> ?: emptyMap()
val data = mutableMapOf<String, String>()
data["severity"] = severity
extrasAny.forEach { (k, v) ->
if (v != null) data[k] = v.toString()
val throwable: Throwable? = if (!stack.isNullOrBlank()) RuntimeException(stack) else null
mMonitorCrash?.reportCustomErr(message, type, throwable, data)
private fun reportCustomEvent(args: Map<String, Any>?) {
if (args == null) return
val eventName = args["eventName"] as? String ?: return
val attributes = args["attributes"] as? Map<String, String>
val metrics = args["metrics"] as? Map<String, Double>
ApmInsightAgent.monitorEvent("event1", dimension, metric);
private fun log(args: Map<String, Any>?) {
if (args == null) return
val level = args["level"] as? String ?: "info"
val tag = args["tag"] as? String ?: "FlutterLog"
val message = args["message"] as? String ?: ""
"debug" -> VLog.d(tag, message)
"info" -> VLog.i(tag, message)
"warn" -> VLog.w(tag, message)
"error" -> VLog.e(tag, message)
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)