ServiceManger的个人理解
ServiceManager 就是个应用,在架构上没啥区别,也需要和binder 驱动交互。
唯一特殊就是 会保存 一些IBinder的引用,比如 A和B交互,不能直接干,需要找到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.cpp的 main() 函数里 ,调用ProcessState 开启了binder, 申请了内存,构建manager, 并将自己addService() 添加进去, 将自己转变为ServiceManger, 变身DNS服务器(我个人理解), 开启looper ,接收binder回调信息。 并处理了binder 监听回调和client的回调。 这里有一点,服务拿的都是fd句柄,其实需要的内存是比较小的。对ServiceManger.java 中的方法,对应的cpp 都有对应的方法。