Firebase测试实验室中Flutter集成测试出现原生崩溃
调试并解决Firebase测试实验室中Flutter安卓集成测试崩溃问题
崩溃日志关键信息
崩溃核心原因是尝试对已销毁的互斥锁执行加锁操作,核心日志内容:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: 'google/redfin/redfin:11/RQ3A.211001.001/7641976:user/release-keys' Revision: 'MP1.0' ABI: 'arm64' Timestamp: 2024-03-21 00:21:22-0700 pid: 23236, tid: 8673, name: DartWorker >>> com.indihood.avanti.rc <<< uid: 10274 signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr -------- Abort message: 'FORTIFY: pthread_mutex_lock called on a destroyed mutex (0xb4000079927a2f40)'
问题仅出现在Firebase测试实验室的真实设备,说明是环境相关的线程/资源释放竞态问题。
调试步骤
- 拉取Firebase测试实验室全量日志
在测试配置里开启完整设备日志(包含Dart VM日志、安卓系统日志),获取崩溃前后的线程活动记录,定位对应锁地址0xb4000079927a2f40的操作逻辑。同时启用性能监控,追踪线程创建、销毁和资源占用的时序。 - 本地模拟测试实验室环境
用安卓模拟器复刻日志中的设备(Google Redfin,安卓11),开启release模式、禁用调试选项,尝试复现问题。本地运行测试时添加--enable-vm-service参数,用DevTools监控DartWorker线程的资源操作状态。 - 添加针对性日志与断言
在代码中所有涉及互斥锁、Isolate、异步共享资源的创建/释放位置添加日志,记录锁地址、操作线程ID,对比崩溃日志里的锁地址定位问题代码段。同时给共享资源加断言,检查加锁前锁是否已销毁,提前发现潜在风险。 - 排查版本兼容性
检查当前Flutter SDK版本是否存在线程资源管理的已知Bug,尤其是针对安卓11的情况,尝试升级到最新稳定版或回退到无问题的版本。同时排查第三方依赖(尤其是原生插件、异步操作相关)是否有资源释放不规范的问题。
常见修复方向
- 规范资源生命周期管理
如果是自定义Isolate或DartWorker逻辑,确保Isolate退出时彻底释放关联的互斥锁和共享资源,避免销毁后仍有线程访问。检查原生插件的线程代码,保证互斥锁销毁在所有使用线程完成操作后执行,消除竞态条件。 - 调整测试执行策略
测试实验室设备资源有限,测试用例并发执行可能导致资源释放时序异常。尝试调整测试执行顺序、减少并发数,或者在测试间添加等待逻辑,确保前一个测试的资源完全释放后再执行下一个。 - 临时规避方案(不推荐长期使用)
若暂时无法定位根因,可在安卓build.gradle的release编译配置中添加-U_FORTIFY_SOURCE禁用FORTIFY检查,但这只是临时解决,找到根因后务必恢复。
内容的提问来源于stack exchange,提问作者Vishnu
相关产品推荐
相关产品推荐

