本文分析下CameraService獲取ICameraProvider代理對象BpHwCameraProvider的流程,以方便後邊分析CameraService與ICameraProvider的通信方式及探究下其餘進程是否也能夠獲取ICameraProvider,直接與ICameraProvider通信(即直接和HAL通信)android
cameraService啓動時,調用的方法第一個方法:c++
//frameworks\av\services\camera\libcameraservice\CameraService.cpp
void CameraService::onFirstRef()
{
ALOGI("CameraService process starting");cookie
BnCameraService::onFirstRef();socket
// Update battery life tracking if service is restarting
BatteryNotifier& notifier(BatteryNotifier::getInstance());
notifier.noteResetCamera();
notifier.noteResetFlashlight();ide
status_t res = INVALID_OPERATION;
//和ICameraProvider通信獲取設備上全部的機器
res = enumerateProviders();
if (res == OK) {
mInitialized = true;
}函數
CameraService::pingCameraServiceProxy();
}ui
enumerateProviders()函數會與ICameraProvider通信已獲取全部的相機設備this
status_t CameraService::enumerateProviders() {
status_t res;
Mutex::Autolock l(mServiceLock);spa
if (nullptr == mCameraProviderManager.get()) {
mCameraProviderManager = new CameraProviderManager();
//initialize會與ICameraProvider通信,獲取全部相機設備
res = mCameraProviderManager->initialize(this);
}3d
mNumberOfCameras = mCameraProviderManager->getCameraCount();
mNumberOfNormalCameras =
mCameraProviderManager->getAPI1CompatibleCameraCount();
// Setup vendor tags before we call get_camera_info the first time
// because HAL might need to setup static vendor keys in get_camera_info
// TODO: maybe put this into CameraProviderManager::initialize()?
mCameraProviderManager->setUpVendorTags();
...
}
enumerateProviders()函數首先建立了CameraProviderManager對象,而後調用其初始話函數initialize,
initialize有兩個形參:
//frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.h
//proxy 默認值&sHardwareServiceInteractionProxy
status_t initialize(wp<StatusListener> listener,
ServiceInteractionProxy *proxy = &sHardwareServiceInteractionProxy);
initialize函數的第二個形參存在默認值 &sHardwareServiceInteractionProxy,CameraService就是使用了該默認值,下邊分析下sHardwareServiceInteractionProxy:
其類圖:
其實現代碼:
//frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.h
struct HardwareServiceInteractionProxy : public ServiceInteractionProxy {
virtual bool registerForNotifications(
const std::string &serviceName,
const sp<hidl::manager::V1_0::IServiceNotification>
¬ification) override {
//是經過hardware::camera::provider::V2_4::ICameraProvider的靜態方法registerForNotifications
//註冊Notifications的
return hardware::camera::provider::V2_4::ICameraProvider::registerForNotifications(
serviceName, notification);
}
virtual sp<hardware::camera::provider::V2_4::ICameraProvider> getService(
const std::string &serviceName) override {
//是經過hardware::camera::provider::V2_4::ICameraProvider的靜態方法getService
//以Transport::HWBINDER方式獲取ICameraProvider代理對象BpHwCameraProvider
return hardware::camera::provider::V2_4::ICameraProvider::getService(serviceName);
}
}
接續分析下mCameraProviderManager->initialize(this)
//frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.cpp
status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,
ServiceInteractionProxy* proxy) {
std::lock_guard<std::mutex> lock(mInterfaceMutex);
if (proxy == nullptr) {
ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__);
return BAD_VALUE;
}
//是CameraService對象指針
mListener = listener;
//mServiceProxy 就是&sHardwareServiceInteractionProxy靜態變量
mServiceProxy = proxy;
...
// See if there's a passthrough HAL, but let's not complain if there's not
//addProviderLocked首先獲取ICameraProvider服務,而後開始遍歷全部相機設備,kLegacyProviderName爲"legacy/0"
addProviderLocked(kLegacyProviderName, /*expected*/ false);
return OK;
}
繼續分析下addProviderLocked
//frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.cpp
//newProvider爲"legacy/0";expected爲false
status_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) {
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;
}
}
//經過sHardwareServiceInteractionProxy對象獲取ICameraProvider服務代理BpHwCameraProvider
//實際是執行的是hardware::camera::provider::V2_4::ICameraProvider::getService("legacy/0")
sp<provider::V2_4::ICameraProvider> interface;
interface = mServiceProxy->getService(newProvider);
...
//封裝上一步獲取的ICameraProvider代理對象BpHwCameraProvider爲interface爲ProviderInfo對象
//newProvider爲"legacy/0";interface爲BpHwCameraProvider代理對象;this爲CameraProviderManager對象
sp<ProviderInfo> providerInfo =
new ProviderInfo(newProvider, interface/*provider::V2_4::ICameraProvider*/, this);
//調用ProviderInfo的initialize方法
status_t res = providerInfo->initialize();
if (res != OK) {
return res;
}
mProviders.push_back(providerInfo);
return OK;
}
首先接着分析下getService
//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
// static
//getStub的默認值是false
::android::sp<ICameraProvider> ICameraProvider::getService(const std::string &serviceName, const bool getStub) {
using ::android::hardware::defaultServiceManager;
using ::android::hardware::details::waitForHwService;
using ::android::hardware::getPassthroughServiceManager;
using ::android::hardware::Return;
using ::android::sp;
using Transport = ::android::hidl::manager::V1_0::IServiceManager::Transport;
sp<ICameraProvider> iface = nullptr;
//獲取hwservicemanager代理對象BpHwServiceManager
const sp<::android::hidl::manager::V1_0::IServiceManager> sm = defaultServiceManager();
if (sm == nullptr) {
ALOGE("getService: defaultServiceManager() is null");
return nullptr;
}
//獲取Transport屬性
//CameraProvider的transport屬性爲Transport::HWBINDER
//屬性定義在device\qcom\projectName\manifest.xml
Return<Transport> transportRet = sm->getTransport(ICameraProvider::descriptor, serviceName);
if (!transportRet.isOk()) {
ALOGE("getService: defaultServiceManager()->getTransport returns %s", transportRet.description().c_str());
return nullptr;
}
//經過上一步分析可知vintfHwbinder爲true、vintfPassthru爲false
Transport transport = transportRet;
const bool vintfHwbinder = (transport == Transport::HWBINDER);
const bool vintfPassthru = (transport == Transport::PASSTHROUGH);
...
//getStub爲false,vintfHwbinder爲true,知足該條件
for (int tries = 0; !getStub && (vintfHwbinder || (vintfLegacy && tries == 0)); tries++) {
if (tries > 1) {
ALOGI("getService: Will do try %d for %s/%s in 1s...", tries, ICameraProvider::descriptor, serviceName.c_str());
sleep(1);
}
if (vintfHwbinder && tries > 0) {
waitForHwService(ICameraProvider::descriptor, serviceName);
}
//經過BpHwServiceManager代理對象sm的get方法獲取CameraProvider代理對象BpHwCameraProvider
//ICameraProvider::descriptor爲android.hardware.camera.provider@2.4::ICameraProvider
//serviceName爲legacy/0
Return<sp<::android::hidl::base::V1_0::IBase>> ret =
sm->get(ICameraProvider::descriptor, serviceName);
if (!ret.isOk()) {
ALOGE("ICameraProvider: defaultServiceManager()->get returns %s", ret.description().c_str());
break;
}
sp<::android::hidl::base::V1_0::IBase> base = ret;
if (base == nullptr) {
if (tries > 0) {
ALOGW("ICameraProvider: found null hwbinder interface");
}continue;
}
//經過ICameraProvider::castFrom將base轉換爲BpHwCameraProvider,稍後重點分析下
Return<sp<ICameraProvider>> castRet = ICameraProvider::castFrom(base, true /* emitError */);
...
iface = castRet;
if (iface == nullptr) {
ALOGW("ICameraProvider: received incompatible service; bug in hwservicemanager?");
break;
}
return iface;
}
...
}
接着分析下ICameraProvider::castFrom
//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
// static
::android::hardware::Return<::android::sp<ICameraProvider>> ICameraProvider::castFrom(const ::android::sp<::android::hidl::base::V1_0::IBase>& parent, bool emitError) {
return ::android::hardware::details::castInterface<ICameraProvider, ::android::hidl::base::V1_0::IBase, BpHwCameraProvider>(
parent, "android.hardware.camera.provider@2.4::ICameraProvider", emitError);
}
接着分析下castInterface
//system\libhidl\transport\include\hidl\HidlTransportSupport.h
//IChild爲ICameraProvider;IParent爲IBase;BpChild爲BpHwCameraProvider
//parent爲BpHwServiceManager::get方法獲的IBase代理對象BpHwBase
//childIndicator爲android.hardware.camera.provider@2.4::ICameraProvider
//emitError爲true
template <typename IChild, typename IParent, typename BpChild>
Return<sp<IChild>> castInterface(sp<IParent> parent, const char* childIndicator, bool emitError) {
if (parent.get() == nullptr) {
// casts always succeed with nullptrs.
return nullptr;
}
//判斷是否能夠轉換
Return<bool> canCastRet = details::canCastInterface(parent.get(), childIndicator, emitError);
if (!canCastRet.isOk()) {
// call fails, propagate the error if emitError
return emitError
? details::StatusOf<bool, sp<IChild>>(canCastRet)
: Return<sp<IChild>>(sp<IChild>(nullptr));
}
if (!canCastRet) {
return sp<IChild>(nullptr); // cast failed.
}
//該處parent->isRemote()爲true
//將parent封裝爲BpHwCameraProvider對象
// TODO b/32001926 Needs to be fixed for socket mode.
if (parent->isRemote()) {
// binderized mode. Got BpChild. grab the remote and wrap it.
return sp<IChild>(new BpChild(toBinder<IParent>(parent)));
}
// Passthrough mode. Got BnChild and BsChild.
return sp<IChild>(static_cast<IChild *>(parent.get()));
}
經過上邊的分析,能夠知道CameraService調用ICameraProvider::getService("legacy/0")
最終得到是ICameraProvider代理對象BpHwCameraProvider
接着繼續分析下ProviderInfo::initialize()
//frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.cpp
status_t CameraProviderManager::ProviderInfo::initialize() {
status_t res = parseProviderName(mProviderName, &mType, &mId);
ALOGI("Connecting to new camera provider: %s, isRemote? %d",
mProviderName.c_str(), mInterface->isRemote());
//mInterface是上一步經過mServiceProxy->getService(newProvider)
//獲取的provider::V2_4::ICameraProvider代理對象BpHwCameraProvider
hardware::Return<Status> status = mInterface->setCallback(this);
...
hardware::Return<bool> linked = mInterface->linkToDeath(this, /*cookie*/ mId);
//獲取全部相機設備的idStatus和cameraDeviceNames(即camera ID??待肯定),
//而後賦值給status和devices
// Get initial list of camera devices,
//if any
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.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);
}
...
return OK;
}
繼續分析下addDevice
status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name,
CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) {
ALOGI("Enumerating new camera device: %s", name.c_str());
uint16_t major, minor;
std::string type, id;
//根據獲取的cameraDeviceNames,解析出其major,minor,type,id四個變量
status_t res = parseDeviceName(name, &major, &minor, &type, &id);
....
std::unique_ptr<DeviceInfo> deviceInfo;
//sdm845 的major 爲3(待肯定??)
switch (major) {
case 1:
deviceInfo = initializeDeviceInfo<DeviceInfo1>(name, mProviderTagid,
id, minor);
break;
case 3:
//根據上一步獲取的name,id等信息,建立DeviceInfo對象指針
deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, mProviderTagid,
id, minor);
break;
default:
ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__,
name.c_str(), major);
return BAD_VALUE;
}
if (deviceInfo == nullptr) return BAD_VALUE;
deviceInfo->mStatus = initialStatus;
mDevices.push_back(std::move(deviceInfo));
//若是全部的都成功,在返回解析出的id做爲camera ID使用
if (parsedId != nullptr) {
*parsedId = id;
}
return OK;
}
先分析下deviceInfo,它實際上是父類
定義以下:
// Basic device information, common to all camera devices
struct DeviceInfo {
const std::string mName; // Full instance name
const std::string mId; // ID section of full name
const hardware::hidl_version mVersion;
const metadata_vendor_id_t mProviderTagid;
const hardware::camera::common::V1_0::CameraResourceCost mResourceCost;
hardware::camera::common::V1_0::CameraDeviceStatus mStatus;
bool hasFlashUnit() const { return mHasFlashUnit; }
virtual status_t setTorchMode(bool enabled) = 0;
virtual status_t getCameraInfo(hardware::CameraInfo *info) const = 0;
virtual bool isAPI1Compatible() const = 0;
virtual status_t getCameraCharacteristics(CameraMetadata *characteristics) const {
(void) characteristics;
return INVALID_OPERATION;
}
DeviceInfo(const std::string& name, const metadata_vendor_id_t tagId,
const std::string &id, const hardware::hidl_version& version,
const hardware::camera::common::V1_0::CameraResourceCost& resourceCost) :
mName(name), mId(id), mVersion(version), mProviderTagid(tagId),
mResourceCost(resourceCost),
mStatus(hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT),
mHasFlashUnit(false) {}
virtual ~DeviceInfo();
protected:
bool mHasFlashUnit;
template<class InterfaceT>
static status_t setTorchMode(InterfaceT& interface, bool enabled);
}
其兩個子類DeviceInfo1 和DeviceInfo3
DeviceInfo1 定義以下:
// HALv1-specific camera fields, including the actual device interface
struct DeviceInfo1 : public DeviceInfo {
//類型定義InterfaceT爲hardware::camera::device::V1_0::ICameraDevice,以後會用到
typedef hardware::camera::device::V1_0::ICameraDevice InterfaceT;
const sp<InterfaceT> mInterface;
virtual status_t setTorchMode(bool enabled) override;
virtual status_t getCameraInfo(hardware::CameraInfo *info) const override;
//In case of Device1Info assume that we are always API1 compatible
virtual bool isAPI1Compatible() const override { return true; }
DeviceInfo1(const std::string& name, const metadata_vendor_id_t tagId,
const std::string &id, uint16_t minorVersion,
const hardware::camera::common::V1_0::CameraResourceCost& resourceCost,
sp<InterfaceT> interface);
virtual ~DeviceInfo1();
private:
CameraParameters2 mDefaultParameters;
}
DeviceInfo3 定義以下:
struct DeviceInfo3 : public DeviceInfo {
//類型定義InterfaceT 爲hardware::camera::device::V3_2::ICameraDevice,以後會用到
typedef hardware::camera::device::V3_2::ICameraDevice InterfaceT;
const sp<InterfaceT> mInterface;
virtual status_t setTorchMode(bool enabled) override;
virtual status_t getCameraInfo(hardware::CameraInfo *info) const override;
virtual bool isAPI1Compatible() const override;
virtual status_t getCameraCharacteristics(
CameraMetadata *characteristics) const override;
DeviceInfo3(const std::string& name, const metadata_vendor_id_t tagId,
const std::string &id, uint16_t minorVersion,
const hardware::camera::common::V1_0::CameraResourceCost& resourceCost,
sp<InterfaceT> interface);
virtual ~DeviceInfo3();
private:
CameraMetadata mCameraCharacteristics;
}
接着繼續這隻分析下initializeDeviceInfo
//是一個模板函數,上一步調用傳入的類型參數是DeviceInfo3
template<class DeviceInfoT>
std::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo>
CameraProviderManager::ProviderInfo::initializeDeviceInfo(
const std::string &name, const metadata_vendor_id_t tagId,
const std::string &id, uint16_t minorVersion) const {
Status status;
//獲取ICameraDevice對象(auto 的類型是device::V3_2::ICameraDevice)
// DeviceInfoT::InterfaceT的類型是hardware::camera::device::V3_2::ICameraDevice
auto cameraInterface = getDeviceInterface<typename DeviceInfoT::InterfaceT>(name);
if (cameraInterface == nullptr) return nullptr;
//經過上一步獲取的device::V3_2::ICameraDevice的代理對象
//獲取getResourceCost
CameraResourceCost resourceCost;
cameraInterface->getResourceCost([&status, &resourceCost](
Status s, CameraResourceCost cost) {
status = s;
resourceCost = cost;
});
//根據得到name,id,device::V3_2::ICameraDevice代理對象cameraInterface,
//封裝爲一個DeviceInfo3對象
return std::unique_ptr<DeviceInfo>(
new DeviceInfoT(name, tagId, id, minorVersion, resourceCost,
cameraInterface));
}
接着分析下 auto cameraInterface = getDeviceInterface<typename DeviceInfoT::InterfaceT>(name);
根據上一步分析,調用的模板函數的具體化以下
template<> sp<device::V3_2::ICameraDevice> CameraProviderManager::ProviderInfo::getDeviceInterface <device::V3_2::ICameraDevice>(const std::string &name) const { Status status; sp<device::V3_2::ICameraDevice> cameraInterface; hardware::Return<void> ret; //mInterface是上一步經過mServiceProxy->getService(newProvider) //獲取的provider::V2_4::ICameraProvider代理對象BpHwCameraProvider // getCameraDeviceInterface_V3_x獲取的是device::V3_2::ICameraDevice代理對象BpHwCameraDevice ret = mInterface->getCameraDeviceInterface_V3_x(name, [&status, &cameraInterface]( Status s, sp<device::V3_2::ICameraDevice> interface) { status = s; cameraInterface = interface; }); .... 返回獲取的device::V3_2::ICameraDevice代理對象BpHwCameraDevice return cameraInterface; }