举例:webView、加载图片、推送、打电话、获取闹钟
多进程优点:
1解决内存不足问题
App运行在独立的虚拟机中,虚拟机为每个进程分配的内存是有限的(32M,64M,48M),比如直接加载一个大图片直接OOM
2一旦崩溃了不会影响主进程(微信小程序)
进程是怎么通信的:
多个进程之间内存是不共享的
java(linux)进程间通讯工具:共享内存,socket,消息队列,管道,信号
Binder---安卓专门的进程间通信工具

拷贝次数:
1、传统IPC(Socket)

2、BInder


通过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);
}
...
};

bindService 怎么让系统返回IBinder
即bindService --->onServiceConnected(...,IBinder service);获得service。

垮了6次进程
网友评论