ROOT_PATH := $(call my-dir)

如下是你 breakpad 项目的路径,直接引用其中的 Android.mk 编译,此步骤编译产物是一个静态库,名字为 breakpad_client,这是官方代码,我们没做任何修改哦。

include $(ROOT_PATH)/third-breakpad/android/google_breakpad/Android.mk

LOCAL_PATH := $(ROOT_PATH)

include $(CLEAR_VARS)

我们项目中对其包装的 jni 层 so 名字

LOCAL_MODULE := native-crash

我们项目中对其包装的 jni 层代码

LOCAL_SRC_FILES := NativeHandler.cpp

我们项目中链接 breakpad 项目静态产物

LOCAL_STATIC_LIBRARIES += breakpad_client

include $(BUILD_SHARED_LIBRARY)

如上一把梭就完成了,没啥难度,然后 java 层直接使用即可,如上你要看不懂就自己去学习下 C 编译原理及 NDK 相关基础吧。 当然是不要脸的附上我的 demo 地址https://github.com/yanbober/android-crash/tree/master/native-crash-core,很不幸的是这个项目夭折了,不过 native 捕获这块没啥大问题。

如果你想用 CMake,那更不用我说了,直接就是把上面这些 mk 翻译下就行,怎么翻译成CMakeLists.txt我就不扯蛋了。

【工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果。+微信 codedeveloper 联系我】

Breakpad 怎么用

========================================================================

如下从几个维度分析说明了如何使用。

构建 so 注意事项

这里要特别注意一个问题,记得每次构建备份自己 obj 带符号表的 so 文件,发布一定要用不带符号表的小体积 so 文件,别搞混了,别问我为什么,这是常识。

获取 native crash 后的 dump

如上一顿操作后你会发现,你只用在你项目初始化时给他喂个路径就行,然后就等着 native 奔溃后触发他往你路径下写一个.dump文件吧。

如果你需要线上使用且需要保留所有的 dump,那就自己简单封装管理下文件目录啥的吧,然后每次启动发现有这个文件就上传到你服务器吧。

dump 文件怎么转成可阅读的崩溃堆栈

假设你程序现在 native crash 了,你也从服务端拿到 dump 文件了,接着我们需要对其做解析即可。

解析工具从哪来?还是 Breakpad 编译就行,具体参见官方文档里如何编译 minidump_stackwalk 工具部分吧。

如果你像我一样足够懒,或者因为第一次编译了 minidump_stackwalk 工具但是后来丢了,这时候你的第一选择肯定就是重新拉代码编译出一个工具。我想说的是,你可以偷懒,哈哈。

现成的 minidump_stackwalk 工具在哪里?

在这里,无论你是 Mac、windows、linux,我都试过,在 Android Studio 的安装目录下的bin\lldb\bin里面就存在一个对应平台的可执行文件叫做 minidump_stackwalk,这就是偷懒的办法。

所以我们直接用这个工具执行解析 dump 即可,如下操作:

./minidump_stackwalk xxooxx.dump > crash.txt

dump转换成可阅读崩溃堆栈文件后怎么分析

打开crash.txt你会发现类似如下的日志:

Operating system: Android

0.0.0 Linux 4.14.116 #1 SMP PREEMPT Wed Apr 8 17:01:19 CST 2020 armv8l

CPU: arm

ARMv1 ARM part(0x4100d0b0) features: half,thumb,fastmult,vfpv2,edsp,neon,vfpv3,tls,vfpv4,idiva,idivt

8 CPUs

GPU: UNKNOWN

Crash reason: SIGSEGV

Crash address: 0x0

Process uptime: not available

Thread 0 (crashed)

0 test.so + 0x18efd86

r0 = 0x00000000 r1 = 0x00000000 r2 = 0x7fffffff r3 = 0x00000000

r4 = 0x0000002a r5 = 0xffdfd948 r6 = 0xd1403280 r7 = 0xd13cdd14

r8 = 0xffdfd4f4 r9 = 0xffdfd940 r10 = 0xffdfd944 r12 = 0xffdfd4b8

fp = 0xffdfd4f4 sp = 0xffdfd4e0 lr = 0xf3d6886d pc = 0xcfc03d86

Found by: given as instruction pointer in context

通过上面的Crash reason: SIGSEGV我们可以知道是 unix 系统里的哪种类型错误,最关键的其实是(crashed)关键词开始的行,显示了哪个 so 哪里 crash 了,即test.so + 0x18efd86显示了发生 crash 的位置和寄存器信息。

有了具体的崩溃寄存器信息,我们接下来直接进行符号解析即可,然后就能直接看到是源码的哪一行崩溃了,直接去修复即可,使用 Android NDK 里面提供的 addr2line 工具(SDK 里面自己找)将寄存器地址转换为对应符号。记得 addr2line 要用和自己 so 的 ABI 匹配的目录(上面crash.txt中有崩溃 so 的 ABI 信息)。

arm-linux-androideabi-addr2line -f -C -e obj-test.so 0x18efd86

//具体崩溃代码位置,其他行号啥的自己去看 addr2line 参数列表吧

xxxxxxFunc()

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

面试复习笔记:

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。 节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960页Android开发笔记》

《1307页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: 


大家都在找:

Android:android软件工程师

大家都在看: