由此可以看出,在应用层创建共享内存的步骤是
Binder机制:Client和Server通过Binder驱动程序进行通信,Client和Server通过open方法和ioctl文件操作方法与Binder驱动程序进行通信
当Client向Server请求服务时,首先应向Server获取一个代理对象,该代理对象是在Client方建立的一个Server的代理,它具有并且能够行使Server的功能,然后Client通过调用代理对象的方式,向Server发送请求,代理对象将用户请求通过Binder驱动发送给Server进程,Server对用户请求进行处理,之后将返回结果通过Binder驱动传递给代理对象,最后代理对象将结果返回给Client
从内核角度分析Binder进程间通信:
如上图所示,进程A与进程B通信:
由图可知:HAL层的Binder Adapter对Binder驱动进行了屏蔽,使应用程序不必直接与Binder驱动进行交互
应用层面有IBinder,Binder(Client),Binder(Server)等类库
Binder中的CS交互实例分析:
解释一下:安卓系统启动之后,SS(Zygote启动的第一个子进程)会首先启动PMS,PMS是一个负责处理各种应用程序的安装,卸载,管理等工作的服务,PMS中的parsePackage函数会对AndroidManifest.xml文件进行解析,然后获取应用程序所申请的权限,然后根据申请的权限,授予应用程序相应权限的组ID,由于应用程序在安装的时候系统已经赋予了UID,这样一来,拥有UID和组ID(GID)的应用程序便可以正常启动。
应用程序在获得了组ID之后,调用AMS类的startProcessLocked方法来启动应用程序,该函数会创建一个ActivityThread,传入的参数包括UID和GID
最终内核层执行的是setgid函数和setuid函数
应用程序签名机制:
ROM签名:对整个Android系统包进行签名
APK签名:对单个应用进行签名
Android的apk实质上是jar包,签名采用的工具是signapk.jar
下面来解释这幅图:
MANIFEST.MF文件:是对apk包中所有未签名的文件逐个用SHA1进行数字签名,再对数字签名用Base64编码,最后将编完码的签名写入MANIFEST.MF中。如果恶意程序改变了apk中的内容,那么进行apk安装校验的时候,改变后的摘要信息与MANIFEST.MF中的检验信息不同,应用程序便不能安装成功
CERT.SF文件:对 MANIFEST.MF进行私钥加密用SHA1-RSA算法,得到CERT.SF文件,RSA是一种非对称数字加密算法,私钥加密,公钥解密。
CERT.RSA文件:对 MANIFEST.MF进行公钥加密
Android的加密不能防止程序被恶意修改,只能检测出程序是否被修改过