native crash

http://geek.csdn.net/news/detail/50839

安卓捕获RuntimeException,ANR,Native信号异常 - 简书

android 异常捕获-UncaughtExceptionHandler - 简书 (UncaughtExceptionHandler)

https://github.com/google/breakpad/blob/master/docs/getting_started_with_breakpad.md(Breakpad)

背景

  网上有一些分析native crash捕获的方法,拿来分析学习,看能不能集成到自动化里面

Android端的崩溃有两种,Java crash和Native crash,我们通常说的crash一般指的是Java层crash,Native crash主要指C/C++代码(其在Android工程中以动态链接库的形式存在)的崩溃,一般难以抓取。

一、native crash介绍

下图为Android系统框架图,NativeCrash主要就是在图中红框部分发生的崩溃。

Android中C/C++开发部分称之为NDK,Android开发中引入NDK一般是基于如下考虑:
数据安全:java层代码易被反编译,而C/C++库反汇难度较大。
性能考虑:将要求高性能的应用逻辑使用C开发,提高应用程序的执行效率。
便于移植:用C/C++写得库可以方便在其他的嵌入式平台上再次使用

二、分析方法

对于NativeCrash,其复现难度大,且需要手机root权限(Native崩溃日志存储在手机的/data/tombstones目录下)。总结目前有两种方法获取Android端线上Native Crash的崩溃信息,分别是基于开源工具google-breakpad和基于c/c++信号异常处理。

1、google-breakpad分析方法

 方法介绍详细见wiki:Android端线上NativeCrash收集的两种方法(上) - 简书

Google Breakpad作为跨平台的崩溃转储和分析模块(支持Windows、OS X、Linux、iOS和Android等),便是通过类似的MiniDump机制来获取崩溃堆栈的。

通过Google Breakpad捕获信号异常,并将堆栈信息写入你指定的本地MiniDump文件中。下次启动应用程序的时候,便可以读取该MiniDump文件进行相应的操作,比如上传到后台服务器。

考虑到我们不是APP的测试,我们用logcat获取崩溃信息足够了,所以此工具没必要集成。

2、Linux信号异常捕获分析方法

so库一般通过gcc/g++编译,崩溃时会产生信号异常,当我们的代码导入第三方的so包的时候,由于c/c++代码的一些问题,产生native信号,就会造成应用直接崩掉,然后报一大堆的汇编的堆栈信息.举例如下方法:

private native int nativeRegisterHandler();
private native boolean nativeMakeError();

实行思路,就是定义一个跟底层交互的handler,当捕获到crash的时候,会通过回调得知,发生crash之后的出来,可根据得到回调之后进行处理。

存在的技术问题:

 上述方法存在的一个首要问题,是未提供底层交互的库,需要自己写。难点是如何发现native crash了。 又查找了一些方法,总结如下:

 优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案 - CocoaChina_一站式开发者成长社区  (优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案)

Android端线上NativeCrash收集的两种方法(下) - 简书 (Android端线上NativeCrash收集)

实现原理如下:

总结上面的方法,感觉支持难度较大(研发支持),所以目前不深入研究了。

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/121655348