cameraserver.rc
路径 frameworks/av/camera/cameraserver/cameraserver.rc
CameraService是由这个.rc文件启动的关于rc文件参见流程1
service cameraserver /system/bin/cameraserver class main user cameraserver group audio camera input drmrpc readproc ioprio rt 4 writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks rlimit rtprio 10 10
main_cameraserver.cpp
路径 frameworks/av/camera/cameraserver/main_cameraserver.cpp
CameraService::instantiate() 接口定义在 BinderService 中,CameraService继承它,instantiate() 函数定义在
路径 android/frameworks/native/libs/binder/include/binder/BinderService.h
创建一个new CameraService,名为media.camera并将其加入到 ServiceManager 中。
getServiceName() = "media.camera"
因为SP指针的原因下一步调用到的是CameraService::onFirstRef()
int main(int argc __unused, char** argv __unused) { signal(SIGPIPE, SIG_IGN); // Set 3 threads for HIDL calls hardware::configureRpcThreadpool(3, /*willjoin*/ false); sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm = defaultServiceManager(); ALOGI("ServiceManager: %p", sm.get()); CameraService::instantiate(); ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); } //路径 android/frameworks/native/libs/binder/include/binder/BinderService.h static void instantiate() { publish(); } static status_t publish(bool allowIsolated = false, int dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT) { sp<IServiceManager> sm(defaultServiceManager()); return sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated, dumpFlags); } //路径 frameworks/av/services/camera/libcameraservice/CameraService.h static char const* getServiceName() { return "media.camera"; }
onFirstRef
路径 frameworks/av/services/camera/libcameraservice/CameraService.cpp
在 CameraService::onFirstRef() 函数中,主要是调用 enumerateProviders() 函数获取CameraProvider信息
new CameraProviderManager() 之后调用 initialize(), 并将CameraService作为 CameraProviderManager 的成员变量传递进去
void CameraService::onFirstRef() { res = enumerateProviders(); ... } status_t CameraService::enumerateProviders() { ... if (nullptr == mCameraProviderManager.get()) { mCameraProviderManager = new CameraProviderManager(); res = mCameraProviderManager->initialize(this); ... } ... deviceIds = mCameraProviderManager->getCameraDeviceIds(); ... for (auto& cameraId : deviceIds) { String8 id8 = String8(cameraId.c_str()); onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT); } return OK; }
CameraProviderManager::initialize
路径
frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp
将上文传递进来的CameraService作为监听保存在CameraProviderManager中,
mServiceProxy = sHardwareServiceInteractionProxy
//路径 //frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.h status_t initialize(wp<StatusListener> listener, ServiceInteractionProxy *proxy = &sHardwareServiceInteractionProxy); //路径 //frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp const std::string kLegacyProviderName("legacy/0"); const std::string kExternalProviderName("external/0"); CameraProviderManager::sHardwareServiceInteractionProxy{}; status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener, ServiceInteractionProxy* proxy) { ... mListener = listener; mServiceProxy = proxy; ... bool success = mServiceProxy->registerForNotifications( /* instance name, empty means no filter */ "", this); ... addProviderLocked(kLegacyProviderName, /*expected*/ false); addProviderLocked(kExternalProviderName, /*expected*/ false); return OK; }
addProviderLocked
路径
frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp
newProvider 参数分别是 "legacy/0" 和 "external/0"
expected = false
mServiceProxy = sHardwareServiceInteractionProxy
getService() 在路径为
frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.h
getService()将会调用 hardware::camera::provider::V2_4::ICameraProvider::getService(serviceName)
ICameraProvider::getService流程在这篇分析过Android Camera(一) Provider启动流程 (androidP)(HIDL)_we1less的博客-CSDN博客
所以 interface = CameraProvider 代理(通过ServiceManager获得的)
在获得CameraProvider代理之后,将会根据 ICameraProvider 填充相应的 providerInfo
status_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) { //循环判断是否已经添加provider for (const auto& providerInfo : mProviders) { ... } sp<provider::V2_4::ICameraProvider> interface; interface = mServiceProxy->getService(newProvider); ... sp<ProviderInfo> providerInfo = new ProviderInfo(newProvider, interface, this); status_t res = providerInfo->initialize(); ... mProviders.push_back(providerInfo); return OK; } //路径 //frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.h // Standard use case - call into the normal generated static methods which invoke // the real hardware service manager struct HardwareServiceInteractionProxy : public ServiceInteractionProxy { virtual bool registerForNotifications( const std::string &serviceName, const sp<hidl::manager::V1_0::IServiceNotification> ¬ification) override { return hardware::camera::provider::V2_4::ICameraProvider::registerForNotifications( serviceName, notification); } virtual sp<hardware::camera::provider::V2_4::ICameraProvider> getService( const std::string &serviceName) override { return hardware::camera::provider::V2_4::ICameraProvider::getService(serviceName); } };
hardware::camera::provider::V2_4::ICameraProvider::getService(serviceName)
路径
out/soong/.intermediates/hardware/interfaces/camera/provider/2.4/android.hardware.camera.provider@2.4_genc++/gen/android/hardware/camera/provider/2.4/CameraProviderAll.cpp
getStub = false 时,走此流程,拿到 cameraprovider 一般用于其他服务获取cameraprovider服务,此部分在Android Camera(一) Provider启动流程 (androidP)(HIDL)_we1less的博客-CSDN博客这篇已经分析过所以此处就做个结论:此处的 getRawServiceInternal() 调用参数为 false,getRawServiceInternal() 函数在 CameraProvider 注册为服务的时候调用了,只是调用参数不一致,所以,这里返回的将会是 CameraProvider 代理。
//在路径 /* out/soong/.intermediates/hardware/interfaces/camera/provider/2.4/android.hardware.camera.provider@2.4_genc++_headers/gen/android/hardware/camera/provider/2.4/ICameraProvider.h 中有定义*/ static ::android::sp<ICameraProvider> getService(const ::android::hardware::hidl_string& serviceName, bool getStub=false) { std::string str(serviceName.c_str()); return getService(str, getStub); } //调用的则是 注意此时 getStub=false ::android::sp<ICameraProvider> ICameraProvider::getService(const std::string &serviceName, const bool getStub) { return ::android::hardware::details::getServiceInternal<BpHwCameraProvider>(serviceName, true, getStub); }
CameraProviderManager::ProviderInfo::initialize
CameraProviderManager::ProviderInfo::ProviderInfo
路径
frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp
可以从上文new ProviderInfo(newProvider, interface, this);中看出
ProviderInfo::mInterface = CameraProviderManager::interface = CameraProvider 代理
providerName 分别为 "legacy/0" 和 "external/0"
在初始化initialize的过程中 调用了mInterface的
setCallback(this)
linkToDeath
getCameraIdList
实际上就是调用了HAL层的CameraProvider中的相关函数,关于这个在上一篇说到过,在路径
hardware/interfaces/camera/provider/2.4/ICameraProvider.hal
中有定义 getCameraIdList() generates (Status status, vec<string> cameraDeviceNames);
返回一个由cameraDeviceNames组成的列表,将返回的设备填装到devices中,载将这个取得到的camera信息保存到 mDevices中,至此,CameraService与CameraProvider已经关联起来。
device的值一般类似以下: device@3.3/legacy/0
device的值是CameraProvider服务获取device之后,添加 mCameraDeviceNames,
该变量的含义如下:@3.3 第一个 3 是与camera HAL的版本号相关,只要不是 CAMERA_DEVICE_API_VERSION_1_0,都是3
第二个 3 是从系统属性 ro.vendor.camera.wrapper.hal3TrebleMinorVersion 获取的,没有则是3
legacy/0 : 则与 CameraProvider 服务相关
//构造器 CameraProviderManager::ProviderInfo::ProviderInfo( const std::string &providerName, sp<provider::V2_4::ICameraProvider>& interface, CameraProviderManager *manager) : mProviderName(providerName), mInterface(interface), mProviderTagid(generateVendorTagId(providerName)), mUniqueDeviceCount(0), mManager(manager) { (void) mManager; } status_t CameraProviderManager::ProviderInfo::initialize() { status_t res = parseProviderName(mProviderName, &mType, &mId); ... hardware::Return<Status> status = mInterface->setCallback(this); ... hardware::Return<bool> linked = mInterface->linkToDeath(this, /*cookie*/ mId); ... std::vector<std::string> devices; hardware::Return<void> ret = mInterface->getCameraIdList([&status, &devices]( Status idStatus, const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames) { status = idStatus; if (status == Status::OK) { for (size_t i = 0; i < cameraDeviceNames.size(); i++) { //将返回的设备填装到devices中 devices.push_back(cameraDeviceNames[i]); } } }); ... sp<StatusListener> listener = mManager->getStatusListener(); for (auto& device : devices) { std::string id; status_t res = addDevice(device, hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT, &id); ... } ... mInitialized = true; return OK; }
CameraProviderManager::ProviderInfo::addDevice
路径 frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp
根据HAL版本,创建相应的 DeviceInfo
将上述获取得到的camera信息保存到 mDevices中
status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name, CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) { ... uint16_t major, minor; std::string type, id; status_t res = parseDeviceName(name, &major, &minor, &type, &id); ... std::unique_ptr<DeviceInfo> deviceInfo; switch (major) { case 1: deviceInfo = initializeDeviceInfo<DeviceInfo1>(name, mProviderTagid, id, minor); break; case 3: deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, mProviderTagid, id, minor); break; ... mDevices.push_back(std::move(deviceInfo)); mUniqueCameraIds.insert(id); ... return OK; }