service manager
2021-11-20 04:26:58 0 举报
android ServiceManager三大流程介绍:启动过程, 获取过程,addService的过程
作者其他创作
大纲/内容
调用IPCThreadState 的 trannsact方法进行命令发送
defaultserviceManager
getContextObject
binder_new_node 会创建binder_node 并存入binder_proc的红黑树nodes链表中,并创建async_node 和 binder_work两个队列
parcel.writeStrongBinder将IBinder对象转换为flat_binder_obj然后将flat_binder_obj 使用 writeObject写入到parcel中
writeStrongBinder
BpBinder(0)
BpBinder.transact()
svcmgr_andler
注册服务时,根据服务的名称注册,名称相同时,先移除原来的注册信息binder 死亡通知的发出是因为binder所在进程死亡后会调用binder_release方法,然后调用binder_node_release,在这个过程中就会发出死亡通知了。
binder_looper
ioctl
mmap
ServiceManager addService 流程
mmap 内存映射
binder_new_node
binder_ioctl_set_ctx_mgr
IServiceManager.defaultServiceManager()
service manager 启动的过程1. init.rc 中配置2. servicemanager mmap 大小为128k
ProcessState::slef
binder_write
openBinder
BpServiceManager::addService()
BpServiceManager
打开/dev/binder 设备,文件描述符保存为mDriverFD判断binder version 是否合法设置的最大线程数默认为DEFAULT_MAX_BINDER_THREADS = 15mmap 映射的大小为BINDER_VM_SIZE = 1M-8K
binder_open 会创建 binder_proc 节点,放入binder_procs链表中mmap 创建Binder_buffer,并放入binder_proc的buffers字段中
binder_parse
interface_cast<IServiceManage>
ioctl设置最大线程数
binder_become_context_manager
binder_write,调用binder_ioctl 传递的命令为BINDER_WRITE_READ,然后调用binder_ioctl_write_read,然后将数据从用户空间的ubuf中复制到内核空间的bwr结构体中,然后根据bwr的write 字段和read字段内容分别调用binder_thread_write 和 binder_thread_read
addService
写入Service Name
servicemanager.main()
open('dev/binder')
open_driver
0 条评论
下一页