Skip to main content

cocos2dx bugly专业版接入

cocos2dx引擎接入

如果业务使用的是c++的cocos2dx,那么可以参考 iOSAndroid的接入方式。

如果业务使用的是cocos2dx-lua 或者cocos2dx-js, 理论上也可以直接接入iOS/Android原生sdk,然后自己封装脚本接口。这篇接入指引是bugly官方封装脚本接口的使用方法。

前置准备

  • 首次使用,需要在 Bugly平台 注册对应的产品组,及添加平台,以便获得对应的 AppKey 和 AppID 供后续接入使用

  • 注意:iOS和Android平台是相互独立的,如果你的产品需要在这两个平台发布,就需要将这俩平台都注册一遍。

  • 下载cocos2dx bugly sdk,并解压

  • 将cocos2dx bugly sdk 拷贝到项目根目录下

  • 将bugly sdk/CocosPlugin/bugly 目录拷贝到项目的frameworks/cocos2d-x/external目录下。

alt text

cocos2dx-js 接入方法

ios

  1. 使用xcode打开proj.ios_mac目录下的xcodepro工程。

  2. 在ios文件夹下创建新Group,命名为bugly_sdk,也可以用其他名字

  3. 右键点击刚刚创建的Group,选择Add files to xxxx,然后选择frameworks/cocos2d-x/external/bugly目录下的CrashReport.h/mm

  4. 注意导入文件的时候,Action选择"Reference files in place":

    alt text

  5. 用同样的方法将frameworks/cocos2d-x/external/bugly/js目录下的BuglyJSAgent.h/cpp 导入bugly_sdk中,最后xcode工程应该是如下样子:

    alt text

  6. 选中刚刚导入的四个文件,在xcode右侧栏中将Location改成Relative to Project: alt text

  7. 在xcode的项目导航栏点击工程,进入Build Settings,往Other Linker Flags中加入一下内容:

-force_load ${SRCROOT}/../../../bugly_sdk/BuglySDK/iOS/BuglyPro.xcframework/ios-arm64/BuglyPro.framework/BuglyPro 
-force_load ${SRCROOT}/../../../bugly_sdk/CocosPlugin/agent/iOS/BuglyBridge/libBuglyAgent.a

以上配置依赖前面提到的项目目录结构,如果将bugly sdk放到其他地方,这里的路径也要做相应调整

  1. 点击项目设置的General栏,往Framewrorks,Libraries,and Embedded Content中加入network.framework

  2. 再次点击Frameworks,Libraries,and Embedded Content下面的加号按钮,点击左下角的Add Other...,将项目根目录下bugly_sdk/iOS/BuglyPro.xcframework也加入到Frameworks列表中: alt text

  3. 此时可以尝试重新编译项目,应该要能编译成功。

  4. 往frameworks/runtime-src/Classes/AppDelegate.cpp中加入如下代码:

/// for bugly
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include "CrashReport.h"
#include "BuglyJSAgent.h"
#define BUGLY_APPID "b7xxxxxx9b" // 你的Bugly iOS平台产品的appid
#define BUGLY_APPKEY "974513a3-xxxx-xxxx-xxxx-6d03d16cd3cf" // 你的Bugly iOS平台产品的appkey
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "bugly/CrashReport.h"
#include "bugly/js/BuglyJSAgent.h"
#define BUGLY_APPID "55xxxxxxcf" // 你的Bugly Android平台产品的appid
#define BUGLY_APPKEY "bfc8a9c4-xxxx-xxxx-xxxx-22c7be3adda2" // 你的Bugly Android平台产品的appkey
#endif

alt text

  1. 初始化:在AppDelegate::applicationDidFinishLaunching()函数开头加入Bugly初始化代码
