1. 程式人生 > >Android相機啟動crash錯誤排查

Android相機啟動crash錯誤排查

一個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。