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

如何检测Roku应用崩溃并将崩溃日志同步至自有日志?

Roku应用崩溃日志自动上报到自有日志系统

一、全局错误捕获

Roku BrightScript提供全局错误拦截机制,应用因未捕获的运行时错误崩溃前,会触发onError函数。在主入口脚本(如main.brs)中定义该函数即可拦截崩溃事件:

function onError(errorMsg as string, errorCode as integer, stackTrace as string) as void
    collectAndReportCrashLog(errorMsg, errorCode, stackTrace)
    return true ' 返回true可屏蔽系统默认崩溃提示(可选)
end function

二、收集崩溃上下文数据

除错误本身信息外,建议补充设备、应用维度的上下文数据,便于后续问题排查:

function collectAndReportCrashLog(errorMsg as string, errorCode as integer, stackTrace as string) as void
    ' 收集设备基础信息
    deviceInfo = CreateObject("roDeviceInfo")
    deviceData = {
        model: deviceInfo.GetModel(),
        osVersion: deviceInfo.GetOSVersion(),
        deviceId: deviceInfo.GetDeviceId() ' 注意隐私合规,可按需取舍
    }

    ' 收集应用版本信息
    appCtx = GetApplication()
    appData = {
        appId: appCtx.id,
        appVersion: appCtx.version
    }

    ' 构造完整崩溃日志结构
    crashLog = {
        timestamp: CreateObject("roDateTime").ToISOString(),
        errorDetail: {
            message: errorMsg,
            code: errorCode,
            stackTrace: stackTrace
        },
        device: deviceData,
        application: appData
    }

    sendCrashLogToCustomSystem(crashLog)
end function

三、上报到自有日志系统

使用Roku的roUrlTransfer发送POST请求到你的日志接口,若担心崩溃时同步请求阻塞,可改用异步版本roAsyncUrlTransfer:

function sendCrashLogToCustomSystem(crashLog as object) as void
    apiUrl = "https://your-log-system.com/api/crash" ' 替换为你的实际接口地址
    jsonPayload = FormatJSON(crashLog)

    urlTransfer = CreateObject("roUrlTransfer")
    urlTransfer.SetURL(apiUrl)
    urlTransfer.AddHeader("Content-Type", "application/json")
    
    try
        response = urlTransfer.PostFromString(jsonPayload)
        print "Crash log reported successfully: " + response
    catch err
        print "Crash report failed: " + err.Message
        ' 可选:将失败日志缓存到本地,下次应用启动时重试上报
        saveCrashLogLocally(crashLog)
    end try
end function

' 可选:本地缓存失败的崩溃日志
function saveCrashLogLocally(crashLog as object) as void
    fs = CreateObject("roFileSystem")
    logFileName = "tmp:/crash_" + Str(CreateObject("roDateTime").ToUnixTimestamp()) + ".json"
    fs.WriteFile(logFileName, FormatJSON(crashLog))
end function

四、关键注意事项

  • 必须在应用manifest文件中添加网络权限:network-access=true
  • 崩溃场景下避免执行复杂IO或计算操作,防止引发二次崩溃
  • 若使用异步上报,需确保应用退出前请求能完成,或依赖下次启动重试逻辑
  • 遵循隐私合规要求,不收集不必要的用户敏感数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.05 10:12:32