/// init bugly
#if defined(COCOS2D_DEBUG)
#define BUGLY_DEBUG_MODE true
#define BUGLY_VERSION_TYPE APP_VERSION_TYPE_DEBUG
#define BUGLY_LOG_LEVEL CrashReport::Verbose
#else
#define BUGLY_DEBUG_MODE false
#define BUGLY_VERSION_TYPE APP_VERSION_TYPE_RELEASE
#define BUGLY_LOG_LEVEL CrashReport::Error
#endif // COCOS2D_DEBUG

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
CrashReport::configCrashReportParams("9.5.8", "1.2.3", "xxxx-build-id-yyy-zzz",
"init_user_id", "init_device_module", BUGLY_VERSION_TYPE, BUGLY_LOG_LEVEL);
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
CrashReport::setAppVersion("3.1.4");
#endif
CrashReport::initCrashReport(BUGLY_APPID, BUGLY_APPKEY, BUGLY_DEBUG_MODE);

alt text

CrashReport::configCrashReportParams的参数说明:

  • appVersion: 游戏程序版本
  • buildNum: 构建号
  • uniqueId: 唯一标识,也可以理解为设备id
  • userId: 用户id
  • deviceModel: 设备型号
  • appVersionType: 游戏程序版本类型,可以是 APP_VERSION_TYPE_DEBUG, APP_VERSION_TYPE_GARY, APP_VERSION_TYPE_RELEASE之一
  • logLevel: 日志等级,参考CrashReport.h中LogLevel的定义,一般debug版本的包用Debug级别,release版本的包用Warning或者Error级别
  1. 注册bugly js api, 在applicationDidFinishLaunching函数下方调用如下方法注册bugly的js api,用于在js中设置场景信息/用户id等信息。这时可选的,如果不需要js接口,就不用进行这一步。
sc->addRegisterCallback(BuglyJSAgent::registerJSFunctions);

注意,上面示例图中是测试环境的代码,正式代码请参考上面的代码块内容

  1. 在启动main.js前注册js异常捕获:
    /// for bugly js 异常
BuglyJSAgent::registerJSExceptionHandler(ScriptingCore::getInstance()->getGlobalContext());

alt text

此时bugly应该就可以自动捕获和上报js异常和native crash了。如果上报不成功,请联系bugly小助手

Android

cocos2dx-js Android平台的接入代码在上面iOS部分都已经说明(因为代码都是同一套),下面只说明Android平台的项目设置。

  1. 将项目根目录下的bugly_sdk/BuglySDK/Android/bugly-pro-4.4.3.7.aar文件拷贝到proj.android/app/libs目录下。
  2. 修改proj.android/app/build.gradle文件,将implementation fileTree加上'*.aar'文件。在dependencies中引入bugly,并添加bugly的依赖项:
    /// bugly sdk 的依赖
implementation 'org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.3.41'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.41'
implementation 'com.squareup.leakcanary:shark:2.7'
implementation 'androidx.annotation:annotation:1.2.0'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'

alt text

  1. 修改proj.android/app/proguard-rules.pro文件,添加混淆白名单:
# for bugly
-keep public class com.tencent.bugly.agent.GameAgentPro {
public *;
}
  1. 修改proj.android/app/jni/Android.mk文件,将bugly接口封装和js脚本封装类引入:
# for bugly
LOCAL_STATIC_LIBRARIES += bugly_crashreport_cocos_static
LOCAL_STATIC_LIBRARIES += bugly_agent_cocos_static_js

# for bugly
$(call import-module, external/bugly)
# for bugly js api
$(call import-module, external/bugly/js)

alt text

  1. 在proj.android目录下的build.gradle中添加如下代码:
ext.kotlin_version = "1.3.41"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

alt text

  1. 重新生成项目,应该能编译成功。且能自动监控和上报js异常和native crash。如果不能,请联系Bugly小助手。

bugly js api暴露的接口可以在BuglyJSAgent.cpp中找到。包括:

  • buglySetUserId(string) // 设置用户id
  • buglyAddUserValue(string_key, string_value) // 设置自定义字段
  • buglySetScene(string) // 设置场景/关卡信息

cocos2dx-lua 接入方法

cocos2dx-lua 接入方法和cocos2dx-js类似,前置准备也是一样的。只是接入和初始化代码略有不同。下面做详细说明。

cocos2dx-lua iOS平台

