1、 getIServiceManager获取servicemanager服务
sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
a、 BinderInternal.getContextObject()是个什么
跟踪到base/core/jni/ android_util_Binder.cpp,对应的函数为
static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz)
{
sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
return javaObjectForIBinder(env, b);
}
先看第一行,ProcessState是一个单例,从名字看和进程状态相关,路径为native/libs/binder/ProcessState.cpp
getStrongProxyForHandle(0)中默认传入为0,servicemanager的handler为0,在该函数中会传入handler创建BpBinder对象并返回。
接下来调用javaObjectForIBinder,其中有判断是不是一个Binder对象,显然不是。然后判断是不是存在BinderProxy,也不满足。所以创建一个新的BinderProxy,其中mObject指向BpBinder对象,BpBinder对象也保存BinderProxy对象的一个引用并返回BinderProxy对象。至此,可以得知BinderInternal.getContextObject()返回的实际就是一个BinderProxy对象。
b、 接下来分析ServiceManagerNative.asInterface(BinderProxy对象)
由于BinderProxy.queryLocalInterface会返回null,所以此处会返回ServiceManagerProxy对象,mRemote为BinderProxy对象。
2、 接下来分析ServiceManagerProxy的getService
a、 创建两个parcel对象,一个是用于保存传输的数据,一个用于保存返回的数据,实际是创建两个native层的parcel对象,然后将”android.os.IServiceManager”和service name保存到传输数据的parcel对象中mData中,通过mData+mDataPos来定位,用0隔开。
b、 来到重头戏mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0),从前面知道mRemote是BinderProxy对象。直接跳到android_util_Binder.cpp 中的android_os_BinderProxy_transact函数:
IBinder* target = (IBinder*)
env->GetLongField(obj, gBinderProxyOffsets.mO