本篇文章是繼續上一篇分析的Android Camera(一) Provider啟動流程 (androidP)(HIDL)_we1less的博客-CSDN博客
總結一下:所以在這個流程中
這個路徑下的 hardware/interfaces/camera/provider/2.4/default/service.cpp
CameraProviderService的return defaultPassthroughServiceImplementation就是以直通式向ServiceManager中注冊一個服務,這個服務是由
/vendor/lib/hw/android.hardware.camera.provider@2.4-impl.so
這個動態庫的HIDL_FETCH_ICameraProvider()函式提供的new CameraProvider()
這個CameraProvider在initialize()函式中以同樣的方式load進一個動態庫,這個動態庫的路徑為
/vendor/lib/hw/camera.xxxx.so,同時保存在new CameraModule(rawModule);中這樣就能利用這個指標訪問so中的方法了,
sp<IBase> base = pm->get(descriptor, instance).withDefault(nullptr);
路徑 system/libhidl/transport/ServiceManagement.cpp
上一篇說到get函式同時上一篇文章中也總結了
fullPath = /vendor/lib/hw/android.hardware.camera.provider@2.4-impl.so
lib = android.hardware.camera.provider@2.4-impl.so
sym = HIDL_FETCH_ICameraProvider
handle = dlopen(fullPath.c_str(), dlMode);
關于dlopen和dlsym函式已經在這里介紹dlopen / dlsym函式(元件)_we1less的博客-CSDN博客
fullPath = /vendor/lib/hw/android.hardware.camera.provider@2.4-impl.so
那么generator就變成了fullPath路徑下的so檔案中的HIDL_FETCH_ICameraProvider函式得到CameraProvider的實體物件并保存在ret, 所以get()函式將回傳 ret
Return<sp<IBase>> get(const hidl_string& fqName,
const hidl_string& name) override {
sp<IBase> ret = nullptr;
/* [&] 此處為Lambda運算式,簡單理解為函式指標即可,先執行 openLibs() */
openLibs(fqName, [&](void* handle, const std::string &lib, const std::string &sym) {
/* handle :dlopen() 的回傳值
* lib :android.hardware.camera.provider@2.4-impl.so
* sym :HIDL_FETCH_ICameraProvider
*/
IBase* (*generator)(const char* name);
*(void **)(&generator) = dlsym(handle, sym.c_str());
...
//賦值回傳
ret = (*generator)(name.c_str());
...
});
return ret;
}
HIDL_FETCH_ICameraProvider
路徑 hardware/interfaces/camera/provider/2.4/default/CameraProvider.cpp
傳遞進來的 name 為 legacy/0,而 kLegacyProviderName 定義為 legacy/0
創建CameraProvider物件,建構式將會呼叫initialize() 函式
關于hw_get_module如何運作的這里給出這幾篇篇作為參考【HAL】hw_get_module分析:加載HAL層庫,獲取camx模塊介面_mrhjlong-CSDN博客
Android--hw_get_module決議_Tinghua_M的博客-CSDN博客_hw_get_module
用法可以參考我這篇Android 從上到下寫一個例子 本地服務(二)_we1less的博客-CSDN博客
至此,已獲得CameraProvider實體物件,最侄訓傳賦值給 registerPassthroughServiceImplementation() 函式中的 service
ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name) {
if (strcmp(name, kLegacyProviderName) == 0) {
CameraProvider* provider = new CameraProvider();
...
return provider;
} else if (strcmp(name, kExternalProviderName) == 0) {
ExternalCameraProvider* provider = new ExternalCameraProvider();
return provider;
}
ALOGE("%s: unknown instance name: %s", __FUNCTION__, name);
return nullptr;
}
bool CameraProvider::initialize() {
camera_module_t *rawModule;
int err = hw_get_module(CAMERA_HARDWARE_MODULE_ID,
(const hw_module_t **)&rawModule);
...
/* rawModule 將指向 HAL 中的 camera_module_t 型別結構體,
* 此時,CameraProvider 與 camera HAL 系結成功,可以通過
* CameraProvider操作camera HAL
*/
/* 創建 CameraModule 物件 */
/* CameraModule.cpp:android/hardware/interfaces/camera/common/1.0/default */
mModule = new CameraModule(rawModule);
/* mModule->init()主要完成以下操作:
* 1. 當camera HAL的 module_api_version >= CAMERA_MODULE_API_VERSION_2_4,將呼叫HAL->init()
* 2. 通過 HAL getNumberOfCameras() 獲取設定camera數量,并將該引數設定為 mCameraInfoMap 容器的大小
* */
err = mModule->init();
...
err = mModule->setCallbacks(this);
...
mNumberOfLegacyCameras = mModule->getNumberOfCameras();
for (int i = 0; i < mNumberOfLegacyCameras; i++) {
struct camera_info info;
/* 將獲取camera資訊并保存,其中將有HAL version資訊,應用
* 層將會檢查HAL層版本資訊從而確認呼叫不同的API實作相機應用
*/
auto rc = mModule->getCameraInfo(i, &info);
...
char cameraId[kMaxCameraIdLen];
snprintf(cameraId, sizeof(cameraId), "%d", i);
std::string cameraIdStr(cameraId);
mCameraStatusMap[cameraIdStr] = CAMERA_DEVICE_STATUS_PRESENT;
addDeviceNames(i);
}
return false; // mInitFailed
}
CameraModule中的相關函式
路徑 hardware/interfaces/camera/common/1.0/default/CameraModule.cpp
mModule->init(); 這個mModule就是camera_module_t結構體物件
camera_module_t 定義在 hardware/libhardware/include/hardware/camera_common.h
CameraModule::CameraModule(camera_module_t *module) {
...
mModule = module;
}
int CameraModule::init() {
ATRACE_CALL();
int res = OK;
if (getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_4 &&
mModule->init != NULL) {
ATRACE_BEGIN("camera_module->init");
res = mModule->init();
ATRACE_END();
}
mCameraInfoMap.setCapacity(getNumberOfCameras());
return res;
}
//hardware/libhardware/include/hardware/camera_common.h
#define CAMERA_HARDWARE_MODULE_ID "camera"
typedef struct camera_module {
hw_module_t common;
int (*get_number_of_cameras)(void);
int (*get_camera_info)(int camera_id, struct camera_info *info);
int (*set_callbacks)(const camera_module_callbacks_t *callbacks);
void (*get_vendor_tag_ops)(vendor_tag_ops_t* ops);
int (*open_legacy)(const struct hw_module_t* module, const char* id,
uint32_t halVersion, struct hw_device_t** device);
int (*set_torch_mode)(const char* camera_id, bool enabled);
int (*init)();
void* reserved[5];
} camera_module_t;
status_t status = service->registerAsService(name);
路徑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
最后將這個service add進去這部分的可以參考這篇Android P HIDL 之 CameraProvider_a185531353的博客-CSDN博客
::android::status_t ICameraProvider::registerAsService(const std::string &serviceName) {
::android::hardware::details::onRegistration("android.hardware.camera.provider@2.4", "ICameraProvider", serviceName);
const ::android::sp<::android::hidl::manager::V1_0::IServiceManager> sm
= ::android::hardware::defaultServiceManager();
if (sm == nullptr) {
return ::android::INVALID_OPERATION;
}
::android::hardware::Return<bool> ret = sm->add(serviceName.c_str(), this);
return ret.isOk() && ret ? ::android::OK : ::android::UNKNOWN_ERROR;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/348418.html
標籤:其他
上一篇:While回圈功能
