目录
参考文献
[Android O] Camera 服务启动流程简析
[Android O] HAL3 之 Open Camera2 流程(零)—— 概览
[Android O] HAL3 之 Open Camera2 流程(一)—— 从 App 到 CameraService
[Android O] HAL3 之 Open Camera2 流程(二)—— 从 CameraService 到 HAL Service
[Android O] HAL3 之 Open Camera2 流程(三,完结)—— 从 HAL Service 到 Camera HAL
android6.0源码分析之Camera API2.0简介
android6.0源码分析之Camera2 HAL分析
android6.0源码分析之Camera API2.0下的初始化流程分析
android6.0源码分析之Camera API2.0下的Preview(预览)流程分析
android6.0源码分析之Camera API2.0下的Capture流程分析
android6.0源码分析之Camera API2.0下的video流程分析
Android 8.0系统源码分析--相机createCaptureSession创建过程源码分析
高通平台
在 Android O 中,系统启动时,就会启动 CameraProvider 服务。它将 Camera HAL 从 cameraserver 进程中分离出来,作为一个独立进程 android.hardware.camera.provider@2.4-service 来控制 HAL。这两个进程之间通过 HIDL 机制进行通信。
这样的改动源自于 Android O 版本加入的 Treble 机制,它的主要功能(如下图所示)是将 service 与 HAL 隔离,以方便 HAL 部分进行独立升级。这其实和 APP 与 Framework 之间的 Binder 机制类似,通过引入一个进程间通信机制而针对不同层级进行解耦(从 Local call 变成了 Remote call)。
注册CameraProvider服务
创建服务端的 CameraProviderImpl 对象,后续client端会调用。
hardware/interfaces/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service_64.rc
service vendor.camera-provider-2-4 /vendor/bin/hw/android.hardware.camera.provider@2.4-service_64
class hal
user cameraserver
group audio camera input drmrpc
ioprio rt 4
capabilities SYS_NICE
writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks
hardware/interfaces/camera/provider/2.4/default/service.cpp
int main()
{
android::ProcessState::initWithDriver("/dev/vndbinder"); //打开vndservicemanager服务,可以和其它vendor进程通信
return defaultPassthroughServiceImplementation<ICameraProvider>("legacy/0", /*maxThreads*/ 6);
}
system/libhidl/transport/include/hidl/LegacySupport.h
template<class Interface> /* 模板函数,Interface = ICameraProvider */
status_t defaultPassthroughServiceImplementation(std::string name, size_t maxThreads = 1) {
/* 第一次执行这个函数会open(/dev/hwbinder) */
configureRpcThreadpool(maxThreads, true);
/* 这个函数做了两件事:
* 1、得到了 CameraProvider 实例化对象
* 2、注册 CameraProvider 实例化对象 */
status_t result = registerPassthroughServiceImplementation<Interface>(name);
joinRpcThreadpool();
}
template<class Interface>
status_t registerPassthroughServiceImplementation(std::string name = "default") {
/* 就是调用 ICameraProvider::getService()
* getStub = ture 时,getservice 以 passthrough 模式打开 HAL 实现
* 所以这个会得到CameraProvider实例化对象(不是binder代理)
*/
sp<Interface> service = Interface::getService(name, true /* getStub */);
/*将 CameraProvider 注册为一个服务
* 其他进程需要使用 camera HAL层时通过binder得到CameraProvider代理类即可操作camera HAL层
* 不需要像以前一样每次都 dlopen(xxx.so)
*/
status_t status = service->registerAsService(name);
}
-----------------------------------------------------------------------------------------------------------------------------------
/* CameraProviderAll.cpp */
::android::status_t ICameraProvider::registerAsService(const std::string &serviceName) {
::android::hardware::details::onRegistration("android.hardware.camera.provider@2.4", "ICameraProvider", serviceName);
/*
* 得到 BpHwServiceManager 对象
* 就是 HwServiceManager 对象的 binder 代理
* 后面会分析如何得到 BpHwServiceManager 对象
*/
const ::android::sp<::android::hidl::manager::V1_0::IServiceManager> sm
= ::android::hardware::defaultServiceManager();
/*
* 调用 BpHwServiceManager::add() 注册服务
* 后面分析
*/
::android::hardware::Return<bool> ret = sm->add(serviceName.c_str(), this);
return ret.isOk() && ret ? ::android::OK : ::android::UNKNOWN_ERROR;
}
CameraProviderAll.cpp来自hardware/interfaces/camera/provider/2.4/ICameraProvider.hal
-----------------------------------------------------------------------------------------------------------------------------------
Camera HAL的实现
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/depend/Android.mk
LOCAL_MODULE := android.hardware.camera.provider@2.4-impl-mediatek
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/depend/instance.cpp
ICameraProvider*
HIDL_FETCH_ICameraProvider(const char* name){
return createICameraProvider_V2_4(name, getCameraDeviceManager());
}
ICameraProvider*
createICameraProvider_V2_4(const char* providerName, NSCam::ICameraDeviceManager* manager){
auto provider = new CameraProviderImpl(providerName, manager);
provider->initialize();
return provider;
}
获得CameraDeviceManager对象
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/depend/instance.cpp
NSCam::ICameraDeviceManager*
getCameraDeviceManager(){
static NSCam::CameraDeviceManagerImpl singleton(getProviderType().c_str());
static bool init = singleton.initialize();
return &singleton;
}
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/CameraDeviceManagerBase.cpp
CameraDeviceManagerBase::
initialize(){
auto loadDeviceFactory = [](char const* libname, char const* symbol) {
VirtEnumDeviceFactory item;
item.mLibHandle = ::dlopen(libname, RTLD_NOW);
*(void **)(&item.mCreateVirtualCameraDevice) = ::dlsym(item.mLibHandle, symbol);
return item;
};
//从动态库中加载 createVirtualCameraDevice 函数的实现赋值给 mCreateVirtualCameraDevice
mVirtEnumDeviceFactoryMap[3] = loadDeviceFactory("libmtkcam_device3.so", "createVirtualCameraDevice");
enumerateDevicesLocked();
}
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/CameraDeviceManagerBase_camera.cpp
CameraDeviceManagerBase::
enumerateDevicesLocked(){
onEnumerateDevicesLocked();
}
CameraDeviceManagerImpl::
onEnumerateDevicesLocked(){
IHalLogicalDeviceList* pHalDeviceList;
//加载libmtkcam_modulefactory_utils.so
pHalDeviceList = MAKE_HalLogicalDeviceList();
size_t const deviceNum = pHalDeviceList->searchDevices();
mVirtEnumDeviceMap.setCapacity(deviceNum*2);
//构造多个CameraDevice3Impl并保存到mVirtEnumDeviceMap中,通过instanceId区别
for (size_t instanceId = 0; instanceId < deviceNum; instanceId++)
{
sp<IMetadataProvider> pMetadataProvider;
//创建MetadataProvider
pMetadataProvider = IMetadataProvider::create(instanceId);
NSMetadataProviderManager::add(instanceId, pMetadataProvider.get());
// 获得对应deviceid的元数据信息
addVirtualDevicesLocked(instanceId, pMetadataProvider);
}
}
-----------------------------------------------------------------------------------------------------------------------------------
//创建MetadataProvider
alps/vendor/mediatek/proprietary/hardware/mtkcam/utils/metastore/metadataprovider/MetadataProvider.cpp
IMetadataProvider*
IMetadataProvider::
create( int32_t const i4OpenId ){
MetadataProvider* p = new MetadataProvider(i4OpenId);
//初始化
p->onCreate();
return p;
}
MetadataProvider::
MetadataProvider( int32_t const i4OpenId ){
IHalLogicalDeviceList* pHalDeviceList;
pHalDeviceList = MAKE_HalLogicalDeviceList();
int32_t sensorType = pHalDeviceList->queryType(i4OpenId);
int32_t sensorDev = pHalDeviceList->querySensorDevIdx(i4OpenId);
const char* sensorDrvName = pHalDeviceList->queryDriverName(i4OpenId);
mInfo = Info(i4OpenId, sensorDev, sensorType, sensorDrvName);
showCustInfo();
}
MetadataProvider::
onCreate(){
IMetadataTagSet mtagInfo;
//根据IMetadataTagSet获得IMetadataConverter用于解析,定义了宏 _IMP_TAGCONVERT_ 使用宏填充数据
setTagInfo(mtagInfo);
//构造IMetadataConverter对象
sp<IMetadataConverter> pMetadataConverter = IMetadataConverter::createInstance(mtagInfo);
//使用IMetadataConverter初始化camera_metadata和IMetadata
status = constructStaticMetadata(pMetadataConverter, mpStaticCharacteristics, mpHALMetadata);
}
bool setTagInfo(IMetadataTagSet &rtagInfo){
#define _IMP_SECTION_INFO_(...)
#define _IMP_TAG_INF