一、前言
根据我的理解以前android在启动camera service 会直接去操作hal层,这样hal层和framework就耦合在一起了。现在 Android O 中,加入了Camera Provider这一抽象层,该层作为一个独立进程存在于整个系统中,并且通过HIDL这一自定义语言成功地将Camera Hal Module从Camera Service中解耦出来。启动一个 CameraProvider 服务,作为一个独立进程 android.hardware.camera.provider@2.4-service 用来控制 camera HAL。
二、代码分析
我们从android.hardware.camera.provider@2.4-service 这个服务来分析整个初始化流程。
系统启动过程中,init进程通过解析init.rc 文件来启动服务。
idh.code\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
interface android.hardware.camera.provider@2.4::ICameraProvider legacy/0
class hal
user cameraserver
group audio camera input drmrpc inet system
ioprio rt 4
capabilities SYS_NICE
writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks
服务的入口时在service.cpp中。
idh.code\hardware\interfaces\camera\provider\2.4\default\service.cpp
int main()
{
ALOGI("CameraProvider@2.4 legacy service is starting.");
// The camera HAL may communicate to other vendor components via
// /dev/vndbinder
android::ProcessState::initWithDriver("/dev/vndbinder");
status_t status;
status = defaultLazyPassthroughServiceImplementation<ICameraProvider>("legacy/0",
/*maxThreads*/ 6);
return status;
}
这里采用的时直通模式,通过这个函数会去获取CameraProvider 服务并注册到hardwareservicemanage中,cameraservice启动时回去获取CameraProvider服务的远程代理。通过这个代理来调用CameraProvider中提供的接口。
我们不详细介绍如何注册服务,我们只关系CameraProvider 的启动过程。经过一系列的调用最终调用到,HIDL_FETCH_ICameraProvider 这里会生成一个ICameraProvider 的对象,注册到
hardwareservicemanage。
idh.code\vendor\sprd\interfaces\camera\provider\2.4\default\CameraProvider_2_4.cpp
ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name) {
using namespace android::hardware::camera::provider::V2_4::implementation;
ICameraProvider* provider = nullptr;
provider = getProviderImpl<LegacyCameraProviderImpl_2_4>();
return provider;
}
template<typename IMPL>
CameraProvider<IMPL>* getProviderImpl() {
CameraProvider<IMPL> *provider = new CameraProvider<IMPL>();
return provider;
}
这里时生成一个CameraProvider 的对象。我们继续看CameraProvider 的类。
idh.code\vendor\sprd\interfaces\camera\provider\2.4\default\CameraProvider_2_4.h
template<typename IMPL>
struct CameraProvider : public ICameraProvider {
CameraProvider() : impl() {}
~CameraProvider() {}
// Caller must use this method to check if CameraProvider ctor failed
bool isInitFailed() { return impl.isInitFailed(); }
// Methods from ::android::hardware::camera::provider::V2_4::ICameraProvider follow.
Return<Status> setCallback(const sp<ICameraProviderCallback>& callback) override {
return impl.setCallback(callback);
}
Return<void> getVendorTags(getVendorTags_cb _hidl_cb) override {
return impl.getVendorTags(_hidl_cb);
}
Return<void> getCameraIdList(getCameraIdList_cb _hidl_cb) override {
return impl.getCameraIdList(_hidl_cb);
}
Return<void> isSetTorchModeSupported(isSetTorchModeSupported_cb _hidl_cb) override {
return impl.isSetTorchModeSupported(_hidl_cb);
}
Return<void> getCameraDeviceInterface_V1_x(
const hidl_string& cameraDeviceName,
getCameraDeviceInterface_V1_x_cb _hidl_cb) override {
return impl.getCameraDeviceInterface_V1_x(cameraDeviceName, _hidl_cb);
}
Return<void> getCameraDeviceInterface_V3_x(
const hidl_string& cameraDeviceName,
getCameraDeviceInterface_V3_x_cb _hidl_cb) override {
return impl.getCameraDeviceInterface_V3_x(cameraDeviceName, _hidl_cb);
}
private:
IMPL impl;
};
结合上一片的代码看,我们可以发现 new CameraProvider 相当于 就是实例化了 IMPL(LegacyCameraProviderImpl_2_4),远程调用的接口也是调用 LegacyCameraProviderImpl_2_4对应的接口,相当于只是一层封装。
继续跟踪这个LegacyCameraProviderImpl_2_4的构造函数
idh.code\vendor\sprd\interfaces\camera\provider\2.4\default\LegacyCameraProviderImpl_2_4.cpp
LegacyCameraProviderImpl_2_4::LegacyCameraProviderImpl_2_4() :
camera_module_callbacks_t({sCameraDeviceStatusChange,
sTorchModeStatusChange}) {
mInitFailed = initialize();
}
1、camera_module_callbacks
idh.code\hardware\libhardware\include\hardware\camera_common.h
typedef struct camera_module_callbacks {
void (*camera_device_status_change)(const struct camera_module_callbacks*,
int camera_id,
int new_status);
void (*torch_mode_status_change)(const struct camera_module_callbacks*,
const char* camera_id,
int new_status);
} camera_module_callbacks_t;
camera_module_callbacks_t({sCameraDeviceStatusChange, sTorchModeStatusChange})
这里知识初始化父类,赋值两个回调函数。
2、LegacyCameraProviderImpl_2_4::initialize
这个initialize时这个流程中最重要的函数下面会拆成几部分分析