cocosCreator 3.6以上接入腾迅Bugly 捕捉JS错误 Android

news2024/11/28 5:05:33

cocosCreator3.6以上接入Bugly上报其实很简单,不需要网上那么多弯弯绕,三须三步走。

1. 按照官网方式接入android的bugly

2. android端写一个Bugly上报管理类

3. 修改你工程目录下native\engine\common\Classes\目录下的Game.h, Game.cpp两个文件,加上handleException方法。

不需要修改游戏引擎。网上广泛传播的在ts/js代码层游戏开始时监听 window.console.error = function() {}方法实测在网页端有效,在android上没用,这个方法返回个arguments参数,网页端有错误时取arguments[0]就得到详细的Error信息,包括行号列号,错误message和详细stack, 可惜在android端没用,监听不到javascript空指针错误或者其他error错误,只能监听到websocket is error这样无关紧要的信息,这我要你有何用啊!比如我手写一个空结点,let ndMouse:Node = this.ndRoot.getChildbyName("mouse"); ndMouse.active = false;  这个mouse是没有的,运行时我让它故意报错,结果window.console.error居然捕捉不到,网页端却能正常捕捉,真的无语。

具体方法:

1. 按官网方法接入android层面的bugly ,这个官网有详细说明,用gradle方式安装,非常简单,是个人都会。

2. 在安卓端写个BuglyAgent类,方便简单起见写在跟AppActivity一个包里,即 com.cocos.game,如下图:

具体代码如下:

package com.cocos.game;

import android.content.Context;
import android.util.Log;


import java.util.Map;

import com.tencent.bugly.crashreport.CrashReport;

public class BuglyAgent {

    public static void initSDK(Context context, String appId) {
        CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(context);
        strategy.setAppPackageName(context.getPackageName());
        strategy.setAppVersion("1.0.1");

        CrashReport.initCrashReport(context, appId, true, strategy);
    }

    public static void postException(int category, String name, String reason, String stack, Map<String, String> extraInfo) {
        Log.d("BuglyAgent", "reason:" + reason);
        CrashReport.postException(category, name, reason, stack, extraInfo);
    }

    public static void postException(int category, String name, String reason, String stack) {
        CrashReport.postException(category, name, reason, stack, null);
    }

}

 这个类很简单,只包括了初始化initSDK方法和上报postException方法,为什么要加上报方法呢,因为bugly不给力啊,不能上报js/ts层面错误 ,只能我们自己监听了。

然后我们可以在AppActivity类里的onCreate方法你觉得合适的地方初始化了,如我写的代码:

这样android层的就做完了,我们剩下的工作就是修改工程里的game.cpp函数,监听报错。

为了不污染游戏引擎代码(就是你的cocosCreator安装目录下resources/resources/3d/engine下的代码),cocos贴心地在你的工程的根目录有个native文件夹, 即工程目录下 native\engine\common\Classes,有两个文件Game.cpp和Game.h,在这里修改

3.修改Game.cpp和Game.h代码

你会发现这两个文件里是没有handleException方法的,这该怎么办呢,你仔细看Game.h, class Game : public cc::BaseGame 它是继承于cc.BaseGame, 这个BaseGame源代码文件在resources\resources\3d\engine\native\cocos\application下,你打开会发现它又继承于CocosApplication类,即当前目录下的CocosApplication.h, 再打开CocosApplication.h你就会发现这个CocosApplication类里有handleException方法的,那就好办了,直接把这个方法声明和实现抄过去,别忘加个override, Game.h如下:

#pragma once

#include "cocos/cocos.h"

/**
 @brief    The cocos2d Application.
 
 The reason for implement as private inheritance is to hide some interface call by Director.
 */
class Game : public cc::BaseGame {
public:
    Game();
    int init() override;
    //bool init() override;
    void onPause() override;
    void onResume() override;
    void onClose() override;
	void handleException(const char* location, const char* message, const char* stack) override;
};

然后修改Game.cpp
首先加个头文件声明 #include "platform/java/jni/JniHelper.h",你也可以严谨点,这样写

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <cocos/platform/java/jni/JniHelper.h>
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include "CrashReport.h"
#endif
然后在下面实现handleException方法,注意这里我们在C++层调用了android层的Java方法
 

void Game::handleException(const char *location, const char *message, const char *stack) {
    // Send exception information to server like Tencent Bugly.
    CC_LOG_ERROR("\nUncaught Exception:\n - location :  %s\n - msg : %s\n - detail : \n      %s\n", location, message, stack);
#if (CC_PLATFORM == CC_PLATFORM_ANDROID)
    /**
     * 5是JS错误的标志,Bugly定义的,参考com.tencent.bugly.BuglyStrategy。
     * JSError: 错误的名字,自定义是可以的,Bugly是这么定义的。
     * message: 错误的原因
     * stack: 错误的堆栈
     */
    cc::JniHelper::callStaticVoidMethod("com/cocos/game/BuglyAgent", "postException", 5, "JSError", message, stack);
#elif(CC_PLATFORM == CC_PLATFORM_IOS)
    CrashReport::reportException(message, stack);
#endif
}

