本系列文章旨在分析android应用打开摄像头并显示预览的流程。
文章将通过源码分析,总结和时序图的方式,帮助理解Camera2框架。
本篇文章将分析framework层camera相关模块的初始化,为后续分析打下基础。
1 相关源码分析
frameworks\av\camera\cameraserver\main_cameraserver.cpp
int main(int argc __unused, char** argv __unused)
{
hardware::configureRpcThreadpool(3, /*willjoin*/ false);
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
// 通过service manager注册CameraService
CameraService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
调用了CameraService::instantiate(), 其最终调用service maneger的addService;
1.1 CameraService初始化
frameworks/av/services/camera/libcameraservice/CameraService.cpp
当CameraService派生自RefBase,当其第一次被引用时,有如下的调用:
void CameraService::onFirstRef() {
ALOGI("CameraService process starting");
BnCameraService::onFirstRef();
................
// 从hal层的CameraProvider/ExternalCameraProvider获得摄像头设备
res = enumerateProviders();
................
}
enumerateProviders将通过hal服务CameraProvider/ExternalCameraProvider获取摄像头设备信息;
status_t CameraService::enumerateProviders() {
status_t res;
std::vector<std::string> deviceIds;
{
Mutex::Autolock l(mServiceLock);
if (nullptr == mCameraProviderManager.get()) {
// 初始化CameraProviderManager
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;
}
enumerateProvider将初始化CameraProviderManager,CameraProviderManager将通过hal服务来获取摄像头的信息。
1.2 CameraProviderManager
1.2.1 类结构
frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.h
CameraProviderManager用于管理android设备上的camera provider,它会枚举出camera provider以及这些provider提供的摄像头设备,并提供方法去访问它们。
class CameraProviderManager : virtual public hidl::manager::V1_0::IServiceNotification {
public:
................
................
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);
}
};
................
status_t initialize(wp<StatusListener> listener,
ServiceInteractionProxy *proxy = &sHardwareServiceInteractionProxy);
................
private:
................
static HardwareServiceInteractionProxy sHardwareServiceInteractionProxy;
................
}
initialize方法的第二个参数是一个默认值,它是内部的静态对象,它能从获取对应的hal层服务。