欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android相机启动crash错误排查

程序员文章站 2022-06-30 19:31:00
一个Android的用到相机的service程序,在比较少的情况下会出现在系统启动时crash。log显示是在调用ACameraDevice_createCaptureSession时返回错误ACAMERA_ERROR_STREAM_CONFIGURE_FAIL(这个程序是用jni操作相机的),co ......

一个android的用到相机的service程序,在比较少的情况下会出现在系统启动时crash。log显示是在调用acameradevice_createcapturesession时返回错误acamera_error_stream_configure_fail(这个程序是用jni操作相机的),configure的宽高都是0。再看前面mct线程开启camera的模块的地方,正常应该有6个模块,sensor,iface,isp,stats,pproc,imglib,出错的log只开启了5个,少了最重要的sensor模块。

出错的时候mct没有正常开启sensor模块,没看到任何输出,怀疑sensor这个module根本就没有传给mct。camera的daemon入口在/vendor/qcom/proprietary/mm-camera/mm-camera2/server-imaging/server.c的main函数,会调用server_process_module_sensor_init()初始化sensor,调用server_process_module_init()初始化其他module。然后主循环处理hal事件,如果是camera new session,会一路调用server_process_hal_event()->mct_controller_new()->mct_pipeline_start_session()去开启所有的模块,为每个模块单独启动线程。

server_process_module_sensor_init()会调用sensor自己的初始化函数module_sensor_init()去初始化sensor。server_process_module_sensor_init()只有在把sensor加入module list的时候出错了才会返回false。即使module_sensor_init()失败了,也只是没有把sensor加入到module list,还是会返回true。所以基本上可以确认是sensor初始化失败了。

这应该属于系统出错了,而不是出在我们的程序。再查kernel log,终于发现csid初始化失败了。

09-30 08:06:56.936     0     0 e msm_csid_init: 587 msm_csid_reset failed

默认的csid reset的timeout是100 ms。怀疑硬件上的改动导致reset时间可能不够,偶尔就会初始化失败,增加到500。