Android Framework- ServiceManger 启动

269 阅读2分钟

ServiceManger的个人理解

ServiceManager 就是个应用,在架构上没啥区别,也需要和binder 驱动交互。

唯一特殊就是 会保存 一些IBinder的引用,比如 AB交互,不能直接干,需要找到ServiceManager 进行交互。 当中介。

如果A想发布 自己的服务,就需要调用addService() 这就需要这个中介了。

而获取服务就得getService() 也是一个道理。 在具体点 可以理解为DNS服务器。

在开机启动 init的时候 开始启动 servicemanager

 on init
   # Start essential services.
   #启动了 servicemanager
    start servicemanager
    start hwservicemanager
    start vndservicemanager

servicemanager.rc

 //native/cmds/servicemanager/servicemanager.rc
 class core animation
    user system
    group system readproc
    critical
    onrestart restart apexd
    onrestart restart audioserver
    onrestart restart gatekeeperd
    onrestart class_restart main
    onrestart class_restart hal
    onrestart class_restart early_hal
    writepid /dev/cpuset/system-background/tasks
    shutdown critical

源码

//native/cmds/servicemanager/main.cpp
​
int main(int argc, char** argv) {
    
  //省略
    const char* driver = argc == 2 ? argv[1] : "/dev/binder";
​
    //这里搞了个ProcessState 构造函数肯定起binder了
    sp<ProcessState> ps = ProcessState::initWithDriver(driver);
    ps->setThreadPoolMaxThreadCount(0);
    ps->setCallRestriction(ProcessState::CallRestriction::FATAL_IF_NOT_ONEWAY);
   //构建ServiceManager
    sp<ServiceManager> manager = sp<ServiceManager>::make(std::make_unique<Access>());
    //失败报错 添加了service 把自己加入进去了
    if (!manager->addService("manager", manager, false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk()) {
        LOG(ERROR) << "Could not self register servicemanager";
    }
​
    IPCThreadState::self()->setTheContextObject(manager);
    //把自己变为serviceManager 设置为管理员
    ps->becomeContextManager();
​
    //设置looper
    sp<Looper> looper = Looper::prepare(false /*allowNonCallbacks*/);
  
   //处理binder 的回调
    BinderCallback::setupTo(looper);
  // 处理客户端回调 后面会调用到 handleServiceClientCallback
    ClientCallbackCallback::setupTo(looper, manager);
      //looper 搞起
    while(true) {
        looper->pollAll(-1);
    }
​
  
    return EXIT_FAILURE;
}
​
​

做个简单梳理

在 开机启动init后,调用servicemanager main.cppmain() 函数里 ,调用ProcessState 开启了binder, 申请了内存,构建manager, 并将自己addService() 添加进去, 将自己转变为ServiceManger, 变身DNS服务器(我个人理解), 开启looper ,接收binder回调信息。 并处理了binder 监听回调和client的回调。 这里有一点,服务拿的都是fd句柄,其实需要的内存是比较小的。对ServiceManger.java 中的方法,对应的cpp 都有对应的方法。