一.如何启动service_manager服务
ServiceManager管理系统服务 AMS PMS(binder)
1.binder_open打开驱动,内存映射 设置128K
2.binder_become_context_manager设置SM为大管家(守护进程)
1.创建binder_node结构体对象
2.proc->binder_node BBinder
3.创建work 和todo队列 -》类似messageQueue
3.binder_loop 循环处理数据
1.写入状态为loop BC_ENTER_LOOPER
2.binder_write处理write
binder_read处理read
binder_icotl读数据: binder_thread_read:ret=wait_event_freezable_exclusive(proc->wait,binder_has_proc_work(work,thread)):进入等待
二.如何获取service_manager服务
sm获取---native层获取
获取sm的情况:native的服务注册和获取都走这个
1.注册服务到sm -native
2.通过sm去获取服务 ---java
也是服务端
1.ProcessState::self()->getContextObject(NULL)
ProcessState::self()
1.打开驱动:binder
2.设置线程最大数目:15个
3.mmap --设置共享内存大小 1M-8K普通服务大小( 8k 两个保护页 增加linux 页交换的效率。)
getContextObject(NULL)
Native
1.创建一个BpBinder --客户端的对象
2.interface_cast
1.new BpServiceManager(new BpBinder())
2.remote.transact -->远程调用
3.remote ==BpBinder
java端
1. new ServiceManagerProxy(new BinderProxy())
2.BinderProxy.mObject==BpBinder
3.mRemote== BinderProxy
4.mRemote.transact ==BpBinder.transact
三.详解AIDL生成的Java类
讲解AIDL生成的代码 字节面试
asInterface检测是不是同进程,不是同进程,创建proxy
data reply包裹发给服务端 data是给服务端处理的,reply当服务端处理完,有返回值,就放入reply
同步的情况 transcat 调用后会挂机 一般都是同步