【技术分享之六】Creator1.7接入Bugly

前言

Bugly官方有对接Cocos引擎的文档,但是文档较老,目前Creator又到1.7版本,按着官方的文档来接可能会遇到一些问题。针对论坛上一些新同学的要求,搞了一个简要的教程,方法与Bugly官方的略有差异,好处是只会改动工程相关的代码,不会触碰到cocos2d-x。

首先是下载BuglyCocos Plugin 下载

Bugly接入Android

  • CocosPlugin\agent\Android\bugly_agent.jarBuglySDK\Android\bugly_crash_release.jar拷贝到Android工程的frameworks\runtime-src\proj.android-studio\app\libs\里面。

  • BuglySDK\Android\libs\armeabi-v7a文件夹拷贝到jsb-default\frameworks\runtime-src\proj.android-studio\app\jni\prebuilt,如果prebuilt文件夹不存在就创建一下,如果还需要其他ABI就拷贝相应的,比如常用于模拟器的x86

  • CocosPlugin\bugly文件夹拷贝到frameworks\runtime-src\Classes里面,其实只需要用到CrashReport.hCrashReport.mm,其他的如js, lua文件夹并不需要,你可以把它们删掉,即拷贝过去后是这样的结构:

- Classes\
    - bugly\
        - CrashReport.h
        - CrashReport.mm
  • 接着打开frameworks\runtime-src\proj.android-studio\app\jni\Android.mk,加入bugly的配置,文件大概如下,和Bugly相关的加了注释:
LOCAL_PATH := $(call my-dir)

# --- bugly: 引用 libBugly.so ---
include $(CLEAR_VARS)
LOCAL_MODULE := bugly_native_prebuilt
LOCAL_SRC_FILES := prebuilt/$(TARGET_ARCH_ABI)/libBugly.so
include $(PREBUILT_SHARED_LIBRARY)
# --- bugly: end ---

include $(CLEAR_VARS)
LOCAL_MODULE := cocos2djs_shared
LOCAL_MODULE_FILENAME := libcocos2djs

ifeq ($(USE_ARM_MODE),1)
LOCAL_ARM_MODE := arm
endif

# --- bugly: 增加cpp扩展名mm
LOCAL_CPP_EXTENSION := .mm .cpp .cc
LOCAL_CFLAGS += -x c++

# --- bugly: 增加CrashReport.mm文件
LOCAL_SRC_FILES := hellojavascript/main.cpp \
				   ../../../Classes/AppDelegate.cpp \
				   ../../../Classes/bugly/CrashReport.mm \
				   
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes
LOCAL_STATIC_LIBRARIES := cocos2d_js_static
LOCAL_EXPORT_CFLAGS := -DCOCOS2D_DEBUG=2 -DCOCOS2D_JAVASCRIPT
include $(BUILD_SHARED_LIBRARY)

$(call import-module, scripting/js-bindings/proj.android)

参照如上的规则,看看bugly相关的地方,加一下就可以了,应该也不难理解。

  • 最后是修改AppDelete.cpp文件,打开frameworks\runtime-src\Classes\AppDelegate.cpp
// bugly
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include "bugly/CrashReport.h"
#endif
    ... ...
bool AppDelegate::applicationDidFinishLaunching()
{
    // bugly: 初始化bugly, xxxxxx是你的APPID,这个不用多说了吧
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    CrashReport::initCrashReport("xxxxxxx", false);
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    CrashReport::initCrashReport("xxxxxxx", false);
#endif
    .... ....
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
    // Enable debugger here
    // Change IP while remote debugging on Android device.
    jsb_enable_debugger("0.0.0.0", 5086);
#endif
    // bugly: 设置JS的异常上报
    se->setExceptionCallback([](const char* location, const char* message, const char* stack){
        // Send exception information to server like Tencent Bugly.
        CrashReport::reportException(CATEGORY_JS_EXCEPTION,  "JSException", message, stack);
    });

    ... ...
}

最后编译工程,如无意外应该就成功了,崩溃和JS异常都会上报到Bugly上面。不过崩溃是需要符号表的,否则无法看到完整的堆栈信息。

这里留个坑,等后面有时间再来补齐,待补的内容如下面的大纲。

Android符号文件的自动上传

Bugly提供一个工具方便提取符文表文件以及上传,下载在这里

使用方式大概是这样的:

