准备:把ndk目录加到$PATH。
首先得到代码
svn co http://google-breakpad.googlecode.com/svn/trunk breakpad
然后把整个代码目录breakpad复制一份,一份用来编译Linux的tool,一份编Android的静态库。
编译Tool:
- cd breakpad
- chmod +x configure
- ./configure
- make
编译android静态库:
- cd breakpad
- SYSROOT=$android-ndk-r8d/platforms/android-8/arch-arm
- export CC="arm-linux-androideabi-gcc --sysroot=$SYSROOT"
- ./configure --disable-processor --disable-tools --host=arm-linux-androideabi
然后新建一个terminal(为了把export CC的效果去除),继续:
- cd breakpad
- cd android/sample_app
- ndk-build
这样就能编出示例程序。
加到自己的程序:
在自己的Android.mk里加入
- include $(LOCAL_PATH)/src/breakpad/android/google_breakpad/Android.mk
C/C++代码里加入:
- #include
- #include
- #include
- #include
- #include
- #include
- #include "client/linux/handler/exception_handler.h"
-
- static google_breakpad::ExceptionHandler *handler = NULL;
-
- JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
- {
- google_breakpad::MinidumpDescriptor descriptor("/sdcard");
- handler = new google_breakpad::ExceptionHandler(descriptor,
- NULL,
- NULL,
- NULL,
- true,
- -1);
- return JNI_VERSION_1_6;
- }
在JNI_Onload里注册client。
然后Java代码里加载你的so。
- System.loadLibrary("MySo");
如果崩溃了,会在/sdcard/下生成 UUID.dmp(UUID是真的一串UUID)。
把UUID.dmp拷贝出来,然后参考这个做。
http://blog.csdn.net/brook0344/article/details/20126351
得到崩溃堆栈文本后,使用addr2line来把函数地址转换成代码行
参考这个:
http://blog.csdn.net/yanzheng1113/article/details/8148091
google-breakpad在我们项目的位置在:external\google-breakpad,目前是集成在build的版本内的。