这里我们只考虑Android不考虑IOS哈,其实到这一步基本工作都已经完成,这时我们兴冲冲的插上手机,连上Android Studio, 开始调试,注意C++代码在Android Studio也是可以下断点调试的,可是这C++代码怎么在Android Studio里打开呢,很简单你用别的编辑器如Notepad++在你想调试的C++代码里故意乱写一个语法错误,随便乱写个字符都行,然后Android Studio直接点调试按钮就行了,编译不过AS就会报错会在下面Build那一栏显示出哪个C++文件报错了,在那里把它点开就行了。

可是我们在这个Game::handleException下断点启动手机调试时会发现游戏出错时这个方法根本进不去,那大家是不是我又在欺骗大家感情呢?其实我们又错了,进入这个方法的条件是在release模式下打包才能进,Debug模式是进不了这个方法的,好啦,我们用release打包,安装在手机上调试,果然不出所料,上报bugly成功了,还有具体的堆栈和行号呢,连符号表都不用上传了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/769319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

发电厂主厂房智能照明控制系统的设计和应用

摘要&#xff1a;当前&#xff0c;电厂主厂房的照明规模较大&#xff0c;而且具有许多回路&#xff0c;增加了电厂照明负荷&#xff0c;导致照明过程中的能源消耗较高。对此&#xff0c;电厂需要合理设计智能照明系统&#xff0c;运用智能技术提高电厂照明的运行管理水平&#…

如何在化工行业运用IPD?

化工行业作为国民经济的重要基础性行业&#xff0c;包含数以万计的产品种类&#xff0c;各具有不同的物理化学特性。化工产品的消费同国民经济状况联系非常紧密&#xff0c;主要去向广泛分布于基建、房地产、农业、汽车、服装等国民经济各个领域。按应用领域划分&#xff0c;典…

PCA与SVD

PCA流程&#xff1a; 当数据维度大时&#xff0c;构建协方差矩阵并求其特征值、特征向量会导致计算量大。所以可以利用SVD求解。 PCA算法的优化目标就是: ①降维后同一维度的方差最大。 ②不同维度之间的相关性为0。 根据线性代数&#xff0c;我们可以知道同一元素的协方差就…

Django项目开发快速入门

Django项目开发快速入门 生成Django项目编写module后台管理系统admin自定义管理页面视图函数使用Django模板 生成Django项目 现在cmd中使用命令安装Django框架 pip install django3.2使用命令生成项目 django-admin startproject DjStore使用命令生成应用 python .\manage.…

管道模型--Asp.Net MVC篇 Http请求

管道模型–Asp.Net MVC篇 Http请求 我们自己写的程序,是怎样进行处理的?一个完整的HTTP请求流程: 一. 请求大致流程 拿一个实例了解整个流程的步骤: 用户浏览器输入地址 例如 http://www.csdn.net DNS解析(域名供应商) 将输入的网址解析成IP+端口 请求到达服务器Server I…

ChatGPT的应用场景和局限性,以及发展前景

目录 导语 ChatGPT的应用场景 ChatGPT的局限性 ChatGPT的发展前景 总结 导语 作为一款基于人工智能的自然语言处理(NLP)​​聊天机器人​​程序&#xff0c;ChatGPT通过大量来自互联网的文本进行训练&#xff0c;并使用深度学习和机器学习算法来理解用户的问题并提供回答。…

[RocketMQ] Broker CommitLogDispatcher 异步构建ConsumeQueue和IndexFile源码解析 (十四)

CommitLogDispatcherBuildConsumeQueue: 异步构建ConsumerQueue。CommitLogDispatcherBuildIndex: 异步构建IndexFile。 文章目录 1.CommitLogDispatcherBuildConsumeQueue构建ConsumeQueue1.1 putMessagePositionInfo写入消息位置信息1.2 findConsumeQueue查找ConsumeQueue1.2…

Windows Docker部署springboot微服务

Windows Docker部署springboot微服务 前言 偶然的机会让我能够实操在Windows server 2019版本的服务器上进行springCloud服务的部署 过程中深刻的体会到了为什么Docker要推荐使用Linux系列的系统进行操作 遇到的问题 springboot镜像打包微服务启动后nacos连不上使用的基础…

zabbix企业级监控(监控win10主机)---接小白到大神之路运维第63天