PROJECT_ROOT = <替换成你的安卓工程根目录>
so_path = PROJECT_ROOT + "/frameworks/runtime-src/proj.android-studio/app/libs/armeabi-v7a/libcocos2djs.so"     # so文件路径
save_path = "x86-symbol.zip"    # 保存符号表的路径
app_id = "xxxx"                 # 你的bugly app_id
app_key = "xxxx"                # 你的bugly app_key
package = "com.xxx.xxx"         # 你的包名
channal = "xx"                  # 你的渠道
version = "1.0.0.2222"          # 你的程序版本号

cmd = 'buglySymbolAndroid.bat -i %s -o %s -u -id %s -key %s -package %s  -channel %s -version %s' % (
    so_path, save_path, app_id, app_key, package, channal, version, )
os.system(cmd)

上面的python脚本略作修改,就可以用于实际项目中。
一般构建过程都会写成自动化的命令行方式,上面脚本可以在构建APK完毕之后调用,并且渠道,版本号什么的,都可以通过参数传进来。这样就实现构建和上传符号表自动化的流程。

Bugly接入IOS

IOS的接入比较简单,一般按Bugly的帮助文档可以成功接入,这里写一个大概的流程

  • 打开xcode工程: frameworks/runtime-src/proj.ios_mac/xxxx.xcodeproj
  • 在Android接入流程中,已经将CrashReport.hCrashReport.mm放在frameworks/runtime-src/Classes/bugly中,所以直接将这两个文件加进xcode工程即可。
  • proj.ios_mac/ios/中新建bugly目录,并将libBuglyAgent.a, Bugly.framework拷贝过去,目录结构大概是:
- ios\
    - bugly\
        - Bugly.framework
        - libBuglyAgent.a
  • 接着,将Bugly.framework和libBuglyAgent.a加到xcode。在Build SettingsOther Linker Flags 配置中添加-force_load标记, 设置libBuglyAgent.a 和 Bugly.framework的路径,如:
-force_load
${SRCROOT}ios/bugly/libBuglyAgent.a
-force_load
${SRCROOT}ios/bugly/Bugly.framework/Bugly
  • 因为在Android流程中,已经修改了AppDelete.cpp代码,所以不需要再写代码了,直接编译xcode工程,如无意外将编译成功。

IOS符号文件的自动上传

Bugly官方提供了一段脚本集成到XCode的构建流程中,这样编译完成,就会自动上传符号表到Bugly网站:

  • 这里下载这个工具
  • 解压后,里面有一个dSYMUpload.sh脚本,修改里面的BUGLY_APP_ID, BUGLY_APP_KEY, BUNDLE_IDENTIFIER, 含义非常明显,不多作解释,如果你想只有Archive操作时才上传,则修改UPLOAD_ARCHIVE_ONLY=1
  • 在Xcode工程对应Target的Build Phases中新增Run Scrpit Phase, 将dSYMUpload.sh的内容拷贝进去。
  • 然后就OK了,以后你每次编译Release或Archive,就会自动上传符号表
  • 如果你还想更进一步的了解,请参考https://bugly.qq.com/docs/user-guide/symbol-configuration-ios/?v=20171109131920

到此接入Bugly完毕,中间遇到什么问题请自行摸索或参考官方文档。

20赞

66666666:clap:

赞一下。…

其实我可以搞个插件,自动帮你完成这些修改:joy:

4赞

来,写了它

2赞

终于等到了

坐等,赞

推大神!

顶,占个位置!

.回复怎么删了呀。。不搞了?

更新了:Android符号文件的自动上传

1赞

666
想问一下大家,WEB混淆方式,一般用什么方法获得脚本错误?

@colinsusie 大佬,iOS 快补上啊

1赞

这个 1.6.2 能用否?

6666666666,感谢分享:+1:

1.7的绑定API跟1.6.2完全不同。
但是这个思路是类似的。
panda在1.6.2中也在ScriptingCore中封装出了 setReportExceptionCallback的接口。你可以照着改改。

ScriptingCore中封装 setReportExceptionCallback的接口 这个方式已经在使用了 ios 没有解决方案 而且感觉报错很混乱 偶尔根据行号找不到对应的代码 好奇怪.

那我就不知道了,1.6的问题可以问@panda。

一下午撸出来了,欢迎提意见,插件写的比较垃圾哈
http://forum.cocos.com/t/bugly/52947

3赞

坐等IOS接入