[安卓相机系列] 零、CameraServer和CameraProvider的启动初始化
一、前言
本文所使用代码为**android-10.0.0_r30
分支,可以通过Android Code Search在线浏览源码,或通过repo
工具将代码下载到本地。如何下载代码,请参考下载源代码,建议使用清华大学的Android镜像**,使用帮助:Android 镜像使用帮助。
在开始前,最好能掌握或了解以下基础知识(别担心,掌握最基础的即可,剩下的可以在阅读和理解源码的过程中慢慢学):
-
编程语言基础:C/C++、Java
-
Android中的智能指针:轻量指针、强引用指针、弱引用指针
-
Binder通信机制
-
AIDL与HIDL
-
Makefile
-
……(留坑,想到再补充)
另外最好能有以下工具或掌握以下技能:
- 一台性能不错、可以科学上网的电脑
vim
(_,我是vimer
)- Android Studio
二、开始分析
2.1 CameraService
的启动初始化
2.1.1 CameraServer
的启动
程序的执行,一定会有一个入口函数(更微观地说,是入口地址)。一般来说,不做特殊指定的话,默认的入口函数为main()
函数。那么,先来找到CameraServer
的main()
函数吧。
文件路径:frameworks/av/camera/cameraserver/main_cameraserver.cpp
int main(int argc __unused, char** argv __unused)
{
signal(SIGPIPE, SIG_IGN);
// Set 5 threads for HIDL calls. Now cameraserver will serve HIDL calls in
// addition to consuming them from the Camera HAL as well.
hardware::configureRpcThreadpool(5, /*willjoin*/ false);
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
CameraService::instantiate();
ALOGI("ServiceManager: %p done instantiate", sm.get());
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
这里面其实重要的是这么一句:CameraService::instantiate();
,这句话完成了CameraService
服务的注册以及初始化工作。方法instantiate()
是类CameraService
所继承的模板父类BinderService
中的静态方法,看以下它的实现。
文件路径:frameworks/native/libs/binder/include/binder/BinderService.h
template<typename SERVICE>
class BinderService
{
public:
static status_t publish(bool allowIsolated = false, int dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT) {
sp<IServiceManager> sm(defaultServiceManager());
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(); }
// ......
}
可以看到,instantiate()
方法的作用就是调用了BinderService
类自身的publish()
方法,获取ServiceManager
服务,调用其addService()
方法将它注册到ServiceManager
,这个过程中,创建了服务对象的实例。关于如何注册ServiceManager
,这些细节此处不考虑,以后再出一篇文章文章详细分析下。只需要了解,这一步,完成了CameraService
的启动和初始化工作,并将CameraService
注册到了ServiceManager
,那么其他地方,就可以通过ServiceManager
去获取这个服务。
服务CameraService
的启动初始化在进程CameraServer
的启动过程中,如果CameraService
启动成功了,进程也就启动成功了。但好像有些意犹未尽的感觉:这也太快了,没深入多少吧。别急,下面看以下CameraService
的启动与实例化。
2.1.2 CameraService
的启动与实例化
CameraService
作为一个服务存在于安卓系统当中,它运行在CameraServer
这个进程当中。(应当注意CameraServer
与CameraService
的区别)
文件路径:frameworks/av/services/camera/libcameraservice/CameraService.cpp
CameraService::CameraService() :
mEventLog(DEFAULT_EVENT_LOG_LENGTH),
mNumberOfCameras(0),
mSoundRef(0), mInitialized(false) {
ALOGI("CameraService started (pid=%d)", getpid());
mServiceLockWrapper = std::make_shared<WaitableMutexWrapper>(&mServiceLock);
}
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();
sp<HidlCameraService> hcs = HidlCameraService::getInstance