和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、CameraService 流程概览
二、CS进程启动流程时序图
三、CameraService进程的启动流程
四、总结
一、CameraService 流程概览
image
二、CS进程启动流程时序图
2.1 CS进程的类图
image
2.2 进程启动时序图
image
三、CameraService进程的启动流程
CameraService和上层APP是通过IPC机制进行通信的,这里会用到aidl - cpp(AIDL文件会编译生成native binder所需的c文件--IXXX.h BpXXX.cpp BnXXX.cpp以及java层所需的 IXXX.java文件)这里CameraService是ICameraService.aidl 的服务端,framwork中android.hardware.camera2下面提供的CameraManager就是ICameraService.adil 的客户端代理。
AIDL文件 | 服务端 | 客户端 | BinderName |
---|---|---|---|
ICameraService.aidl | CameraService进程(CameraService.cpp) | CameraManager(Framework API) | media.camera |
ICameraServiceProxy.aidl | CameraServiceProxy(Java层的系统服务) | CameraService进程中使用 | media.camera.proxy |
ICameraDeviceCallbacks.aidl | CameraDeviceImpl.CameraDeviceCallbacks | CameraService进程中使用 | 匿名Binder |
ICameraDeviceUser.aidl | CameraService进程(CameraDeviceClient.cpp) | ICameraDeviceUserWrapper(API) | 匿名Binder |
1、程序的入口
frameworks\av\camera\cameraserver\main_cameraserver.cpp
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();
}
上面的代码CameraService::instantiate()调用到了frameworks\av\services\camera\libcameraservice\CameraService.cpp里面
2、开始ICameraService服务端Binder的创建和注册流程
class CameraService :
public BinderService<CameraService>, //模板类 主要是封装了将Binder 添加到ServiceManager进程中
public virtual ::android::hardware::BnCameraService, // ICameraService的服务端需要继承BnCameraService(native binder的写法)
public virtual IBinder::DeathRecipient, //Binder死亡监听 监听客户端进程的死亡情况
public virtual CameraProviderManager::StatusListener{}
// CameraService::instantiate(); 调用这里的instantiate() 主要是向sm注册了ICameraService的服务端binder
template<typename SERVICE>
class BinderService
{
public:
static status_t publish(bool allowIsolated = false,int dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT) {
sp<IServiceManager> sm(defaultServiceManager());
// 这里就是向sm进程中注册Binder 这里的Binder的名称是 "media.camera"
return sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated,dumpFlags);
}
static void publishAndJoinThreadPool(bool allowIsolated = false,int dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT) {
publish(allowIsolated, dumpFlags);
joinThreadPool();
}
static void instantiate() { publish(); }
static status_t shutdown() { return NO_ERROR; }
private:
static void joinThreadPool() {
sp<ProcessState> ps(ProcessState::self());
ps->startThreadPool();
ps->giveThreadPoolName();
IPCThreadState::self()->joinThreadPool();
}
};
上面的new SERVIDE() 让程序流程来到了CameraService() 构造函数里面,CameraService继承额BnCameraService(这个是AIDL--cpp生成的代码)所以CameraService.cpp是ICameraService.adil的IPC机制的服务端。
3 CameraService的构造函数
CameraService::CameraService() :
mEventLog(DEFAULT_EVENT_LOG_LENGTH), //初始化用来打印Log的圆形Buffer的长度-100
mNumberOfCameras(0),//初始化Camera的数量为0
mSoundRef(0),
mInitialized(false) //标识CameraService 是否被初始化了
{
ALOGI("CameraService started (pid=%d)", getpid());
mServiceLockWrapper = std::make_shared<WaitableMutexWrapper>(&mServiceLock);
}
构造函数执行完成之后,sm里面也注册了该服务的binder。然后因为CamerService继承了RefBase所以CamerService对象在第一次被创建的时候会调用到onFirstRef()函数:
4、CameraService的onFirstRef()
void CameraService::onFirstRef()
{
ALOGI("CameraService process starting");
BnCameraService::onFirstRef(); // 调用它的父类的onFirstRef()函数
// Update battery life tracking if service is restarting
BatteryNotifier& notifier(BatteryNotifier::getInstance());
notifier.noteResetCamera();
notifier.noteResetFlashlight();
status_t res = INVALID_OPERATION;
//主要是调用 enumerateProviders() 函数获取CameraProvider信息。
res = enumerateProviders();
if (res == OK) {
mInitialized = true;
}
//连接CameraServiceProxy服务,也就是"media.camera.proxy"服务,此服务由SystemServer注册到ServiceManager中
CameraService::pingCameraServiceProxy();
mUidPolicy = new UidPolicy(this);
mUidPolicy->registerSelf();
}
前面主要是和电源相关的一些信息,这里不做分析。最主要的是在这里调用到了enumerateProviders()函数里面,所以
5、CameraService::enumerateProviders()
status_t CameraService::enumerateProviders() {
status_t res;
std::vector<std::string> deviceIds;
{
Mutex::Autolock l(mServiceLock);
//这里就是对mCameraProviderManager创建然后调用它的初始化函数
if (nullptr == mCameraProviderManager.get()) {
// 创建一个 CameraProviderManager 对象之后调用 initialize(),
// 其实就是将CameraService设置为 CameraProviderManager 的监听者
mCameraProviderManager = new CameraProviderManager();
// 传入的参数是 this 指针,指向当前 CameraService 实例的地址
res = mCameraProviderManager->initialize(this);
if (res != OK) {
ALOGE("%s: Unable to initialize camera provider manager: %s (%d)" __FUNCTION__, strerror(-res), res);
return res;
}
}
// 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