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

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串编程练习(C++)

ex1 字符串变形 描述 对于一个长度为 n 字符串&#xff0c;我们需要对它做一些变形。 首先这个字符串中包含着一些空格&#xff0c;就像"Hello World"一样&#xff0c;然后我们要做的是把这个字符串中由空格隔开的单词反序&#xff0c;同时反转每个字符的大小写。…

JS-27 前端数据请求方式;HTTP协议的解析;JavaScript XHR、Fetch的数据请求与响应函数;前端文件上传XHR、Fetch

目录 1_前端数据请求方式1.1_前后端分离的优势1.2_网页的渲染过程 – 服务器端渲染1.3_网页的渲染过程 – 前后端分离 2_HTTP协议的解析2.1_HTTP概念2.2_网页中资源的获取2.3_HTTP的组成2.4_HTTP的版本2.5_HTTP的请求方式2.6_HTTP Request Header2.7_HTTP Response响应状态码 3…

多媒体开发之cgo

go语言作为近十年来优秀的现代开发语言的代表&#xff0c;由于继承了c语言的简洁和很多现代语言的表达方式&#xff0c;在广泛的应用场景中得到众多爱好者的喜爱&#xff0c;如何将go和c、c进行联合开发&#xff0c;拓展整个开发生态&#xff0c;不用重复造轮子&#xff0c;掌握…

P1403 [AHOI2005] 约数研究

题目描述 科学家们在 Samuel 星球上的探险得到了丰富的能源储备&#xff0c;这使得空间站中大型计算机 Samuel II 的长时间运算成为了可能。由于在去年一年的辛苦工作取得了不错的成绩&#xff0c;小联被允许用 Samuel II 进行数学研究。 小联最近在研究和约数有关的问题&…

【redis】redis管道简述

redis管道可以一次性发送多条命令。 命令示例如下&#xff1a; [xxxlocalhost ~]$ echo -e "set k4 99\nincr k4\nget k4" | nc localhost 6379 \OK :100 $3 100下面先简述一下这条命令的组成&#xff0c;再简述一下管道的常用场景和注意事项。 首先&#xff0c;|是…

IDEA 搭建Android 开发环境

项目实战 废话不多说开始创建先第一个 Android 项目 步骤一 FILE → New → Project 步骤二-选择 Android 项目模板 选那个安卓机器人,如果没有这个选项,需要升级IDEA版本或者安装安卓插件 选择*Basic Activity* Next-下一步 步骤三-项目初始化 名称、包名、安装位置自行调整…

双电源并用问题与解决方案

双电源并用问题 曾经有客户在电源模块应用过程中出现过这样的应用场景&#xff0c;如下图1所示。客户使用两路电源给后端电路进行供电&#xff0c;要求在不断电的情况下切换输入电源&#xff0c;此过程中发现后端电路会出现损坏。对各个节点波形进行分析后发现&#xff0c;在给…

【C++】STL之list容器的模拟实现

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处。 文章目录 前言一、list的三个类的关系分析图vector和list的区别1.节点的成员变量以及构造函数2.list的迭代器 二、list的增删查改工作2.1inse…

MFC第十六天 CFileDialog、CEdit简介、(线程)进程的启动,以及Notepad的开发(托盘技术-->菜单功能)

文章目录 CCommonDialogCFileDialogCEdit托盘技术进程的启动附录1:启动线程方式附录2:MFC对话框的退出过程 CCommonDialog 通用对话框 CCommonDialog 这些对话框类封装 Windows 公共对话框。 它们提供了易于使用的复杂对话框实现。 CFileDialog 提供用于打开或保存文件的标准对…

C#在工业自动化领域的应用前景如何?

在2021年&#xff0c;C#与工业自动化已经开始结合&#xff0c;并且这种趋势有望在未来继续发展。C#是一种功能强大的编程语言&#xff0c;其面向对象的特性、跨平台支持以及丰富的类库和工具&#xff0c;使其成为在工业自动化领域应用的有力工具。 我这里刚好有嵌入式、单片机…

Nautlius Chain主网正式上线,模块Layer3时代正式开启

Nautilus Chain 是在 Vitalik Buterin 提出 Layer3 理念后&#xff0c; 对 Layer3 领域的全新探索。作为行业内首个模块化 Layer3 链&#xff0c;我们正在对 Layer3 架构进行早期的定义&#xff0c;并有望进一步打破公链赛道未来长期的发展格局。 在今年年初&#xff0c;经过我…

Spring Cloud 之 Gateway 网关

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…