1.有几个重要的问题需要理清楚:
(1)ServiceManager的启动流程
(2)ServiceManager的binder对象如何被获取
(3)如何向ServiceManager添加系统服务
(4)如何由ServiceManager获取系统服务
2.ServiceManager的启动流程
- 启动进程
注意ServiceManager和其他进程的区别 - 启动binder机制
(1)打开binder驱动(2)映射内存(3)注册binder线程 - 向binder驱动注册
告知binder驱动,当前ServiceManager已经就绪 - 进入binder循环
在这个LOOP中不断的读请求,处理请求
//伪代码
int main(int argc , char **argv){
//分配内存,然后内存映射
bs = binder_open(128*1024);
//告知binder驱动,ServiceManager已经就绪
binder_become_context_manager(bs);
binder_loop(bs,svcmgr_handler);
//两个阶段:1. 将当前线程注册为binder线程,告诉binder驱动,当前的线程是可以处理binder请求的
//int res = ioctl(fd,BINDER_WRITE_READ,binder_write_read); 将binder_write_read的数据写入到fd(binder驱动)中
//2. for(;;)循环中再用ioctl不断的读取请求,循环过程中还会回调func处理请求
return 0;
}
3.ServiceManager的binder对象如何被获取
实际的代理是new BpBinder(handler );//handler == 0
4.如何向ServiceManager添加系统服务
- 获取ServiceManager的binder对象
- 发起addService(1,2)的binder调用
注意,其中需要传入两个关键参数:(1)服务的名称(2)该服务的binder实体对象
5.如何由ServiceManager获取系统服务
- 获取ServiceManager的binder对象
- 发起getService(1)的binder调用
注意,需要传入一个参数:服务的名称
网友评论