- 第一种:放key :String - value:类的Class;
- 第二种:放key :Class的类名 - value:类的方法集合;
- 第三种:放key :Class的类名 - value:类的对象;
key:方法签名:“方法名” 有参数时用 “方法名-参数类型-参数类型-参数类型......”;
value: 方法本身;
注册后 , 服务若没被调用则一直处于沉默状态 , 不会占用内存 , 这种情况只是指用户进程里自己创建的服务 , 不适用于AMS这种;
2、服务发现: 当被查询到时 , 要被初始化;
- 客户端B通过发送信息到服务端A
- 服务端解析消息 , 反序列化
- 通过反射得到消息里的类名 , 方法 , 从注册时的第一种、第二种表里找到Class , 若对象没初始化则初始化对象 , 并将对象添加到第三种的表里;
- 使用了动态代理
- 客户端在服务发现时 , 拿到对象(其实是代理)
- 客户端调用对象方法
- 代理发送序列化数据到服务端A
- 服务端A解析消息 , 反序列化 , 得到方法进行处理 , 得到序列化数据结果
- 将序列化结果写入到客户端进程的容器中;
- 回调给客户端
文章插图
编译器生成的AIDL的JAVA接口.Stub.proxy.transact()为数据发送处;
发送的数据包含:数据+方法code+方法参数等等;
- 发送时调用了Linux的驱动
- 调用copy_from_user()拷贝用户发送的数据到内核空间
- 拷贝成功后又进行了一次请求头的拷贝:copy_from_user()
- 也就是把一次的数据分为两次拷贝
编译器生成的AIDL的java接口.Stub.onTransact()为数据接收处;
Binder中的IPC机制:
- 每个App进程启动时会在内核空间中映射一块1M-8K的内存
- 服务端A的服务注册到ServiceManager中:服务注册
- 客户端B想要调用服务端A的服务 , 就去请求ServiceManager
- ServiceManager去让服务端A实例化服务:服务发现
- 返回一个用来发送数据的对象BpBinder给到客户端B
- 客户端B通过BpBinder发送数据到服务端A的内核的映射区域(传参时客户端会传一个reply序列化对象 , 在底层会将这个地址一层一层往下传 , 直至传到回调客户端):这里发生了一次通信copy_from_user:服务调用
- 服务端A通过BBBinder得到数据并处理数据
- 服务端唤醒客户端等待的线程;将返回结果写入到客户端发送请求时传的一个reply容器地址中,调用onTransact返回;
- 客户端在onTransac中得到数据;通信结束;
三丶APP多进程的优点
- 扩大应用可使用的内存
手机内存6G , 系统分配给虚拟机的内存一般32M、48M、64M , 使用多进程时 , 可以使用一个进程专门加载图片 , 防止OOM 。 - 子进程崩溃 , 不会导致主进程崩溃
- 互相保活 , 即如果子进程被系统kill掉时 , 主进程拉起子进程 。主进程被系统kill掉时 , 子进程拉起主进程 。
文章插图
Android进程是运行在系统分配的虚拟地址空间 , 虚拟地址空间分为用户空间和内核空间 。多进程间 , 用户空间不共享 , 内核空间共享 , 进程间通过共享的内核空间通信 。
五丶多进程通信有哪些方式?1.传统的IPC方式:socket , 内存共享 。
2.Android特有的方式:Binder 。
六丶Binder相对其他IPC方式优点/为什么使用Binder?
推荐阅读
- 架构的核心要素
- 李易峰|李易峰前女友发聊天记录,公开恋爱时间约会细节,被指像在交易
- |职场上,做好这三件事,很容易成为同事眼中的好人
- 刘晓庆|女技师更表示,接待过李易峰的小姐透露,他的体力透支得很厉害
- 湾湾|李易峰“塌房”事件后,女网红湾湾被扒出,曾为见54先生吃美白丸
- 最简单的易经算卦步骤 怎么用易经算卦
- 李沁|李易峰被实锤后,网友表示心疼李沁!
- 易有“桃花劫”的星座,感情上容易受伤,对爱痴情,却没有好结果
- 贾乃亮|红得快凉得也快,不止李易峰,2022塌房的十位明星,不值得同情
- 孙红雷|李易峰怎么翻车的?叔叔还不接受“狡辩”!“大数据扫青”告诉你