天天看点

Android Fabric Crashlytics Native 代码符号表

转载请注明出处。原文链接:https://www.jianshu.com/p/a87f5d5663ad

简介

Crashlytics 支持捕获Native层的异常并上报,官网的文档有具体而详细的教程。但是在符号表这一块儿,说的比较简单,虽然给出了上传符号表的方法,但是对于符号表的管理这一块没有给出解释和说明。

符号表

首先我们要弄明白符号表是什么?接触过Native开发的应该有经验,当Native发生崩溃的时候,在Logcat中呈现的log很多都是各种内存地址,Native堆栈很多也是以内存地址的形式体现的。像

0x7f04661c9c

等,这些堆栈我们并不能获取有效信息,定位Crash。而符号表就是帮助我们解析这些堆栈信息的,经过符号表的解析,这个内存地址会定位到某个cpp文件的某一行,这样子的堆栈对我们才是有意义的。

符号表的生成与上传

Fabric对Android Studio 提供了插件,根据官网的引导,在需要上传符号表的module的gradle文件里面加上

apply plugin : ‘io.fabric’

crashlytics {enableNdk = true}

。之后,会生成6个新的task:

crashlyticsGenerateSymblosDebug
crashlyticsCacheSymblosDebug
crashlyticsUploadSymblosDebug
crashlyticsGenerateSymblosRelease
crashlyticsCacheSymblosRelease
crashlyticsUploadSymblosRelease 
           

分别是生成、缓存、上传符号表的,Debug和Release各三个。每次构建之后,只需要执行上传的任务就可以了,因为上传会触发构建和缓存。

符号表与版本的关系

为了验证符号表和版本的对应关系,我写了一个直接在Native触发崩溃的测试代码,点击按钮之后就会产生一次Native的Crash。经过多次实验,得到结论如下:

  1. Debug 和 Release符号表不通用。
  2. 符号表必须在崩溃产生之前上传,上传之前统计的崩溃不能按照符号表进行解析,因此建议大家构建aar或者apk之后马上按需上传符号表。
  3. 符号表和版本的映射好像是构建时,我拿同样的代码跑了两次,第二次如果不重新上传符号表,还是无法解析。
  4. 不同版本aar或apk不用担心符号表覆盖等问题。即:fabric会记录不同构建对应的符号表,后构建不会对先构建的产生影响。
  5. 针对3的实验,发现不同的符号表解析之后如果堆栈相同,在fabric的dashboard里面会合并展示。

针对以上内容,建议大家把上传符号表的任务加在构建完成之后执行。

继续阅读