第三阶段基础 zabbix企业级监控监控win10主机 目录 Wind10配置&#xff1a; Web图形操作&#xff1a; Wind10配置&#xff1a; 服务器相关信息&#xff1a; 关闭防火墙、IP地址为192.168.59.128 1.首先在C盘根目录下创建zabbix的文件夹 2.将需要的文件拖到该文件夹内&…

CRM排名前三的的系统有哪些特点?

crm经过多年的发展&#xff0c;不仅可以管理好客户关系还是企业重要的战略武器。让企业的销售、市场营销和客服服务部门建立密切联系&#xff0c;在crm一个平台上处理商机&#xff0c;简化业务流程&#xff0c;为组织降本增效。国内crm系统排名哪些技术商更靠前&#xff1f; 1…

CISCN2023国赛复现

[CISCN 2023 初赛]被加密的生产流量 下载附件打开 他的题目叫modbus modbus是一种协议 在这些流量里都找不到有用信息&#xff0c;但是发现了有tcp的追踪流 打开看看 发现两个一组的这几行数字组合像是base编码 MMYMMX3GNEYMOXZRGAYDA 放到base家族解一下密 最后在base32解…

详解应用层的HTTP协议与HTTPS协议

文章目录 前言HTTP协议1. 理解应用层协议1. 什么是HTTP协议&#xff1f;2. HTTP协议工作流程3. HTTP报文格式3.1 HTTP请求方法3.2 HTTP请求报头3.3 HTTP请求正文3.4 HTTP响应的状态码3.4 HTTP响应的报头3.5 HTTP响应的正文3.6 HTTP请求的URL 4. POST请求与GET请求5. HTTP协议实…

结构型模式 - 装饰者模式

概述 我们先来看一个快餐店的例子。 快餐店有炒面、炒饭这些快餐&#xff0c;可以额外附加鸡蛋、火腿、培根这些配菜&#xff0c;当然加配菜需要额外加钱&#xff0c;每个配菜的价钱通常不太一样&#xff0c;那么计算总价就会显得比较麻烦。 使用继承的方式存在的问题&#x…

5G工业路由器实现AGV远程控制,智联物联无线物联网方案

随着AGV在制造业应用逐渐广泛&#xff0c;在生产车间传统的布线网络下&#xff0c;存在着接口不足、网络不稳定、数据丢失、故障异常的情况&#xff0c;技术人员无法及时观察AGV的数据情况&#xff0c;导致AGV出错率高&#xff0c;维护成本高等问题。 传统的AGV通信方式一般是…

【Python基础函数笔记】获取当前时间并写入日志

1.获取当前时间 import os from datetime import datetime import pytzdef get_cur_time():# 获取当前时间return datetime.strftime(datetime.now(pytz.timezone(Asia/Singapore)), %Y-%m-%d_%H-%M-%S)# 基础目录 basedir a logdir os.path.join(basedir, logs, str(args.n…

S3C2440的串口通信(UART)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、UART二、2440的uart资源2.1.uart配置流程2.2 RS2322.3 RS232接口 三. UART编程实现&#xff08;无缓存&#xff09;四. UART编程实现&#xff08;中断&…

Python多线程 threading 和多进程 multiprocessing

1. 并发 vs 并行 线程是程序执行的最小单位&#xff0c;一个进程可以由一个或多个线程组成&#xff0c;各个线程之间也是交叉执行。 并发&#xff0c;相当于单核CPU&#xff0c;宏观同时执行&#xff0c;微观高速切换 交替执行。多线程、高并发这些词语更多地出现在服务端程序…

机器学习(十七):实操_在Sklearn中的实现CART树的基本流程

全文共8000余字&#xff0c;预计阅读时间约16~27分钟 | 满满干货(附代码)&#xff0c;建议收藏&#xff01; 代码下载点这里 一、介绍 CART&#xff08;Classification and Regression Trees&#xff09;即分类回归树&#xff0c;是一种重要的机器学习算法&#xff0c;既可以…

3.8 Bootstrap 面包屑导航(Breadcrumbs)

文章目录 Bootstrap 面包屑导航&#xff08;Breadcrumbs&#xff09; Bootstrap 面包屑导航&#xff08;Breadcrumbs&#xff09; 面包屑导航&#xff08;Breadcrumbs&#xff09;是一种基于网站层次信息的显示方式。以博客为例&#xff0c;面包屑导航可以显示发布日期、类别或…

解决win10系统中ping localhost被解析为 ::1的问题

目录 问题描述 问题分析 解决方案 一、修改host文件 二、修改注册表 三、修改IPv6的优先级 问题描述 本机为win10系统&#xff0c;在命令行窗口ping localhost时&#xff0c;本机IP127.0.0.1被解析为了 ::1的问题 1、在命令行窗口 ping 127.0.0.1 2、在命令行窗口 ping…