1、CameraService的注册
在ServiceManager的初始化过程中,会启动MediaService进程,而在MediaService进程中会初始化一系列的服务,这其中就包括CameraService.
int main(int argc __unused, char** argv)
{
...
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
ResourceManagerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
SoundTriggerHwService::instantiate();
RadioService::instantiate();
registerExtensions();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
在MediaServer的main方法中,会调用CameraService的instantiate方法来进行CameraService的注册。继续分析instantiate方法:
static void instantiate() {
publish();
}
instantiate调用了publish()方法,继续看publish()方法:
public:
static status_t publish(bool allowIsolated = false) {
sp<IServiceManager> sm(defaultServiceManager());
return sm->addService(String16(
SERVICE::getServiceName()),
new SERVICE(), allowIsolated);
}
由此可知,此处将CameraService服务add到了ServiceManager进程中,即CameraService完成了注册。
2、应用层初始化流程
在android6.0源码分析之Camera框架简介中已经介绍了Camera子系统的代码结构,应用层的初始化以Camera.java的onCreate方法最为入口:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
getPreferredCameraId();
mFocusManager = new FocusManager(mPreferences,
defaultFocusModes);
/*To reduce startup time, we start the camera open and
preview threads.
We make sure the preview is started at the end of
onCreate.
*/
mCameraOpenThread.start();
...
// Make sure camera device is opened.
try {
mCameraOpenThread.join();
mCameraOpenThread =