CocosCreator快速接入bugly

  • 前言
  • 接入
    • 创建CCC工程并编译原生项目
    • Bugly原生SDK接入
      • 安卓端接入
        • 集成sdk
        • 初始化及方法实现
      • IOS接入
        • SDK接入
        • 初始化及方法实现
    • C++代码修改
      • 捕获异常
      • 调用java方法
      • 调用OC方法
    • 最后一步
  • 效果查看
  • 总结

前言

目前从我了解的渠道来看,bugly接入的方式主要有两种:

  • 使用“年久失修”的Cocos plugin
  • 使用js的window.onError接口
    本文要介绍的是第三种方式,c++抛出异常,原生进行上报,这种方式的好处是:
  1. 相对Cocos plugin而言,无需另外接入一套c++的sdk,并且安卓无需修改mk文件。
  2. 相对js脚本报错,这种方式更加灵活,且更容易做成公共模块

接入

创建CCC工程并编译原生项目

首先我们创建一个CCC工程,

脚本挂载如下

可以看到我们并没有拖入label节点,所以这段代码是会报错的,然后我们构建原生工程,因为这里要介绍ios和android的接入,所以我们构建了android和ios两个平台,构建后的目录

我使用的CCC是2.4.X版本,不同版本会略有差异,但不影响接入。

Bugly原生SDK接入

安卓端接入

如果你对安卓比较熟悉,请参考官方文档接入,如果你不是很熟悉,可以参考我的接入方式

集成sdk

打开Module(就是app目录)的build.gradle,添加bugly的依赖,添加完毕后的代码

dependencies {implementation fileTree(dir: '../libs', include: ['*.jar','*.aar'])implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])implementation fileTree(dir: "/Applications/CocosCreator/Creator/2.4.3-rc.1/CocosCreator.app/Contents/Resources/cocos2d-x/cocos/platform/android/java/libs", include: ['*.jar'])implementation project(':libcocos2dx')implementation 'com.tencent.bugly:crashreport:latest.release'implementation 'com.tencent.bugly:nativecrashreport:latest.release'
}

这里的latest.release指最新版本,推荐各位指定版本,这样以后编译速度会快点。

初始化及方法实现

看到很多对安卓不太了解的开发者,根据官方事例,将许多方法写到了AppActivity中,其实这样既不美观也不利于后期维护,推荐各位将模块划分清楚,这里我在包下面建立一个BuglyAgent.java文件,来实现bugly的功能。
本demo主要介绍异常上报,所以实现了两个方法:初始化及异常上报。详细代码

package cn.xyzzlky.bugly;import android.content.Context;import com.tencent.bugly.crashreport.CrashReport;import java.util.Map;public class BuglyAgent {public static void initSDK(Context context, String appId) {CrashReport.initCrashReport(context.getApplicationContext(), appId, false);}public static void postException(int category, String name, String reason, String stack){postException(category, name, reason, stack, null);}public static void postException(int category, String name, String reason, String stack, Map<String, String> extraInfo){CrashReport.postException(category, name, reason, stack, extraInfo);}
}

方便c++那边的代码调用,所以我直接将最后一个参数设置为null了。别忘了在合适的位置(比如AppActivity)初始化SDK

public class AppActivity extends Cocos2dxActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// ...BuglyAgent.initSDK(this, "Bugly的APPID");// ...}
}

Android的原生接入到这里就结束了,你只要记住你实现异常上报方法的包名、类名和方法名就可以了,比如我这里的包名是,cn.xyzzlky.bugly,类名是BuglyAgent,方法名是postException。

IOS接入

如上一致,如果你对ios比较熟悉,请直接参考官方文档接入,如果不熟悉,可以参考我的方法

SDK接入

  1. 如果你已经安装了cocoa,请直接pod接入
  2. 如果没有,你可以安装cocoa,然后用方法1,也可以下载下来,然后参考官方文档,注意选项和依赖库

初始化及方法实现

相关代码不多介绍,直接贴出来
BuglyAgent.h代码

@interface BuglyAgent : NSObject+ (void)initSdk:(NSString *)appId;
+ (void)reportExceptionWithCategory:(NSUInteger)category name:(NSString *)name reason:(NSString *)reason callStack:(NSArray *)stackArray  extraInfo:(NSDictionary *)info terminateApp:(BOOL)terminate;@end

BuglyAgent.mm 代码

#import "BuglyAgent.h"
#import <Bugly/Bugly.h>@implementation BuglyAgent+ (void)initSdk:(NSString *)appId
{[Bugly startWithAppId:appId];
}+ (void)reportExceptionWithCategory:(NSUInteger)category name:(NSString *)name reason:(NSString *)reason callStack:(NSArray *)stackArray  extraInfo:(NSDictionary *)info terminateApp:(BOOL)terminate
{[Bugly reportExceptionWithCategory:category name:name reason:reason callStack:stackArray extraInfo:info terminateApp:terminate];
}@end

同样的我们在适当的位置(比如AppController.m)初始化sdk

// ...#import "BuglyAgent.h"// ...
@implementation AppController- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// ...[BuglyAgent initSdk:@"Bugly的APPID"];// ...
}

