Crashlytics:混淆原生.so库的同时能否获得符号化崩溃报告?
原生SO库混淆与符号化崩溃报告共存方案
完全可以实现两个需求同时满足,不需要二选一
你之前对-fvisibility=hidden的作用存在认知偏差:该参数只是隐藏了SO库的公开导出符号表,打包到APK中的strip后的SO文件确实无法通过nm -gDC <.so库路径>查看到内部函数名,满足混淆保护的要求,但编译过程中生成的未strip的带完整调试信息的SO文件,依然保留了所有函数名、代码行号等完整符号信息,和Kotlin混淆后保留mapping文件的逻辑完全一致。
具体实现步骤
- 编译C++库时输出两个版本的SO文件
- 打包入APK的版本:开启
-fvisibility=hidden参数,同时执行strip操作移除所有调试信息和私有符号,该版本体积小、外部无法逆向获取内部函数名,满足混淆要求 - 留存备用的版本:保留编译生成的未strip的完整SO文件,该文件仅在本地/CI后台存储,不打包到APK中
- 打包入APK的版本:开启
- 配置崩溃收集工具符号化规则
Crashlytics原生支持私有符号表上传能力,你只需要在打包发布时将对应版本的未strip SO文件上传到Firebase后台,Crashlytics采集到原生崩溃后,会自动用你上传的完整符号表将内存地址堆栈转换为可读的函数名、行号信息,和Kotlin混淆后用mapping文件符号化的逻辑完全相同。
你看到的旧回答提到无法共存,是因为早期Crashlytics对原生库符号的支持能力不完善,2019年之后更新的Firebase Crashlytics版本已经完全支持该方案。
注意事项
- 禁止将未strip的SO文件打包到APK中,否则会失去混淆保护效果
- 每个发布版本都要对应留存匹配的未strip SO文件,避免版本不匹配导致符号化失败
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

