总体框架
cameraserver 与 provider 这两个进程启动、初始化的调用逻辑,如上图所示
(Thanks to : https://blog.csdn.net/qq_16775897/article/details/81240600)
总体逻辑顺序:
provider 进程启动,注册;
cameraserver 进程启动,注册,初始化;
cameraserver 获取远端 provider(此时实例化 CameraProvider 并初始化)
上图中,实线箭头是调用关系。左边是 cameraserver 进程中的动作,右边则是 provider 进程中的动作,它们之间通过 ICameraProvider 联系在了一起
CameraProvider
在 Android 系统启动时,就会启动 CameraProvider 服务。它将 Camera HAL 从 CameraServer 进程中分离出来,作为一个独立进程 android.hardware.camera.provider@2.4-service 来控制 HAL。 这两个进程之间通过 HIDL 机制进行通信。
这样的改动源自于 Android O 版本加入的 Treble 机制,它的主要功能(如下图所示)是将 service 与 HAL 隔离,以方便 HAL 部分进行独立升级。这其实和 APP 与 Framework 之间的 Binder 机制类似,通过引入一个进程间通信机制而针对不同层级进行解耦(从 Local call 变成了 Remote call)。
1. CameraProvider 的启动与注册
这个服务进程的启动很简单,主要动作是注册该 CameraProvider,以便 CameraServer 启动时能找到它.
/hardware/interfaces/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service.rc
1service vendor.camera-provider-2-4 /vendor/bin/hw/android.hardware.camera.provider@2.4-service
2 interface android.hardware.camera.provider@2.4::ICameraProvider legacy/0
3 class hal
4 user cameraserver
5 group audio camera input drmrpc
6 ioprio rt 4
7 capabilities SYS_NICE
8 task_profiles CameraServiceCapacity MaxPerformance
/hardware/interfaces/camera/provider/2.4/default/service.cpp
CameraService
2. CameraService 的启动与初始化
/frameworks/av/camera/cameraserver/cameraserver.rc
1service cameraserver /system/bin/cameraserver
2 class main
3 user cameraserver
4 group audio camera input drmrpc
5 ioprio rt 4
6 task_profiles CameraServiceCapacity MaxPerformance
7 rlimit rtprio 10 10
一般来说应该是 Provider 服务先启动,然后 Cameraserver 再启动,并 ”连接“ 到 Provider
/frameworks/av/camera/cameraserver/main_cameraserver.cpp
CameraService::instantiate();
实例化CameraService 只有简单的一行代码,但实例化的过程并不那么简单。这个 instantiate() 接口并不是定义在 CameraService 类中的,而是定义在 BinderService 类里(而 CameraService 继承了它)。在此处,它的作用是创建一个 CameraService(通过 new 的方式),并将其加入到 ServiceManager 中(注意,在这一过程中,CameraService 被强指针引用了)
/frameworks/av/services/camera/libcameraservice/CameraService.cpp
由于首次被强指针引用时,就会调用 onFirstRef()
函数执行初始化之类的业务逻辑,初始化的主要逻辑实现应该在 enumerateProviders()
函数中, 它首先将 CameraProviderManager
实例化,然后调用 initialize()
接口将其初始化,传入的参数是 this
指针,指向当前 CameraService 实例的地址
if (nullptr == mCameraProviderManager.get()) {
mCameraProviderManager = new CameraProviderManager();
res = mCameraProviderManager->initialize(this);
if (res != OK) {
ALOGE("%s: Unable to initialize camera provider manager: %s (%d)",
__FUNCTION__, strerror(-res), res);
return res;
}
}
/frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp
for (const auto& instance : mServiceProxy->listServices()) {
this->addProviderLocked(instance);
}
status_t CameraProviderManager::addProviderLocked(const std::string& newProvider) {
//检查已知的 Provider 匹配(legacy/0)
for (const auto& providerInfo : mProviders) {
if (providerInfo->mProviderName == newProvider) {
ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__,
newProvider.c_str());
return ALREADY_EXISTS;
}
}
//获取 CameraProvider 接口,初始化CameraProvider
sp<provider::V2_4::ICameraProvider> interface;
interface = mServiceProxy->tryGetService(newProvider);
if (interface == nullptr) {
ALOGE("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__,
newProvider.c_str());
return BAD_VALUE;
}
//通过 ProviderInfo 来保存当前 Provider 相关信息
sp<ProviderInfo> providerInfo = new ProviderInfo(newProvider, this);
status_t res = providerInfo->initialize(interface, mDeviceState);
if (res != OK) {
return res;
}
//记录当前 Provider
mProviders.push_back(providerInfo);
return OK;
}
3. CameraProvider 的初始化
在 CameraService 的初始化过程中,CameraProvider 才开始进行初始化,只不过这个初始化是通过服务代理进行远端调用而进行的。
在 CameraProviderManager::addProviderLocked 函数的实现逻辑中,调用了 ICameraProvider::getService 接口,该接口最终会调用到一个名为 HIDL_FETCH_ICameraProvider 的函数。
/hardware/interfaces/camera/provider/2.4/default/CameraProvider_2_4.cpp
/hardware/google/camera/common/hal/hidl_service/hidl_camera_provider.cc