网上有很多Android项目集成Google breakpad的文章但是都不是很全,自己弄了很久结合大家经验参考Google breakpad的事例项目,总算整合成功了。
1.首先下载Google breakpad源代码,地址:https://github.com/google/breakpad 下载后改名为breakpad
下载解压后的目录
2.集成Google breakpad在后续解读dump文件的时候需要Linux系统才能完成,这里我只讲一下client端的集成,这个阶段不需要Linux系统也能完成。
以cocos creator空项目为例,配置完Android打包需要的ndk,sdk,ant,构建项目,只需要构建成功即可
这里已经构建成功了。
3.把下载来的Googlebreakpad放到cocos2d-x的根目录下,这个不是固定的你可以自由选择,只要搜索路径设置对就行。
使用使用Android studio打开构建好的项目,修改配置。
找到项目的Android.mk进行修改
添加google breakpad的搜素路径,方便在你的项目中去包含Google breakpad的头文件,路径于你googlebreakpad源码包放置位置有关,如果你不是在cocos2d-x目录下就自己去调
添加google breakpad的静态库
添加google breakpad模块,添加google breakpad,Android项目的,mk文件
4.在mian.cpp中引用googlebreakpad的
添加需要的头文件
#include "client/linux/handler/minidump_descriptor.h" #include "client/linux/handler/exception_handler.h"在app_init中添加googlebeakpad的崩溃处理
google_breakpad::MinidumpDescriptor descriptor("."); google_breakpad::ExceptionHandler* eh = new google_breakpad::ExceptionHandler(descriptor, NULL, DumpCallback, NULL, true, -1);descriptor()参数为dump文件保存位置 方便测试可以写“sdcard”
添加dumpcallback函数
bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) { LOGD("Dump path: %s\n", descriptor.path()); return succeeded; }现在可以尝试编译一下了。
这个时候编译没有语法错误了,也能找都googlebreakpad目录,但会出现这个错误
大概意思说你 __STDC_FORMAT_MACROS 这个宏
5.这个时候打开项目的Application.mk文件
插入在APP_CPPFLAGS 追加缺少的这个宏 -D __STDC_FORMAT_MACROS
然后继续编译... 这个编译很慢请耐心等待...
你没有看出这次编译还是会出错,不过如果你能到这个一步,就离成功不远了。来看这个错误
错误大概意思是说utf16转utf32失败了
6.这个时候打开breakpad\android\google_breakpad目录找到Android.mk进行修改
添加../external/sources/ConvertUTF/ConvertUTF.c\
删除src/common/convert_UTF.c \
这里是替换成cocos2dx中对UTF字符操作的库
同时修改breakpad\src\common目录下string_conversion.cc文件
中的#include "common/convert_UTF.h"替换成cocos2d-x中的 #include "../../external/sources/ConvertUTF/ConvertUTF.h"
再次编译,就能够通过了。
7.测试自己写一个崩溃函数,就行了如果你的dump目录是sdcard下话真机测试,在崩溃后就会有一个一连串字符组合的后缀名为.dump文件了,有了dump文件发给服务器就行了,后面对dump文件的操作,大家可以去看其他的文章,这里就不在赘述了。
8.注意:dump文件只有真机测试能够生成,模拟器不行。
如果你把崩溃函数加在了appinit函数中那么会生成很多个dump文件这个不是你的错是js的问题,所以建议大家在creator项目中设置个按钮在回调时,利用jsb调C++中写的崩溃函数。这样只会得到一个dump文件。