【技术分享】利用Bugout捕获JS异常并自动提交

原由:帮助线上项目捕获并自动上传异常,随时随地查看APP问题

Bugout官网地址:http://bugout.testin.cn/
帮助文档及SDK下载地址:http://docs.testin.cn/docs/sdk
首先要在官网添加一个项目,然后获取到项目的ID
如图:


Cocos Creator安卓接入Bugout的步骤如下:(该教材主要捕获JavaScript抛出的异常,教程中目录截图是基于Cocos Creator 1.4.0目录,其他版本的目录请自行对应

  1. 官网下载Android SDK包;

  2. 官网下载Android Cocos插件;
    如图:

  3. 将Android SDK 压缩包中的libs目录下的jar包提取出来,放入项目的 build\jsb-default\frameworks\runtime-src\proj.android\libs 目录下
    如图:

  4. 提取Android Cocos插件压缩包中的 testinagenthelper文件夹,然后放入项目的build\jsb-default\frameworks\cocos2d-x\external 目录下,如图

  5. 修改AndroidMninifest.xml文件,添加需要的权限:
    <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.READ_LOGS"/> <uses-permission android:name="android.permission.GET_TASKS"/>

如图:

6.修改build\jsb-default\frameworks\runtime-src\proj.android\jni目录下的Android.mk文件:

//这两行需要同其他的LOCAL_WHOLE_STATIC_LIBRARIES命令放在一起

LOCAL_WHOLE_STATIC_LIBRARIES += testin_agent_helper_static

LOCAL_WHOLE_STATIC_LIBRARIES += testin_agent_helper_js

//这两行放在最后

$(call import-module,external/testinagenthelper)

$(call import-module,external/testinagenthelper/js)

//这一句放在其他LOCAL_C_INCLUDES := $(LOCAL_PATH)/…/…/Classes后面

LOCAL_C_INCLUDES += $(LOCAL_PATH)/…/…/…/cocos2d-x/external

如图所示:

7.修改Classes目录下的APPDelegat.cpp文件
添加头文件:
#include “testinagenthelper/TestinAgentHelper.h”
#include “testinagenthelper/js/TestinJSExceptionHandler.h”
如图:


//在引擎初始化的代码位置(AppDelegate.cpp的applicationDidFinishLaunching()函数最前面),添加如下代码
TestinAgentHelper::initTestinAgent(“appID”, “渠道,可为空字符串”);
如图:

//在JS引擎初始化成功后(在JS引擎的runScript方法之前),调用此方法,将引擎的context作为对象传入:
TestinJSExcetionHandler::registerJSExceptionHandler(ScriptingCore::getInstance()->getGlobalContext());
如图:

8. 最后修改build\jsb-default\frameworks\cocos2d-x\external\testinagenthelper\js目录下的Android.mk文件
// LOCAL_C_INCLUDES变量添加如下代码
$(LOCAL_PATH)/…/…/android/armeabi-v7a/include/spidermonkey
如图:

编译通过就可以了……^_^,你以为这就完了么?太年轻太天真


上报完JS错误会发现另一个难题,Creator在编译release工程时,先把工程合成一个project.js,然后再编译成字节码project.jsc。问题出在合成project.js时,还把代码给压缩了,空格和换行都删除了,project.js变成只有一行的文件。(出处http://forum.cocos.com/t/js/50555
本人解决办法:
先构建调试模式,
如图:


得到project.dev.js文件
如图:

然后备份这个js文件到别的地方,然后再构建release版本

会生成release版的project.jsc文件(此文件后面会被替换)
然后利用JSTOOL工具,把bebug版本的project.dev.js文件转为project.jsc
JSTOOL工具在cocos安装目录\resources\cocos2d-x\tools\cocos2d-console\plugins\plugin_jscompile\bin\ jsbcc.exe
如图:(我是装在D盘)


JSTOOL工具的使用方法:
命令行环境下(cmd):
Jsbcc.exe 需要转的project.dev.js文件 转换后的prokect.jsc

Jsbcc.exe可以直接从目录中拖拽到cmd窗口

把新生成的prokect.jsc替换release版本的project.jsc(原project.dev.js文件不要删,后面报错时需要查看此文件),至此完事,直接编译即可
在Bugout网站上看出错记录
如图:

打开project.dev.js文件定位到27行:

7赞

:clap:才看清楚,原来是Bugout。。。。。。

哈哈,不止你一个:joy:

谢谢分享~~

哈哈,我也是看了你的分享,才能把bugout的搞定

是不是标题不够大:grinning:

thanks for share :heart_eyes:

和其他 几个的 bug上报的sdk,有什么区别?

没用过其他的sdk呢

:+1:谢谢分享~

请问一下用的 Cocos Creator 什么版本

bugout 下线了,有捕获Android端,js报错的方法吗

腾讯的bugly,,还有友盟sdk,来处理崩溃,异常上报,关键点埋点记录
如果需要跟踪详细,量很大的日志,一步步都要记录,查询的,可以接阿里云sdk

谢谢,主要想捕获到线上Android平台 js的报错信息