CameraService启动-Android12
Posted xhBruce
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CameraService启动-Android12相关的知识,希望对你有一定的参考价值。
CameraService启动-android12
android12-release
相机 | Android开源项目
1. cameraserver.rc
init进程解析cameraserver.rc,Service::Start()
fork进程cameraserver并启动对应文件main_cameraserver.cpp中main方法
frameworks/av/camera/cameraserver/cameraserver.rc
service cameraserver /system/bin/cameraserver
class main
user cameraserver
group audio camera input drmrpc
ioprio rt 4
task_profiles CameraServiceCapacity MaxPerformance
rlimit rtprio 10 10
frameworks/av/camera/cameraserver/Android.bp
cc_binary
name: "cameraserver",
srcs: ["main_cameraserver.cpp"],
header_libs: [
"libmedia_headers",
],
shared_libs: [
"libcameraservice",
// ... ... ,
],
compile_multilib: "first",
cflags: [
"-Wall",
"-Wextra",
"-Werror",
"-Wno-unused-parameter",
],
init_rc: ["cameraserver.rc"],
vintf_fragments: [
"manifest_android.frameworks.cameraservice.service@2.2.xml",
],
2. /system/bin/cameraserver启动main方法
2.1 初始化CameraService
位于 frameworks/av/services/camera/libcameraservice/CameraService.cpp 下的相机服务是与 HAL 进行互动的实际代码。
CameraService::instantiate()
继承BinderService.h,调用到publish()
,defaultServiceManager()
获取new BpServiceManager(new BpBinder(0))
,添加CameraService到binder ServiceManager,名称为"media.camera"
- 继承RefBase实例化后调用
onFirstRef()
方法;enumerateProviders()
中CameraProviderManager初始化initialize
,并getCameraDeviceIds()
获取cameradevices的所有id mSensorPrivacyPolicy
启用了传感器隐私,则应阻止所有应用程序访问摄像头;HidlCameraService::getInstance(this)
服务ICameraService给到frameworks/av/services/camera/libcameraservice/hidl/HidlCameraService.h
CameraServiceProxyWrapper::pingCameraServiceProxy()
CameraServiceProxy是Java层的系统服务,BinderName是media.camera.proxy
frameworks/native/libs/binder/include/binder/BinderService.h
frameworks/av/services/camera/libcameraservice/CameraService.cpp
CameraService::CameraService() :
mEventLog(DEFAULT_EVENT_LOG_LENGTH),
mNumberOfCameras(0),
mNumberOfCamerasWithoutSystemCamera(0),
mSoundRef(0), mInitialized(false),
mAudioRestriction(hardware::camera2::ICameraDeviceUser::AUDIO_RESTRICTION_NONE)
ALOGI("CameraService started (pid=%d)", getpid());
mServiceLockWrapper = std::make_shared<WaitableMutexWrapper>(&mServiceLock);
mMemFd = memfd_create(sFileName, MFD_ALLOW_SEALING);
if (mMemFd == -1)
ALOGE("%s: Error while creating the file: %s", __FUNCTION__, sFileName);
void CameraService::onFirstRef()
ALOGI("CameraService process starting");
BnCameraService::onFirstRef();
// Update battery life tracking if service is restarting
BatteryNotifier& notifier(BatteryNotifier::getInstance());
notifier.noteResetCamera();
notifier.noteResetFlashlight();
status_t res = INVALID_OPERATION;
res = enumerateProviders();
if (res == OK)
mInitialized = true;
mUidPolicy = new UidPolicy(this);
mUidPolicy->registerSelf();
mSensorPrivacyPolicy = new SensorPrivacyPolicy(this);
mSensorPrivacyPolicy->registerSelf();
mInjectionStatusListener = new InjectionStatusListener(this);
mAppOps.setCameraAudioRestriction(mAudioRestriction);
sp<HidlCameraService> hcs = HidlCameraService::getInstance(this);
if (hcs->registerAsService() != android::OK)
ALOGE("%s: Failed to register default android.frameworks.cameraservice.service@1.0",
__FUNCTION__);
// This needs to be last call in this function, so that it's as close to
// ServiceManager::addService() as possible.
CameraServiceProxyWrapper::pingCameraServiceProxy();
ALOGI("CameraService pinged cameraservice proxy");
2.2 CameraProviderManager初始化
该方法enumerateProviders()
中CameraProviderManager初始化initialize
,并getCameraDeviceIds()
获取cameradevices的所有id。这里查看CameraProviderManager与CameraProvider进程
建立联系。
ServiceInteractionProxy* proxy
参数默认赋值&sHardwareServiceInteractionProxy
,是远程代理类
mServiceProxy->registerForNotifications(this)
调用到hardware::defaultServiceManager()->registerForNotifications()
(system/libhidl/transport/ServiceManagement.cpp)mServiceProxy->listServices()
通过hardware::defaultServiceManager1_2()
获取注册的服务,并addProviderLocked(instance)
创建ProviderInfo对象添加mProviders中。这里主要是和CameraProvider和ExternalCameraProvider建立联系(android.hardware.camera.provider@2.4::ICameraProvider external/0 、 android.hardware.camera.provider@2.4::ICameraProvider legacy/0)
frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.h
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;
mListener = listener;
mServiceProxy = proxy;
mDeviceState = static_cast<hardware::hidl_bitfield<provider::V2_5::DeviceState>>(
provider::V2_5::DeviceState::NORMAL);
// Registering will trigger notifications for all already-known providers
bool success = mServiceProxy->registerForNotifications(
/* instance name, empty means no filter */ "",
this);
if (!success)
ALOGE("%s: Unable to register with hardware service manager for notifications "
"about camera providers", __FUNCTION__);
return INVALID_OPERATION;
for (const auto& instance : mServiceProxy->listServices())
this->addProviderLocked(instance);
IPCThreadState::self()->flushCommands();
return OK;
3. Binder启动线程池并加入
初始化CameraService时已添加"media.camera"
到Binder;接着startThreadPool()
启动Binder线程池,joinThreadPool()
当前线程加入到线程池,其他详情查看 Binder系列2-ServiceManager
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
binder IPC 接口
IPC binder 接口用于实现跨越进程边界的通信。调用相机服务的若干个相机 binder 类位于frameworks/av/camera/aidl/android/hardware
目录中。ICameraService 是相机服务的接口;ICameraDeviceUser 是已打开的特定相机设备的接口;ICameraServiceListener 和 ICameraDeviceCallbacks 分别是对应用框架的 CameraService 和 CameraDevice 回调。
4. 简要时序图
以上是关于CameraService启动-Android12的主要内容,如果未能解决你的问题,请参考以下文章
Android Camera CameraService启动流程 (androidP)
Android Camera CameraService启动流程 (androidP)
Android Camera 打开预览流程分析--CameraService中的打开流程
Android Camera 打开预览流程分析--CameraService中的打开流程