IOS的接入方式也完毕了,同样记住类名和方法名,比如我的类名是BuglyAgent,方法名是reportExceptionWithCategory:name:reason:callStack:extraInfo:terminateApp:

C++代码修改

捕获异常

因为CCC很贴心的暴露了异常捕获的接口,所以我们直接拿来用就好了,位置在**/frameworks/runtime-src/Class/AppDelegate.cpp中,如下:

    se->setExceptionCallback([](const char *location, const char *message, const char *stack) {// Send exception information to server like Tencent Bugly.cocos2d::log("\nUncaught Exception:\n - location :  %s\n - msg : %s\n - detail : \n      %s\n", location, message, stack);   });

调用java方法

c++调用java的方法,使用CCC的JniHelper类就好了,调用方式

 JniHelper::callStaticVoidMethod("类名", "方法名", ...参数);

这里注意类名是全路径,并且包名的".“需要用”/"代替,比如我们调用的方法为

JniHelper::callStaticVoidMethod("cn/xyzzlky.bugly/BuglyAgent", "postException", 5, "JSError", message, stack);

参数解释:

  1. 5是JS错误的标志,Bugly定义的,参考com.tencent.bugly.BuglyStrategy。
  2. 错误的名字,自定义是可以的,Bugly是这么定义的。
  3. 错误的原因
  4. 错误的堆栈

如上,安卓已经接入完毕(其实还有个步骤,下面介绍),直接运行,bugly就可以看到错误了。

调用OC方法

安卓接入了,那ios呢?是不是也直接调用oc呢?不好意思,c++不支持直接调用oc,怎么办?所以我们要写一个c的桥接层,来完成oc的接入。
先把桥接代码奉上
CrashReport.h 代码

class CrashReport
{public:static void reportException(const char* msg, const char* traceback);CrashReport();
};

CrashReport.mm 代码

#include "CrashReport.h"#define BUGLY_CLASS @"BuglyAgent"
#define BUGLY_METHOD_EXCEPTION @"reportExceptionWithCategory:name:reason:callStack:extraInfo:terminateApp:"CrashReport::CrashReport(){}void CrashReport::reportException(const char* msg, const char* traceback) {Class clazz = NSClassFromString(BUGLY_CLASS);if (clazz) {SEL selector = NSSelectorFromString(BUGLY_METHOD_EXCEPTION);NSMethodSignature* signature = [clazz methodSignatureForSelector:selector];NSInteger category = 5;NSString *name = @"JSError";NSString *reason = NULL == msg ? @"" : @(msg);NSString *track = NULL == traceback ? @"" : @(traceback);NSArray *trackArray = [track componentsSeparatedByString:@"\n"];NSDictionary *info = nil;BOOL terminate = NO;if (signature) {NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature];if (invocation) {[invocation setTarget:clazz];[invocation setSelector:selector];[invocation setArgument:&category atIndex:2];[invocation setArgument:&name atIndex:3];[invocation setArgument:&reason atIndex:4];[invocation setArgument:&trackArray atIndex:5];[invocation setArgument:&info atIndex:6];[invocation setArgument:&terminate atIndex:7];[invocation invoke];}}}
}

此处的代码含义,与java一致。
然后就可以供c++调用

// ...
#include "CrashReport.h"
// ...CrashReport::reportException(message, stack);
// ...

同样,运行ios,后台就可以看到日志了。

最后一步

是不是发现,接完ios,安卓貌似报错了,提示#include "CrashReport.h"有错误,对了,因为我们没有进行mk文件修改,在安卓中,我们是没法调用这个方法的,所以我们还要对平台区分,同时为了维护方便,我们把安卓的类名进行常量定义,所以头文件变为

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#define BUGLY_CLZ_NAME "cn/xyzzlky/bugly/BuglyAgent"
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include "CrashReport.h"
#endif

而调用的地方同理

    se->setExceptionCallback([](const char *location, const char *message, const char *stack) {// Send exception information to server like Tencent Bugly.cocos2d::log("\nUncaught Exception:\n - location :  %s\n - msg : %s\n - detail : \n      %s\n", location, message, stack);#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)JniHelper::callStaticVoidMethod(BUGLY_CLZ_NAME, "postException", 5, "JSError", message, stack);
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)CrashReport::reportException(message, stack);
#endif});

这里,我们的工作总算接入完毕了。

效果查看


这里有些建议

  1. 我这js没有加密,如果加密了,原js文件在"js backups (useful for debugging)",建议每个线上包,将这个备份下
  2. 因为可能有热更,所以js报错与app版本可能不一致,推荐各位将js的版本也上报给bugly

总结

一路下来,其实并没有什么难点,而其中原生调用方法,可能各位没看到,其实一开始我也不知道还有这些方法,是根据CocosPlugin的api反推的,所以一些东西还是要多去探索,相关demo会在公众号上传。最后,原创不易,欢迎转载。如果此文对你有所帮助,可以给点打赏。
本人公众号

打赏码

CocosCreator快速接入bugly相关推荐

  1. Android 快速接入腾讯云人脸核身(识别)

    Android 通过 SDK 快速接入腾讯云人脸核身 我的接入代码:https://blog.csdn.net/qq_39836064/article/details/108702725,很久之前写的 ...

  2. 网易云信为你的互联网应用快速接入直播功能

    近年来,随着网络带宽的不断提升和智能硬件设备的高速发展,移动端视频应用如雨后春笋,包扩视频门户.视频社交.在线教育.娱乐直播.企业视频协作.新闻媒体.金融.监控以及医疗等各行业的互联网应用,均存在巨大 ...

  3. 5分钟快速接入钉钉实现钉钉考勤

    一.前言 由于今年疫情影响,假期的无限延长让大家都不得不进行线上办公,说到线上办公就毫无疑问,钉钉是这个疫情假期最大的赢家,APP的火热程度以及下载量甚至压过了微信,跃居App store免费排行榜第 ...

  4. 快速接入 Android BLE 开发的基础框架

    代码地址如下: http://www.demodashi.com/demo/12092.html * Android BLE基础操作框架,基于回调,操作简单.包含扫描.多连接.广播包解析.服务读写及通 ...

  5. cocos2d-x 2.x版本接入bugly的总结

    最开始项目使用的是自己DIY的很简陋的上报系统,后来改成google breakpad来上报,发现其实都做的不太理想,游戏引擎因为版本历史问题存在一些崩溃问题.后来3.x接入了bugly,我这边抽了几 ...

  6. Java 服务接入 OpenTracing(2) -- Java 项目快速接入 OpenTracing

    接入前准备 搭建 Collector 和 Querier 准备被织入 java 项目(如果已经有自己的项目jar包,可以直接跳过此步) 准备 java-specialagent 包 Java 项目织入 ...

  7. 快速接入 微信微博QQ钉钉 原生登录分享

    使用 微博.QQ.微信.钉钉 原生 SDK 接入,提供这些平台的登录.分享功能支持.针对业务逻辑对各个平台的接口进行封装,对外提供一致的表现,在减轻接入压力的同时,又能获得原生 SDK 最大的灵活性. ...

  8. 「开源」快速接入微信微博QQ钉钉登录分享

    使用 微博.QQ.微信.钉钉 原生 SDK 接入,提供这些平台的登录.分享功能支持.针对业务逻辑对各个平台的接口进行封装,对外提供一致的表现,在减轻接入压力的同时,又能获得原生 SDK 最大的灵活性. ...

  9. WMPF微信小程序框架 微信刷脸登录 获取openId 授权获取手机号 快速接入 快速集成

    官方Demo Github:WMPF微信小程序框架 推荐开发前先快速了解API:wiki 快速接入Demo:WMPF快速接入demo 运行环境下载:WMPF运行环境(待上传) 应⽤版本 刷脸 SDK, ...

  10. 山东云则-您身边的物联网专家,助您快速接入物联网

    山东云则信息技术有限公司成立于2016年,是一家专注于物联网行业通信模组.传感器.设备研究.研发.生产及销售于一体的新兴高新技术企业.公司聚集了一批朝气蓬勃.有梦想,有追求的物联网人,他们工作高效.服 ...

最新文章

  1. 报名 | 2019全球AI文创大赛开启项目征集!
  2. 类脑计算的一大突破 BrainScaleS-2
  3. cla作用matlab,共轭亚油酸(CLA)怎么吃?共轭亚油酸副作用
  4. php7 passthru,认识PHP 7虚拟机
  5. [TypeScript] Deeply mark all the properties of a type as read-only in TypeScript
  6. BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
  7. 微软自家的.Net下的JavaScript引擎——ClearScript
  8. Redis系列教程(五):Redis哨兵、复制、集群的设计原理,以及区别
  9. 深度学习数据预处理——批标准化(Batch Normalization)
  10. 比较高效的表格行背景变色及选定高亮JS
  11. 生成整数自增ID(集群主键生成服务)
  12. CAD如何打印出多页PDF保存在一个PDF内
  13. Mac 禁止插上手机自动启动iTunes
  14. laravel seeder 填充数据
  15. 普通风景照如何调色,ps教程
  16. mysql 字段字符串转int_MySQL数据库面试题(2020最新版)(一)
  17. haproxy log日志简单记录
  18. 文件上传中关于MultipartResolver的配置
  19. Spring In Action 03 ---面向切面的Spring
  20. loadrunner11+fiddler+ie 进行多代理录制,可以正常录制http,无法录制https

热门文章

  1. php mysql加入购物车_php 实现简单加入购物车(1)
  2. 给公司、领导提提意见,该怎么写?
  3. 启发式搜索算法 - 以A*为中心来说明启发式算法本质是要找有效的heuristic需要满足的性质
  4. python开发抢票软件_python自动抢票神器
  5. UEFI+GPT双硬盘安装Win10+Ubuntu16.04双系统
  6. springboot 整合阿里云oss
  7. revel MySQL_Revel 教程
  8. 全网最详细的Python自动化测试
  9. 魔兽三界血歌鸿蒙武器怎么合成,《伏魔战记》关于武器材料出处以及合成以及对一些武器的使用心的...
  10. 文件及文件夹删除失败的解决方法