Android Camera CameraService启动流程 (androidP)
Posted we1less
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Camera CameraService启动流程 (androidP)相关的知识,希望对你有一定的参考价值。
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;
}
以上是关于Android Camera CameraService启动流程 (androidP)的主要内容,如果未能解决你的问题,请参考以下文章
问题支持Android相机的API和camera2 API问题,怎么解决