跨进程

Binder源码阅读(java层)

2019-11-20  本文已影响0人  JianShu_w

宏观上Binder机制

Binder机制分析

Binder机制小案例(进程通信)

进程A

创建aidl文件,编译生成对应的java文件 进程A创建一个Service 注册

进程B

创建和进程A一模一样的aidl文件,包括实际的包路径

进程B开启服务

带着问题读源码

onBind的返回值是怎么到onServiceConnected的IBinder参数的?

                           Context  mBase    Context的实现类是ContextImpl

bindService()—》mBase.bindService(service, conn, flags)--》bindServiceCommon(service, conn, flags, Process.myUserHandle())

这里调用的是ActivityManagerProxy的bindService(),ActivityManagerProxy是proxy ActivityManagerNative类的getDefault()方法 还是进程B,得到系统的IBinder引用,就可以调用到系统进程的方法了 转换成Proxy,还是进程B 这里还是进程B,直到调用transact(),这里mRemote是系统返回的IBinder引用 进入系统进程,transact是Binder类里面的方法,实现了IBinder接口,ActivityManagerNative 继承了Binder类调用ActivityManagerNative的onTransact() 系统进程的onTransact(),根据BIND_SERVICE_TRANSACTION定位到这里,这里bindService()的参数全是进程B的信息 还在系统进程,ActivityManagerNative的实现类ActivityManagerService的bindService() ActiveServices类的bindServiceLocked()方法 bindServiceLocked()方法后面的代码,flags值是Context.BIND_AUTO_CREATE bringUpServiceLocked()方法关键代码,创建Service realStartServiceLocked()方法关键代码,创建Service 发送创建Service消息 handleCreateService()创建了,并调用了Service生命周期,把Service放入集合中

进程A和Service已经有了,接下来就剩绑定了

ActiveServices的bindServiceLocked()方法里绑定Service 绑定服务,r.app.thread是进程A 按理说这里的mRemote.transact是跨进程到进程B,但是mRemote是系统的Binder,这里有疑问???以后补充 到这里就知道con回调了
上一篇下一篇

猜你喜欢

热点阅读