第三方 sdk 原理讨论-崩溃 sdk (持续更新)

讨论 · dennycai · 于 发布 · 最后由 zhangallegg回复 · 1309 次阅读
96

现在第三方服务越来越多,而且越做越细,作为开发者是否有思考过他们是什么原理实现的?
我们或多或少的使用过第三方的sdk,我认为崩溃日志上报是一个基础服务,就我目前了解的三方服务有:bugly、网易云捕 、友盟等。
我们来一起讨论一下崩溃报告sdk到底是基于什么原理来实现的,我在这里抛砖引玉。

1 Java Crash

这个比较简单,大部分使用Thread.UncaughtExceptionHandler来捕获java异常,如果还有其他更好的方法,感谢大家补充。

2 Native Crash

Android内核是linux,所以大部分通过sigaction来自定义崩溃时linux系统发出的signal处理器。
例子:

const int signals[] = {
        SIGSEGV,SIGABRT,SIGFPE,SIGILL,SIGBUS
};
void registerCrashSignal() {
    struct sigaction* handler = new struct sigaction();
    handler->sa_sigaction = handleSignal;
    handler->sa_flags = SA_SIGINFO;

    for (int i = 0; i < size; ++i) {
        int signal = signals[i];
        sigaction(signal,handler,&def_handler[signal]);
    }
}

signals里面存放你所关心的信号值,不同信号值的意思可以参考地址
获取异常堆栈信息是难点
下面列举几个方案和我遇到的问题:
1. 使用dlfcn动态加载/system/lib/的库,5.0以下动态加载libcorkscrew,5.0以上动态加载libbacktrace。
2.使用unwind获取堆栈信息。
3.logcat -d -v time -s 'DEBUG:I'收集系统日志。
4.使用Google Breakpad
问题:
方案一、遇到6.0以上加载失败,4.1.1函数名为空。
方案二、暂时找不到完整的Demo,兼容性未知,5.0以上堆栈信息不全,不清楚如何计算偏移量
方案三、可能需要开启其他进程去抓取。需要READ_LOGS权限,但是看到官方文档就懵逼了Not for use by third-party applications, because Log entries can contain the user's private information.
方案四、需要进行裁剪
看了一下微信开源的mars,崩溃捕捉是使用方案三,连接
bugly和云捕都看到unwind的身影、友盟好像没有捕捉native崩溃
欢迎大家讨论,如有错误还请及时指出。

共收到 2 条回复
96
dennycai · #1 ·

做好了采集工作,再结合ACRA那就是一套完整的sdk了

3623 1483510490

刚注册的新用户 虽然很多看不懂 但还是比较走心的 顶楼上

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册