ServiceManager的getService流程

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值