You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:47:21