CameraX ImageProcessingUtil在联发科特定处理器上报fdsan错误求助
CameraX fdsan崩溃问题(联发科MT6765/MT6765p95专属)
问题概述
- 仅在联发科MT6765(Helio G37)和MT6765p95(Helio P95)设备上触发
- 触发场景:用户遮挡摄像头导致屏幕变黑时,应用出现低级别fdsan错误崩溃
- 代码完全遵循CameraX官方规范,但因无对应测试设备无法复现,常规修复手段无效
相关CameraX代码示例
private fun startCamera() { val cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener({ val cameraProvider = cameraProviderFuture.get() val preview = Preview.Builder() .build() .also { it.setSurfaceProvider(binding.viewFinder.surfaceProvider) } val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA try { cameraProvider.unbindAll() val camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview) this.camera = camera } catch(exc: Exception) { Log.e(TAG, "Use case binding failed", exc) } }, ContextCompat.getMainExecutor(this)) }
崩溃堆栈信息
Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0xdeadbaad in tid 12345 (camera-camera2), pid 1234 (com.example.app) backtrace: #00 pc 00000000000a1234 /system/lib64/libc.so (fdsan_error+124) #01 pc 00000000000a1456 /system/lib64/libc.so (fdsan_check_ownership+230) #02 pc 0000000000067890 /system/lib64/libc.so (close+48) #03 pc 00000000000abcde /system/lib64/libcamera2ndk.so (ACameraDevice_close+62) #04 pc 0000000000123456 /system/framework/arm64/boot.oat (art_jni_trampoline+146) ...
针对性解决方案建议
- 严格管控Camera资源生命周期:在Activity/Fragment的
onPause/onStop阶段主动解绑所有CameraX用例,避免系统回收摄像头文件描述符时出现所有权冲突:private var cameraProvider: ProcessCameraProvider? = null private var camera: Camera? = null override fun onPause() { super.onPause() cameraProvider?.unbindAll() camera = null } - 强制启用CameraX兼容配置:初始化CameraProvider时指定Camera2兼容配置,绕过联发科平台的底层NDK接口调用问题:
val cameraConfig = Camera2Config.defaultConfig() val cameraProviderFuture = ProcessCameraProvider.getInstance(this, cameraConfig) - 添加异常重试机制:在绑定用例的异常捕获块中,针对摄像头相关错误添加延迟重试逻辑,避免单次崩溃导致应用退出:
catch(exc: Exception) { Log.e(TAG, "Camera binding failed", exc) Handler(Looper.getMainLooper()).postDelayed({ if (!isFinishing) { startCamera() } }, 1000) } - 监听摄像头遮挡状态:通过CameraInfo的状态监听,在摄像头被遮挡时主动暂停预览并解绑资源,提前规避系统层面的资源回收触发点:
camera?.cameraInfo?.cameraState?.observe(this) { state -> when (state.type) { CameraState.Type.PENDING_OPEN, CameraState.Type.CLOSED -> { cameraProvider?.unbindAll() } } } - 提交官方问题反馈:将设备型号、崩溃堆栈、代码片段整理后提交给CameraX官方团队,确认是否为联发科平台专属的框架底层bug,等待官方修复补丁。
内容的提问来源于stack exchange,提问作者sweak
相关产品推荐
相关产品推荐

