Android Binder AIDL解析

Android多进程

     当代智能手机的运行内存大多是6G、8G、12G,运行内存已经很大了, 为什么还会出现OOM呢?
     这是因为在安卓中每一个APP都会运行在一个独立的虚拟机中,这个独立的虚拟机的内存的大小是由系统指定的,一般虚拟机内存大小是32M、48M、64M,当遇到一些内存消耗较大的操作(比如加载图片)时,可能会出现内存不足的情况。在安卓中每一个进程对应一个虚拟机实例,使用多进程的方式,把加载图片的操作放到另一个进程中去执行,能有效的解决OOM的问题。
     使用多进程的好处:(1)分担主进程的内存压力。(2)即使放到其他进程工作的一些功能发生了崩溃,也不会使主进程崩溃。(3)使应用常驻后台,防止主进程被杀守护进程,守护进程和主进程之间相互监视,有一方被杀就重新启动它。
     在Android开发中,当使用webView、加载图片、推送时需要使用多进程。当程序调用系统服务(如电话服务、闹钟服务)时,需要涉及到跨进程的通信。由于不同虚拟机之间是相互隔离的,所以我们不能用常规的方法来共享数据,这时就需要使用Binder来进行跨进程通信。


进程之间通信

     Binder是Android特有的跨进程通信机制。

Binder与传统IPC对比
Binder 共享内存 Socket
性能 需要拷贝一次 无需拷贝 需要拷贝两次
特点 基于C/S架构 易用性高 控制复杂 易用性差 基于C/S架构,作为一款通用接口,其传输效率低,开销大
安全性 为每个APP分配UID,同时支持实名和匿名 依赖上层协议,访问接入点是开放的,不安全 依赖上层协议,访问接入点是开放的,不安全

     Binder实现流程参考:AIDL使用

     流程分析:以下分析流程根据AIDL使用中的代码进行分析

(1)Client:客户端通过Myaidl.Stub.asInterface(service)拿到myAidl

Android Binder AIDL解析_第1张图片
(2)Client:客户端用拿到的Myaidl调用addPerson()方法,此时操作还停留在客户端。

Android Binder AIDL解析_第2张图片
(3)Proxy:客户端调用客户端的mRemote.transact(),经过该函数,操作来到了底层Binder(此时调用的是c、c++的函数)。下图代码是自动生成的Myaidl.java。

Android Binder AIDL解析_第3张图片
(4)Binder:底层Binder调用一系列函数后,操作又回到了Java层,此时操作来到了服务端,会调用服务端的onTransact()函数

Android Binder AIDL解析_第4张图片
(5)Stub:onTransact()调用addPerson()函数,addPerson()就是服务端自己写的那个addPerson的服务,即第六步的那个操作。

Android Binder AIDL解析_第5张图片
(6)Service:调用服务中的addPerson()函数。

Android Binder AIDL解析_第6张图片

你可能感兴趣的:(Android,android)