Android之Binder机制

举例: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次进程

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Binder 是一种进程间通信机制,基于开源的 OpenBinder 实现 从字面上来解释 Binder 有胶水、...
    幻影_2481阅读 540评论 0 0
  • Binder是Android提供的一种进程间通信机制,它是整个Android系统的核心,Android能进行如此丰...
    浪淘沙xud阅读 5,058评论 0 11
  • 背景 Binder机制,是Android系统跨进程协作的核心。我们知道,每个应用独立地运行在自己的进程虚拟地址空间...
    风雪围城阅读 1,562评论 5 3
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,587评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,620评论 0 11