美文网首页跨进程
Binder源码阅读(java层)

Binder源码阅读(java层)

作者: JianShu_w | 来源:发表于2019-11-20 17:22 被阅读0次

    宏观上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回调了

    相关文章

      网友评论

        本文标题:Binder源码阅读(java层)

        本文链接:https://www.haomeiwen.com/subject/jqonictx.html