和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、 CameraProvider进程中hidl文件
二、CameraProvider进程启动时序图
三、CameraProvider 进程类图(后续会更新)
四、CameraProvider进程的启动流程
五、总结:
一、 CameraProvider进程中hidl文件
HIDL文件 | 服务端 | 客户端 | BinderName |
---|---|---|---|
ICameraProvider.hidl | CameraProvider进程(CameraProvider.cpp) | CameraService进程中使用(CameraProviderManager:: ProviderInfo) | legacy/0 |
ICameraDevice.hidl | CameraProvder进程中(CameraDevice.cpp) | CameraService进程中使用 | 匿名Binder |
ICameraDeviceCallback.hal | CameraService进程 | CameraProvider进程中CameraDevice.cpp在open()函数中作为参数传递进来 | 进程间的回调 |
ICameraDeviceSession.hal | CameraProvider进程 CameraDeviceSession.cpp | 在CameraService进程打开摄像头流程中CameraProviderManager::openSession获取 | 匿名Binder |
type.hal | CameraProvider进程 |
二、CameraProvider进程启动时序图
image
三、CameraProvider 进程类图(后续会更新)
image
四、CameraProvider进程的启动流程
4.1. CameraProvider是Camera的Hal层程序(android.hardware.camera.provider@2.4-service )。这是一个独立的进程,它在系统启动的时候就会启动。它通过HIDL机制来和native层的CameraService进程进行通信。
它的启动由rc文件控制(//hardware/interfaces/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service.rc)
service vendor.camera-provider-2-4 /vendor/bin/hw/android.hardware.camera.provider@2.4-service
class hal
user cameraserver
group audio camera input drmrpc
ioprio rt 4
capabilities SYS_NICE
writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks
4.2.cameraprovider 程序的入口Service.cpp
#define LOG_TAG "android.hardware.camera.provider@2.4-service"
#include <android/hardware/camera/provider/2.4/ICameraProvider.h>
#include <hidl/LegacySupport.h>
#include <binder/ProcessState.h>
using android::hardware::camera::provider::V2_4::ICameraProvider;
using android::hardware::defaultPassthroughServiceImplementation;
int main()
{
ALOGI("Camera provider Service is starting.");
// The camera HAL may communicate to other vendor components via
// /dev/vndbinder
android::ProcessState::initWithDriver("/dev/vndbinder");
// 在LegacySupport.h中defaultPassthroughServiceImplementation为模板类函数,将会通过 sp<ICameraProvider> service =
// ICameraProvider::getService(name, true /* getStub */) 获取 CameraProvider 实例化对象,以上操作,将会进入 CameraProviderAll.cpp。
return defaultPassthroughServiceImplementation<ICameraProvider>("legacy/0", /*maxThreads*/ 6);
}
这里ICameraProvider.hal 会生成
ICameraProvider.h
BpHwCameraProvider.h
BnHwCameraProvider.h
CameraProviderAll.cpp文件。 其中CameraProviderAll.cpp是上面上个头文件的具体内容。
然后这里的defaultPassthroughServiceImplementation()是模板函数,会调用到CameraProviderAll.cpp里面(这里使用的是HIDL直通式,所以会调用到ICameraProvider对应的CameraProviderALL.cpp中的getService()中,这个相当于是一种固定模式)
CameraProviderAll.cpp:
#CameraProviderAll.cpp:
//这里传递过来的 serviceName--"legacy/0" getStub--true (defaultPassthroughServiceImplementation()过来的流程)
::android::sp<ICameraProvider> ICameraProvider::getService(const std::string &serviceName, const bool getStub) {
return ::android::hardware::details::getServiceInternal<BpHwCameraProvider>(serviceName, true, getStub);
}
system/libhidl/transport/include/hidl/H