一、概述
本文将介绍系统服务获取的具体流程,如获取ActivityManagerService时,通过ServiceManager中的getService静态方法获取具体的服务,这个流程经历Java层,Native层,Kernel层,其通信流程如下:
1.发起端进程向Binder Driver发送binder_ioct请求后,采用不断的循环talkWithDriver,此时线程处于阻塞状态,直到收到BR_RPLEY命令才会结束该流程;
2.waitForResponse收到BR_RPLEY命令后,则直接退出循环,不会再执行executeCommand方法,除六种其他命令外(BR_REPLY、BR_TRANSACTION_COMPLETE、BR_DEAD_REPLY、BR_FAILED_REPLY、BR_ACQUIRE_RESULT
、BR_REPLY)会执行executeCommand方法;
3.由于ServiceManager进程已经启动,并且有binder_loop一直在循环查询命令,当收到BR_TRANSACTION命令后,就开始处理findService过程。
4.找到服务之后,通过binder驱动再传回到发起端进程,waitForResponse处理驱动发过来的BR_RPLEY,将服务的代理类返回给发起端进程。
二、获取服务进程
2.1 SM.getService
[->ServiceManager.java]
1 | public static IBinder getService(String name) { |
2.1.1 rawGetService
[->ServiceManager.java]
1 | private static IBinder rawGetService(String name) throws RemoteException { |
由前面ServiceManager注册服务中3.3.1节可知getIServiceManager()相当于ServiceManagerProxy
2.1.2 allowBlocking
[->Binder.java]
1 | public static IBinder allowBlocking(IBinder binder) { |
这个方法用来判断IBinder类,根据不同情况添加标志。
2.2 SMP.getService
[->ServiceManagerNative::ServiceManagerProxy]
1 | public IBinder getService(String name) throws RemoteException { |
由前面ServiceManager注册服务中3.3.1节
mRemote为BinderProxy对象,该对象对应于BpBinder(0),作为binder代理类,执行native层ServiceManager
2.3 BP.transact
[->BinderProxy.java]
1 | public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { |
2.4 android_os_BinderProxy_transact
[->android_util_Binder.cpp]
1 | static jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj, |
2.5 BpBinder::transact
[->BpBinder.cpp]
1 | status_t BpBinder::transact( |
2.5.1 BpBinder::transact
[->IPCThreadState.cpp]
1 | IPCThreadState* IPCThreadState::self() |
TLS(Thread local storage),线程本地存储空间,每个线程都有自己私有的TLS,线程之间不能共享。
pthread_setspecific/pthread_getspecific可以设置和获取这些空间中的内容。
2.5.2 new IPCThreadState
[->IPCThreadState.cpp]
1 | IPCThreadState::IPCThreadState() |
每个线程都有一个IPCThreadState,每个IPCThreadState都有一个mIn,mOut,成员变量mProcess保存了ProcessState变量,每个进程只有一个。
mInt用来接收来自Binder设备的数据,默认大小事256
mOut用来存储发往Binder设备的数据,默认大小事256
2.6 IPC::transact
[->IPCThreadState.cpp]
1 | status_t IPCThreadState::transact(int32_t handle, |
transact主要工作:
- errorCheck错误检查
- writeTransactionData传输数据
- waitForResponse等待响应
2.7 IPC::writeTransactionData
[->IPCThreadState.cpp]
1 | status_t IPCThreadState::writeTransactionData(int32_t cmd, uint32_t binderFlags, |
handler对象用来标记目的端,注册服务的目的端为ServiceManager,这里handle = 0所对应的是binder实体对象。
binder_transaction_data是binder驱动通信的数据结构,该过程吧Binder请求码BC_TRANSACTION和binder_transaction_data结构体写入mOut,写完后执行waitForResponse方法。
binder_transaction_data中重要的成员变量
- data_size,binder_transaction的数据大小
- data.ptr.buffer,binder_transaction数据的起始地址
- offsets_size,记录flat_binder_object结构体的个数
- data.ptr.offsets,记录flat_binder_object结构体的数据偏移量
2.8 IPC::waitForResponse
[->IPCThreadState.cpp]
1 | status_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult) |
talkWithDriver过程是和binder驱动通信过程,Binder驱动收到BC_TRANSACTION后,会回应BR_TRANSACTION_COMPLETE,然后等待目标进程的BR_REPLY.
2.9 IPC::talkWithDriver
[->IPCThreadState.cpp]
1 | status_t IPCThreadState::talkWithDriver(bool doReceive) |
binder_write_read结构体用来与Binder驱动进行数据交换,通过ioctl与mDriverFD通信,主要操作的是mInt和mOut.
ioctl通过系统调用进入到Binder Driver。
进入到Binder Driver在前面ServiceManager注册服务中第四章有详细的描述,这里直接到ServiceManager进程、
三、ServiceManager进程
从在前面ServiceManager注册服务中第二章可以看到servicemanager启动后,循环再binder_loop过程,会调用binder_parse方法
3.1 binder_parse
[->servicemanager/binder.c]
1 | int binder_parse(struct binder_state *bs, struct binder_io *bio, |
3.2 svcmgr_handler
[->service_manager.c]
1 | int svcmgr_handler(struct binder_state *bs, |
3.3 do_find_service
[->service_manager.c]
1 | uint32_t do_find_service(const uint16_t *s, size_t len, uid_t uid, pid_t spid) |
这里返回已经注册的服务。
3.4 binder_send_reply
[->servicemanager/binder.c]
1 | void binder_send_reply(struct binder_state *bs, |
将BC_FREE_BUFFER和BC_REPLY发送给binder驱动,向client发送reply。
四、获取服务进程
上面2.2节中transact之后,执行reply的readStrongBinder操作。
4.1 readStrongBinder
[->Parcel.java]
1 | /** |
4.2 android_os_Parcel_readStrongBinder
[->android_os_Parcel.cpp]
1 | static jobject android_os_Parcel_readStrongBinder(JNIEnv* env, jclass clazz, jlong nativePtr) |
4.3 readStrongBinder(Java)
[->Parcel.java]
1 | public final IBinder readStrongBinder() { |
[->android_os_Parcel.cpp]
1 | static jobject android_os_Parcel_readStrongBinder(JNIEnv* env, jclass clazz, jlong nativePtr) |
4.4 readStrongBinder(C++)
[->Parcel.cpp]
1 | sp<IBinder> Parcel::readStrongBinder() const |
4.4.1 unflatten_binder
[->Parcel.cpp]
1 | status_t unflatten_binder(const sp<ProcessState>& proc, |
4.4.2 getStrongProxyForHandle
[->ProcessState.cpp]
1 | sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle) |
返回BpHwBinder代理对象。
4.4.3 lookupHandleLocked
[->ProcessState.cpp]
1 | ProcessState::handle_entry* ProcessState::lookupHandleLocked(int32_t handle) |
4.4.4 finish_unflatten_binder
[->Parcel.cpp]
1 | inline static status_t finish_unflatten_binder( |
4.5 javaObjectForIBinder
[->android_util_Binder.cpp]
1 | jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val) |
gBinderProxyOffsets作为全局变量,其初始化在int_register_android_os_BinderProxy方法中。
1 | static int int_register_android_os_BinderProxy(JNIEnv* env) |
env->CallStaticObjectMethod,jni调用BinderProxy中的getInstance方法。
4.6 getInstance
[->BinderProxy.java]
1 | private static BinderProxy getInstance(long nativeData, long iBinder) { |
由上面分析, reply.readStrongBinder();等价于new BinderProxy即SMP.getService等价于new BinderProxy
五、总结
getService的核心过程
1 | public IBinder getService(String name) throws RemoteException { |
获取服务通过BpBinder发送GET_SERVICE_TRANSACTION命令和Binder驱动层进行数据交互,javaObjectForIBinder的作用是创建 BinderProxy对象,并将BpHwBinder对象的地址保存到BinderProxy的mObjects中,最后返回代理对象。
附录
源码路径
1 | frameworks/base/core/java/android/os/ServiceManager.java |