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

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成功了,还有具体的堆栈和行号呢,连符号表都不用上传了。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于python的爬虫实现

定义 爬虫&#xff08;Web crawler&#xff09;&#xff0c;也被称为网络爬虫、网络蜘蛛或网络机器人&#xff0c;是一种自动化程序&#xff0c;用于浏览互联网并收集网页内容。 基本原理 爬虫的工作原理是通过发送HTTP请求从网页服务器获取网页的内容&#xff0c;然后解析网…

计算机专升本基础笔记二 进制转换及二进制运算规则

进制转换及二进制运算规则 什么是进制&#xff1f;     进制就是进位计数制&#xff0c;是人为定义的带进位的计数方法。我们的时间就是六十进制(满60秒进一分钟&#xff0c;满60分钟进1小时&#xff09;&#xff1b;对于任何一种进制—X进制&#xff0c;就表示每一位上的数…

GUI-Menu菜单实例(颜色+线型菜单)

运行代码&#xff1a; //GUI-Menu菜单实例&#xff08;颜色线型菜单&#xff09; #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"struc…

Java的数据结构-Map集合

文章目录 Map概述Map常用方法Map遍历元素的方法1.方法一&#xff1a;keySet()2.方法二&#xff1a;entrySet() HashMap Map概述 1、Map和collection没有继承关系2、Map集合以key和value的方式存储数据&#xff1a;键值对key和value都是引用数据类型。key和value都是存储对象的…

【LocalSend】开源跨平台的局域网文件传输工具,支持IOS、Android、Mac、Windows、Linux

工作前提条件&#xff1a;设备使用相同的局域网。 LocalSend is a cross-platform app that enables secure communication between devices using a REST API and HTTPS encryption. Unlike other messaging apps that rely on external servers, LocalSend doesn’t require …

【网络安全】渗透测试工具——Burp Suite

渗透测试工具Burp Suite主要功能详解 前言一、 Proxy模块1.1 界面布局1.1.1 菜单栏&#xff08;1&#xff09; 菜单栏 Burp&#xff08;2&#xff09; 菜单栏 project&#xff08;3&#xff09; 菜单栏 Intruder&#xff08;4&#xff09; 菜单栏 Repeater&#xff08;5&#x…

C# Modbus通信从入门到精通(2)——Modbus RTU协议原理

Modbus RTU是串行链路上的协议,也就是说Modbus RTU是通过串口通信来实现的,它可以通过RS232、RS485物理层的接口来实现,同时它也是一个主从协议,在同一时间总线上只能有一个主站和一个或多个(最多247)个从站。Modbus通信总是由主站发起,从站没有接收到主站的请求时不会发…

Kubernetes轻量级日志工具Loki安装及踩坑记录

Loki简介 Loki是Grafana出品的一个轻量级日志系统&#xff0c;熟悉ELK的都知道ELK使用起来的成本&#xff0c;而且仅仅是日志检索使用ELK的话有点大材小用了。Loki8技术栈中使用了以下组件。 Promtail 用来将容器日志发送到 Loki 或者 Grafana 服务上的日志收集工具&#xff0c…

基于单片机的智能鞋柜的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;通过DHT11温湿度采集&#xff1b;通过按键设置逻辑处理&#xff1b;通过LED紫外线消毒&#xff1b;通过继电器控制风扇进行换气除湿&#xff1b;通过继电器控制加热片进行加热&#xff1b;整个电路以5v供电; 电路图 PCB 源代码 #i…

OSS对象存储后端实现+Vue实现图片上传【基于若依管理系统开发】

文章目录 基本介绍术语介绍图片上传方式介绍普通上传用户直传应用服务器签名后直传 OSS对象存储后端实现maven配置文件配置类ServiceController 图片上传前端图片上传组件api页面使用组件组件效果 基本介绍 术语介绍 Bucket&#xff08;存储空间&#xff09;&#xff1a;用于…

7-Spring cloud之路由网关zuul

7-Spring cloud之路由网关zuul 1. 前言2. 关于zuul2.1 zuul基本原理2.2 为什么要使用zuul 3. 搭建zuul3.1 项目结构3.2 基本配置3.2.1 pom文件3.2.2 yml文件3.3.3 启动类 3.3 测试看效果3.3.1 演示3.3.1 架构图 4. zuul路由访问映射规则4.1 映射服务提供者的服务名4.2 访问加前…

基于vue3+pinia2仿ChatGPT聊天实例|vite4.x仿chatgpt界面

原文&#xff1a;基于vue3pinia2仿ChatGPT聊天实例|vite4.x仿chatgpt界面 基于vue3pinia2仿ChatGPT聊天实例|vite4.x仿chatgpt界面 使用vue3pinia2开发仿制chatgpt界面聊天实例Vue3-Chatgpt 基于Vue3.xPinia2VueRouterVue3-Markdown等技术构建仿ChatGPT网页端聊天程序。支持经…

《动手学深度学习》(pytorch版本)中`d2lzh_pytorch`包问题

《动手学深度学习》&#xff08;pytorch版本&#xff09;中d2lzh_pytorch包问题

Redis安装与配置指南:适用于Windows、Mac和Linux系统的详细教程

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

opencv-07-感兴趣区域(ROI)

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区 域&#xff08;Region of Interest&#xff0c;ROI&#xff09;。在设定感兴趣区域 ROI 后&#xff0c;就可以对该区域进行整体操作。 以下是一些 OpenCV ROI应用场景 …

华为认证的题库,不仅能考试,还能帮你提升技能

1、OSPF协议在哪种状态下确定DD报文的主从关系&#xff1f; A. 2-way B.Exchange C. ExStart D. Full 2、在VRP操作系统中&#xff0c;如何进入OSPF区域0的视图&#xff1f;A. [Huawei-ospf-1]area 0 B.[Huawei]ospf area 0 C. [Huawei-ospf-1]area 0 enable D. [Huawe…

Python批量实现Word、EXCLE、PPT转PDF文件

一、绪论背景 在日常办公和文档处理中&#xff0c;有时我们需要将多个Word文档、Excel表格或PPT演示文稿转换为PDF文件。将文档转换为PDF格式的好处是它可以保留文档的布局和格式&#xff0c;并且可以在不同平台上进行方便的查看和共享。 本篇博文将介绍如何使用Python编程语言…

服务机器人应用

随着时代的发展&#xff0c;机器人技术在各个领域越来越普及。在服务领域&#xff0c;服务机器人的应用也越来越受到人们的欢迎。服务机器人将会在商业、医疗、教育、酒店等领域得到应用&#xff0c;并成为未来发展的趋势。 在商业领域中&#xff0c;服务机器人可以承担很多工作…

鲸鱼优化算法MATLAB代码

论文 Seyedali Mirjalili,Andrew Lewis. The Whale Optimization Algorithm[J]. Advances in Engineering Software,2016,95.func_plot.m % This function draw the benchmark functionsfunction func_plot(func_name)[lb,ub,dim,fobj]Get_Functions_details(func_name);switch…

轮廓提取demo

note 步骤&#xff1a; 1.滤波(使用高斯核对原图卷积) 2.取梯度(使用sobel核对步骤1之后的图卷积得到x,y两个方向的梯度分量) 3.合成梯度图(x,y两个方向的梯度分量相加) 4.取梯度平方和矩阵(x*x y*y) 5.取八邻域掩膜(3x3矩阵) 6.根据掩膜&#xff0c;合成梯度图&#x…