Skip to content

Latest commit

 

History

History

crashhelper

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 

崩溃收集支持

崩溃收集支持插件for Cocos引擎,是C++代码到Native代码(Java/ObjectiveC)的桥梁,方便在C++调用Testin崩溃分析SDK,用于传递自定义用户信息、场景、错误等;实现对JavaScript、Lua脚本的错误收集

注意:在使用本插件前,须确保Testin的崩溃分析SDK已加入到工程中,否则调用时会崩溃。

要求的崩溃分析SDK版本:Android/iOS 1.7


请选择您的开发语言

C++


Andriod

修改proj.android/jni目录下的Android.mk文件,增加如下两行

#这一行需要同其他的LOCAL_WHOLE_STATIC_LIBRARIES命令放在一起
LOCAL_WHOLE_STATIC_LIBRARIES += testin_crash_helper_static 

#这一行放在最后
$(call import-module,external/crashhelper) 

示例图片:

iOS

在XCode中,将crashhelper目录下的源文件和头文件加入到cocos2d_libs子项目中,如图

另外需要将源文件同时添加到target的Compile Sources中,否则会报ld错误。可以在如下图所示的设置中查看是否添加,如果没有可以点下面的“+”按钮添加

Lua


Andriod

修改proj.android/jni目录下的Android.mk文件,增加如下行

#这两行需要同其他的LOCAL_WHOLE_STATIC_LIBRARIES命令放在一起
LOCAL_WHOLE_STATIC_LIBRARIES += testin_crash_helper_static 
LOCAL_WHOLE_STATIC_LIBRARIES += testin_crash_helper_lua

#这两行放在最后
$(call import-module,external/crashhelper) 
$(call import-module,external/crashhelper/lua) 

示例图片:

iOS

在XCode中,将crashhelper目录和lua子目录下的源文件和头文件加入到cocos2d_lua_bindings子项目中,如图

另外需要将源文件同时添加到target的Compile Sources中,否则会报ld错误。可以在如下图所示的设置中查看是否添加,如果没有可以点下面的“+”按钮添加

JavaScript


Andriod

修改proj.android/jni目录下的Android.mk文件,增加如下行

#这两行需要同其他的LOCAL_WHOLE_STATIC_LIBRARIES命令放在一起
LOCAL_WHOLE_STATIC_LIBRARIES += testin_crash_helper_static 
LOCAL_WHOLE_STATIC_LIBRARIES += testin_crash_helper_js

#这两行放在最后
$(call import-module,external/crashhelper) 
$(call import-module,external/crashhelper/js) 

示例图片:

iOS

在XCode中,将crashhelper目录和js子目录下的源文件和头文件加入到cocos2d_js_bindings子项目中,如图

另外需要将源文件同时添加到target的Compile Sources中,否则会报ld错误。可以在如下图所示的设置中查看是否添加,如果没有可以点下面的“+”按钮添加


  • 添加头文件 在需要使用本插件的C++代码中添加头文件
#include "crashhelper/TestinCrashHelper.h"

//如果编译过程中找不到头文件,需要把external目录添加到头文件搜索目录中,例如
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../cocos2d/external
  • 调用
//调用下面的C++静态方法设置用户信息
void TestinCrashHelper::setUserInfo(const char* userInfo);

//例如
TestinCrashHelper::setUserInfo("test user info");

  • 添加头文件 在需要使用本插件的C++代码中添加头文件
#include "crashhelper/TestinCrashHelper.h"

//如果编译过程中找不到头文件,需要把external目录添加到头文件搜索目录中,例如
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../cocos2d/external
  • 调用
//在捕获到自定义错误时(比如自己捕获的异常或者其他错误),调用下面的C++静态方法
//traceback中传递详细信息,如果需要多行可以用\n隔开
void TestinCrashHelper::reportException(int type, const char* reason, const char* traceback);

//例如
TestinCrashHelper::reportException(1, "test reason", "test message");


  • 添加头文件 在初始化Lua引擎的cpp文件中添加头文件
#include "crashhelper/lua/TestinLuaExceptionHandler.h"

//如果编译过程中找不到头文件,需要把external目录添加到头文件搜索目录中,例如
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../cocos2d/external
  • 注册Lua崩溃收集handler(C++)
//这一行加到Lua引擎的executeScriptFile方法之前
TestinLuaExceptionHandler::registerLuaExceptionHandler();

示例:

  • Lua脚本增加调用C++方法 在Lua主程序的错误回调函数中,调用C++方法把错误传递给C++代码
//方法定义
onLuaException(const char* reason, const char* traceback);


//例如,在调用xpcall函数时,注册了回调函数__G__TRACKBACK__
xpcall(main, __G__TRACKBACK__)

//在回调函数中,执行onLuaException函数,把错误内容和堆栈传递给C++
function __G__TRACKBACK__(msg)
    print("----------------------------------------")
    print("LUA ERROR: " .. tostring(msg) .. "\n")
    print(debug.traceback())
    --call c++ function
    onLuaException(tostring(msg), debug.traceback())
    print("----------------------------------------")
end

示例图片:


  • 添加头文件 在初始化JS引擎的cpp文件中添加头文件
#include "crashhelper/js/TestinJSExceptionHandler.h"

//如果编译过程中找不到头文件,需要把external目录添加到头文件搜索目录中,例如
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../cocos2d/external
  • 注册JS崩溃收集handler(C++)
//方法定义
void TestinJSExcetionHandler::registerJSExceptionHandler(JSContext *cx);

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

示例图片:

为了更方便的使用Testin崩溃分析服务,可以在cocos引擎代码中初始化,无需去Native代码(Java/Objc)中添加如下方法:

//方法定义,其中appKey为必填,在Testin网站上申请得到;channel为可选,没有此参数时可以填NULL
static void initTestinAgent(const char* appKey, const char* channel);

//例如,在引擎初始化的代码位置(如AppDelegate.cpp的applicationDidFinishLaunching()函数的最前面),添加如下代码行
TestinCrashHelper::initTestinAgent("<yourAppKey>", "<yourChannel>");

需要注意:尽管无需在Native代码中初始化,但是仍然需要将Testin崩溃分析的SDK添加到工程:Android工程,需要将TestinAgent.jar拷贝至工程的libs目录;iOS工程,需要添加TestinAgent.Framework

同初始化的方法类似,我们为Android工程提供了在引擎代码中添加onStart和onStop的方法(这两个方法是为了更好的收集崩溃发生时的数据和计算崩溃率)

//在AppDelegate::applicationWillEnterForeground()方法的最后添加如下语句
TestinCrashHelper::onActivityStart();

//在AppDelegate::applicationDidEnterBackground()方法的最后添加如下语句
TestinCrashHelper::onActivityStop();