1.android Binder 原理面试回答方式?
1》 android 向binder注册service服务的方式及原理?
通过ServiceManager.add 方法向SystemServer进程注册一个跨进程服务,这种是系统源码通常使用的方式。通过ConnectService方式 注册服务,这种是客户端通常使用的方式。
2》service注册的过程(上面两种注册方式)?
3》从Client端方法向Server端调用的过程?
4》优缺点,binderService 的流程
binder是什么:android跨进程IPC开发的一种方式,android系统是基于linux系统的,在android源码中大量采用了binder通讯
为什么?优点:
1.linux中有多种方式实现跨进程通讯例如:pipe管道、socket、广播、binder/aidl等,但是除了binder其他的通讯方式都需要复制两次数据,这样以来突出了binder通讯的优点比较快
2.binder的安全性,因为binder在通讯时系统会先通过uid和pid的验证,然后才通讯。
3.binder是使用C/S的通讯,client和serve通讯简单方便,而且binder是liunx自带的通讯方式。
实现方式:
1.binder通信是linux系统自带的通信方式,binder是C/S架构分为客户端/服务端,binder在使用之前首先需要注册:注册的方式有两中一是通过binderservice方式这也是我们app开发中常用的方式、想对于native层注册的方式主要采用ServiceManager.addservice方法进行注册例如AMS/PMS/WMS等在都是在SystemServer进程中通过ServiceManager进行注册的。
2.使用ServiceManager注册,首先一个进程在创建之后会具有自己的ProcessState对象这个对象是个单例每个进程只有一个,在ProcessState的构造方法中首先会调用Open(/dev/binder)方法去开启binder驱动,之后binder通信才能使用。然后会去拿到底层的ServiceManager对象把当前的需要注册的服务对象obj传到do _add_service方法中把obj加入到一个列表中,这样我们的服务就注册成功了。
3.注册完成之后,我们就可以通过客户端进行调用服务端方法实现,首先当我们通过ServiceManager和服务名称拿到对应服务对象调用具体实现首先客户端service会去调用java层的BinderProxy remote.transact()方法然后转到Native JNI 层调用BpBinder的transact()这个方法中会创建IPCThreadState然后调用transact方法才真正的参与到binder驱动的控制,然后iolt通过binder驱动把数据写入到驱动的共享内存中,然后通过驱动往服务端发送消息调用JavaBBinder的transact方法依然通过IPCThreadState的execCommand()方法转换到java曾的 Binder 中java方法 execTransaction()方法然后调用抽象方法ontransaction()然后调用到具体的方法实现。
整个过程其实分为3部分1.java层2.jni层3.native驱动层,其实java和jni层就只是binder的架构实现,真正的功能操作还是驱动层的代码。
bindService流程分析
![](https://img.haomeiwen.com/i7759493/2ea8712c05fb795e.png)
代码架构:
![](https://img.haomeiwen.com/i7759493/0d0345c2bf4a6b5b.png)
/**
* 1.native 层 service_manager进程的启动
* 2.native 层 其他进程如何创建ServiceManager对象的
* 3.native 层 binder架构是什么样子
* 4.native 层 调用ServiceManager对象的方法
* 5.native 层开启的进程main_mediaserver/main_cameraserver
* 6.Java 层怎么获得到native 层 servicemanager对象的
* 7.java 层怎么创建BinderProxy
* 8.java层的架构
*/
网友评论