进程间通信aidl

举例:webView、加载图片、推送、打电话、获取闹钟

多进程优点:

1解决内存不足问题
App运行在独立的虚拟机中,虚拟机为每个进程分配的内存是有限的(32M,64M,48M),比如直接加载一个大图片直接OOM
2一旦崩溃了不会影响主进程(微信小程序)

进程是怎么通信的:

多个进程之间内存是不共享的
java(linux)进程间通讯工具:共享内存,socket,消息队列,管道,信号
Binder---安卓专门的进程间通信工具

3.1.png

拷贝次数:

1、传统IPC(Socket)

3.2.png

2、BInder

3.3.png

3.31.png

通过MMAP(memory map)内存映射
Linux通过将一个虚拟内存区域与磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。
对文件进行mmap,会在进程的虚拟内存分配地址空间,建立映射关系。
实现这样的映射关系后,就可以采用指针的方式读写操作这一段内存,而系统会自动回写到对应的文件磁盘上。

3、共享内存
如果用户空间1与用户空间2 都映射到一个物理空间,即共享内存。JAVA中会导致死锁(多进程共享同一块内存,所以有同步等机制)

安全性:

1
传统IPC依赖上层协议,身份识别依赖上层(自己把生成的PID上传给系统,如果出了问题,再根据这个PID找,不安全)
Binder---每个App由系统分配UID,再用这个UID。Binder同时支持实名和匿名,实名:系统服务是实名的。匿名:自定义的Service。可看成是匿名的,其他进程拿不到。
2
访问接入点的开放性:只要知道接入点在哪,就可以去访问;
匿名:自定义的Service。可看成是匿名的,其他进程拿不到。

AIDL(安卓接口定义语言)

通过Binder要按照Binder的规矩,AIDL 就是帮我们去写这部分代码的 。

bindService(intent,connection,Context.BIND_AUTO_CREATE)后 mAidl是如何拿到的(IBinder是如何拿到的),为什么能像同一个进程一样调用?

 myAidl = MyAidl.Stub.asInterface(service);

通过此行获得的binder对象,asInterface在上面的AIDL自动生成的代码方法里。
生成的代码里有 Proxy (进站口)和Stub(出站口)两个实现类.是数据从客户端到Service传递时用的。一个是发送,一个是接收。

在 OnServiceConnected中虽然调用的是Stub.asInterface,但是进入里面后其实是 return的xxx.MyAidl.Stub.Proxy(obj);拿到进站口的票。

然后onClick方法中调用myAidl.addPerson(...); 进入后直接是Proxy里的addPerson(...)。这里 首先进行打包工程,然后

mRemote.transact(Stub.TRANSACTION_addPersion,_data,_reply,0)

出发了,mRemote即service
之后进入C/C++层,通过底层传输

然后从 Stub的onTransact(...)方法出来
通过传过来的int code(因为两端代码一样,所以优化成了int类型)找到相调用的方法,然后解包处理,然后调用this.addPerson()方法(即相应定义的方法):Stub是一个抽象类,他在Service中实现:

private IBinder ibinder = new MyAidl.stub(){
    @Override
    public void addPerson(Person person)throws RemoteException{
        persion.add(perspm);
    }
    ...
};

3.4.png

bindService 怎么让系统返回IBinder

即bindService --->onServiceConnected(...,IBinder service);获得service。

3.5.png

垮了6次进程



https://www.jianshu.com/p/477e00fce084
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值