美文网首页
Android之Binder机制

Android之Binder机制

作者: flynnny | 来源:发表于2020-12-16 23:53 被阅读0次

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

    相关文章

      网友评论

          本文标题:Android之Binder机制

          本文链接:https://www.haomeiwen.com/subject/lsqogktx.html