这里以surfaceflinger为例子:
1、在init中启动采用如下方式:
int main(int argc, char** argv) { SurfaceFlinger::publishAndJoinThreadPool(true); // When SF is launched in its own process, limit the number of // binder threads to 4. ProcessState::self()->setThreadPoolMaxThreadCount(4); return 0; }
总结出:xxxservice只需要Public BinderService即可,写个main函数就能启动服务,其中服务的注册由基类BinderService的publishAndJoinThreadPool来完成。
static void publishAndJoinThreadPool(bool allowIsolated = false) { sp<IServiceManager> sm(defaultServiceManager()); sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated);//“SurfaceFlinger” 注册到SM中 ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool();//binder的交互 }
以此方式启动的xxxservice只需在init.rc设置service xxxservice 可执行文件的path
2、在systemserver中添加相关的服务,比如systemserver的在init1中,或者init2.
SurfaceFlinger::instantiate();//调用binderservice的publish函数
static status_t publish(bool allowIsolated = false) { sp<IServiceManager> sm(defaultServiceManager()); return sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated); }