本文以Android 7.0 代码为主,camera代码使用的是MTK平台的,抛开其它方面的信息,单纯以初始化打开相机为主线分析,主要在上层到底层的调用过程上,有些细节研究的不深还需要后续接着分析。
APP
/vendor/..../package/app/Camera
CameraActivity.java onCreate()
CameraDeviceCtrl.java
在这个函数中,可以看到调用了一个线程去启动相机,在调用结束以后会设置camera的state为opening,保证相机状态是正确的。
PS:在这里,camera的状态只是被设置为 OPENING,查看CameraState以后发现,总共有三个状态,分别为:
查看CamearStartUpThread发现,这个Thread是CameraDeviceCtrl的一个内部线程,openCamera()函数如下:
可以很明显的看到这个函数前面有synchronized修饰符,并且调用了notifyAll(),调用notiify以后会唤醒使用了wait()函数的线程,查看后发现在如下位置进行了调用:
在这个run函数中存在一个if语句,在CameraActivity.java的onCreate()函数中初始化
CameraDeviceCtrl,并且在调用openCamera之前,而
CameraDeviceCtrl构造函数中又把if的条件置为了true,所以run函数会跑到wait处等待。if退出后又看到了openCamera()。