camera daemon启动过慢

问题描述:

发现在android 加密的情况下,mm-camera-daemon进程会在手动解锁以后才会启动,这就导致在cameraserver启动的时候无法匹配到对应的camera devices。进而导致后悔一直connect camera 失败,提示没有对应的camera.


android 8.0 系统启动的时候会启动涉及camera的进程有三个:

1、[email protected]

该进程的启动控制在:hardware/interfaces/camera/provider/2.4/default/[email protected]

2、cameraserver

该进程的启动控制在:frameworks/av/camera/cameraserver/cameraserver.rc

3、mm-qcamera-daemon

该进程的启动控制在:device/qcom/XXXX/init_target.rc


[email protected]启动以后会通过hal层的interface接口获取底层的camera devices等信息,

hardware/qcom/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_interface.c

然而这个底层的camera probe 是在mm-camera-daemon中进行的。

但是在android 加密的情况下,mm-qcamera-daemon会等到手动解锁以后才会启动,导致mm-qcamera-daemon启动太慢,hal无法获得camera的驱动信息,进而认为没有camera,后续就会出现camera一直连接不上,报错:

03-20 14:40:07.880  2061  2193 I CameraService: CameraService::connect call (PID -1 "com.hmdglobal.camera2", camera ID 0) for HAL version 256 and Camera API version 1

03-20 14:40:07.881  2061  2193 E CameraService: CameraService::connect X (PID 13570) rejected (invalid camera ID 0)

即提示没有对应的camera。

解决方法是:

在mm_camera_interface.c中

get_num_of_cameras时候添加判断当前是否加密状态,若加密状态,则一直自循环,知道解锁后再去获取camera。


具体patch:
@@ -1772,6 +1772,38 @@ void sort_camera_info(int num_cam)
     return;
 }
 
+
+/*===========================================================================
+ * FUNCTION : checkEncryptionCompleted
+ *
+ * DESCRIPTION: check data encryption completed or not
+ *
+ * PARAMETERS :
+ *
+ * RETURN : status of encryption process
+ *==========================================================================*/
+bool checkEncryptionCompleted()            //添加判断函数,判断当前是否加密状态
+{
+ char property[PROPERTY_VALUE_MAX];
+ bool is_EncryptionDone = false;
+ property_get("ro.crypto.state", property, "unencrypted");
+ if (!strcmp(property, "encrypted")) {
+ property_get("ro.crypto.type", property, "block");
+ if (!strcmp(property, "block")) {
+ property_get("vold.decrypt", property, "");
+ if (!strcmp(property, "trigger_restart_framework")) {
+ is_EncryptionDone = true;
+ }
+ }
+ } else if (!strcmp(property, "unsupported")) {
+ is_EncryptionDone = true;
+ LOGE(" Encryption not enabled , skip this");
+ }
+ return is_EncryptionDone;
+}
 /*===========================================================================
  * FUNCTION   : get_num_of_cameras
  *
@@ -1874,16 +1905,18 @@ uint8_t get_num_of_cameras()
 
     cfg.cfgtype = CFG_SINIT_PROBE_WAIT_DONE;
     cfg.cfg.setting = NULL;
+
+ while (1) {                    //添加循环判断,该循环10s执行一次
+ if(checkEncryptionCompleted()){
+ LOGD("Data Encryption completed, start Camera Daemon");
+ break;
         }
+ LOGD(" Camera Daemon not started yet , Waiting for encryption to complete");
+ }
+
+ if (ioctl(sd_fd, VIDIOC_MSM_SENSOR_INIT_CFG, &cfg) < 0)
     close(sd_fd);
     dev_fd = -1;




猜你喜欢

转载自blog.csdn.net/wing12345678910/article/details/79723618