You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter安卓构建中获取冷启动指标并采集TTID、TTFD数据

Flutter安卓端TTID/TTFD指标测量&上报实操方案

一、TTFD自定义追踪的实用思路

  • Flutter层快速埋点:在main()函数第一行记录起始时间戳,通过WidgetsBinding.instance.addPostFrameCallback监听第一帧渲染完成的时机,两者差值即为TTFD。
  • 原生+Flutter全链路追踪:在安卓Application类的onCreate方法中记录进程启动时间,通过MethodChannel传递到Flutter层,再和Flutter第一帧时间计算差值,覆盖从原生启动到Flutter渲染的完整流程。
  • 区分冷/热启动场景:追踪时标记清楚启动类型,避免热启动的偏小数值干扰整体性能数据。

二、TTID的代码内获取与上报

你通过Logcat的displayed标签查看TTID的思路完全正确,要在代码中获取该值并上报仪表盘,可通过以下安卓原生+Flutter联动的方案实现:

方案1:监听首次绘制回调(与Logcat displayed值逻辑一致)

在安卓MainActivity中监听窗口首次绘制完成的时机,计算进程启动到绘制完成的时间差,再传递给Flutter层上报:

// 安卓原生MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 记录进程启动时间
    val processStartTime = System.currentTimeMillis()
    window.decorView.viewTreeObserver.addOnDrawListener(object : ViewTreeObserver.OnDrawListener {
        override fun onDraw() {
            // 移除监听器避免重复触发
            window.decorView.viewTreeObserver.removeOnDrawListener(this)
            val ttid = System.currentTimeMillis() - processStartTime
            // 通过MethodChannel将TTID传递给Flutter
            MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "ttid_channel").invokeMethod("sendTtid", ttid)
        }
    })
}

Flutter层接收并上报:

// Flutter代码
final MethodChannel _ttidChannel = MethodChannel('ttid_channel');

@override
void initState() {
    super.initState();
    _ttidChannel.setMethodCallHandler((call) async {
        if (call.method == 'sendTtid') {
            int ttid = call.arguments as int;
            // 执行上报到仪表盘的逻辑,示例为HTTP请求框架
            _sendToDashboard('ttid', ttid);
        }
    });
}

void _sendToDashboard(String metric, int value) {
    // 替换为你的仪表盘接口请求逻辑
    // http.post(Uri.parse('你的仪表盘地址'), body: {'metric': metric, 'value': value});
}

方案2:读取Logcat捕获displayed日志

如果需要完全对齐Logcat的输出结果,可以在安卓原生开启后台线程读取Logcat,过滤包含Displayed的日志行并解析耗时,再传递给Flutter。此方案需要申请READ_LOGS权限,不如方案1简洁高效。

三、注意事项

  • 测试需用冷启动:杀死应用进程后再启动,热启动的TTID/TTFD数值偏小,无法反映真实首次启动性能。
  • 上报附带维度信息:建议同时上报设备型号、安卓版本、Flutter版本等数据,方便后续分析不同场景下的性能差异。
  • TTFD结束节点按需选择:若关注业务页面渲染完成时间,可将结束时间点放在首屏页面的initState执行完成后,而非Flutter框架的第一帧。

内容的提问来源于stack exchange,提问作者hrishikesh rajwade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:33:43