前四步都和cocos2dx-js一样

  1. 使用同样的方法将cocos2d-x/external/bugly/lua目录下的BuglyLuaAgent.h/cpp导入xcode。
  2. 同cocos2dx-js
  3. 同cocos2dx-js
  4. 同cocos2dx-js
  5. 同cocos2dx-js
  6. 同cocos2dx-js
  7. 往frameworks/runtime-src/Classes/AppDelegate.cpp中加入如下代码:
/// for bugly
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include "CrashReport.h"
#include "BuglyLuaAgent.h"
#define BUGLY_APPID "b7xxxxxx9b" // 你的Bugly iOS平台产品的appid
#define BUGLY_APPKEY "974513a3-xxxx-xxxx-xxxx-6d03d16cd3cf" // 你的Bugly iOS平台产品的appkey
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "bugly/CrashReport.h"
#include "bugly/lua/BuglyLuaAgent.h"
#define BUGLY_APPID "55xxxxxxcf" // 你的Bugly Android平台产品的appid
#define BUGLY_APPKEY "bfc8a9c4-xxxx-xxxx-xxxx-22c7be3adda2" // 你的Bugly Android平台产品的appkey
#endif

alt text

  1. 初始化:在AppDelegate::applicationDidFinishLaunching()函数开头加入Bugly初始化代码:
/// init bugly
#if defined(COCOS2D_DEBUG)
#define BUGLY_DEBUG_MODE true
#define BUGLY_VERSION_TYPE APP_VERSION_TYPE_DEBUG
#define BUGLY_LOG_LEVEL CrashReport::Verbose
#else
#define BUGLY_DEBUG_MODE false
#define BUGLY_VERSION_TYPE APP_VERSION_TYPE_RELEASE
#define BUGLY_LOG_LEVEL CrashReport::Error
#endif // COCOS2D_DEBUG

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
CrashReport::configCrashReportParams("9.5.8", "1.2.3", "xxxx-build-id-yyy-zzz",
"init_user_id", "init_device_module", BUGLY_VERSION_TYPE, BUGLY_LOG_LEVEL);
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
CrashReport::setAppVersion("3.1.4");
#endif
CrashReport::initCrashReport(BUGLY_APPID, BUGLY_APPKEY, BUGLY_DEBUG_MODE);
  1. 注册bugly lua api, 在applicationDidFinishLaunching函数下方调用如下方法注册bugly的Lua api,用于在js中设置场景信息/用户id等信息。这时可选的,如果不需要Lua接口,就不用进行这一步。
    // for bugly lua exception
BuglyLuaAgent::registerLuaExceptionHandler(engine);

alt text

  1. 注册Lua异常回调:修改src/cocos/init.lua中的GTRACKBACK__函数为如下样子:
__G__TRACKBACK__ = function(msg)
-- record the message
local message = msg

local msg = debug.traceback(msg, 3)
print(msg)

-- report lua exception to bugly
buglyReportLuaException(tostring(message), debug.traceback())
return msg
end

此时bugly应该就可以自动捕获和上报异常和native crash了。如果上报不成功,请联系bugly小助手

cocos2dx-lua Android平台

cocos2dx-lua Android平台的接入代码在上面iOS部分都已经说明(因为代码都是同一套),下面只说明Android平台的项目设置。

前三步和上面cocos2dx-js Android平台接入的一样。

  1. 修改proj.android/app/jni/Android.mk文件,将bugly接口封装和js脚本封装类引入:
# for bugly
LOCAL_STATIC_LIBRARIES += bugly_crashreport_cocos_static
LOCAL_STATIC_LIBRARIES += bugly_agent_cocos_static_lua

# for bugly
$(call import-module, external/bugly)
# for bugly js api
$(call import-module, external/bugly/lua)

alt text

注意到了吗?只是引入的库不一样,前面是引入js库,这里是引入lua库

  1. 和cocos2dx-js Android一样。
  2. 重新生成项目,应该能编译成功。且能自动监控和上报js异常和native crash。如果不能,请联系Bugly小助手。

bugly lua api暴露的接口可以在BuglyLuaAgent.cpp中找到。包括:

  • buglySetUserId(string) // 设置用户id
  • buglyAddUserValue(string_key, string_value) // 设置自定义字段
  • buglySetScene(string) // 设置场景/关卡信息