android binder 服务,Android之Binder机制

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

多进程优点:

1解决内存不足问题

App运行在独立的虚拟机中,虚拟机为每个进程分配的内存是有限的(32M,64M,48M),比如直接加载一个大图片直接OOM

2一旦崩溃了不会影响主进程(微信小程序)

进程是怎么通信的:

多个进程之间内存是不共享的

java(linux)进程间通讯工具:共享内存,socket,消息队列,管道,信号

Binder---安卓专门的进程间通信工具

477e00fce084

3.1.png

拷贝次数:

1、传统IPC(Socket)

477e00fce084

3.2.png

2、BInder

477e00fce084

3.3.png

477e00fce084

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);

}

...

};

477e00fce084

3.4.png

bindService 怎么让系统返回IBinder

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

477e00fce084

3.5.png

垮了6次进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值