1上层做了那么多封装是否是过度了,难度增加就在于上层的一层层的封装。
最底层直接ioctl和binder驱动交互(单纯c语言实现binder交互)
第一层:IPCThreadState.transatct封装了对驱动的请求和接受
第二层封装用IBinder.h里面的 transatct一个方法是最直接和容易理解的
第三层封装: 服务端bbinder在 transatct里面抽象出了一个 模板方法onTransatct
第四层封装:引入通信协议接口 ,以及bpbinder bbinder 对象,这样客户端和服务端就可以调用对象来执行传输,而不是简单的根据参数来一一对应
至于如何封装的,这块应该是binder里面最难的了,当成盲盒吧,因为即使看明白了也会很快就忘,和后期的问题跟踪或解决关系也不大,基本永不上
第五层封装:就是用aidl进行封装,主要是对协议接口的parcel数据自动打包和解包的封装以及自动生成bpbinder,bbinder对象
每一层都对使用者来说都会变得更方便,但也隐藏了背后的原理。
2 parcel的作用,传个值不是直接就可以吗
跨进程传递数据为什么要用parcel封装一层? parcel在flatten和unflaten里面会加入handler或binder的值,意思是类似与给快递加上了地址
3 代理端是真的代理设计模式吗
其实就是代理端拿到了服务端的地址(handler),交给了驱动,驱动根据地址将数据放到服务端那里,并通知服务端
之所以要设计出代理的这个概念,完全是上层封装虚拟出来的一个概念,其实并不是代理模式,代理类里并没有被代理对象的引用,只是一个简单的映射关系