Binder

1.大致了解Binder的调用过程:Android学习笔记--Binder

如果一个服务需要通过binder机制对外提供跨进程的接口,需要做下面这些事情。 
    (1) 第一步,需要为这个接口定义一个继承自IInterface的接口类,假设叫做IMyService。 
    (2) 第二步,需要定义两个binder类,其中一个是代理类BpMyService,需继承自BpInterface;另一个是实现类BnMyService,需继承自BnInterface。 
    (3) 第三步,定义BnMyService的子类,这个子类可以是任何名字,比如就叫MyService,在其中真正实现接口所提供的各个函数。 
    (4) 第四步,创建MyService的实例,注册到服务管理器(如IMediaPlayerService),也可以在其它接口的函数中创建(如上面的IMediaPlayer)。


2.参考文章:Android深入浅出之Binder机制

以MediaServer注册MediaPlayerService来分析进程间通信。
1.首先打开binder设备
2.通过defaultServiceManager来返回一个new IserviceManager,应该是注册的意思
3.通过MediaPlayerService::instantiate();来添加service到ServiceManager中去。实际上调用的是BpServiceManager中的addService,addService通过进程间通信传递到BnSercieManager,实际执行是在ServiceManager.c中。

int main(int argc, char** argv)
{
    sp<ProcessState> proc(ProcessState::self());//获取ProcessState实例,主要作用就是打开dev/binder设备(open_dirver)
    sp<IServiceManager> sm = defaultServiceManager();
    LOGI("ServiceManager: %p", sm.get());


    //add for coredump .check only in debug mode
    {
        char value[PROPERTY_VALUE_MAX];
        property_get("ro.debuggable", value, "0");
	if(value[0] == '1' )
	{
	    struct rlimit rl;
	    rl.rlim_cur = -1;
	    rl.rlim_max = -1;
	    setrlimit(4,&rl);
	}
    }


    VolumeManager::instantiate(); // volumemanager have to be started before audioflinger
    AudioFlinger::instantiate();
    MediaPlayerService::instantiate();
    CameraService::instantiate();
    AudioPolicyService::instantiate();
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}


2.defaultServiceManager()
sp<IServiceManager> defaultServiceManager()
{
    if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
    
    {
        AutoMutex _l(gDefaultServiceManagerLock);
        if (gDefaultServiceManager == NULL) {
            gDefaultServiceManager = interface_cast<IServiceManager>(
                ProcessState::self()->getContextObject(NULL));
        }
    }
    
    return gDefaultServiceManager;
}
1.ProcessState::self()->getContextObject(NULL)相当于 newBpBinder(0);
2.interface_cast<IServiceManager>()的实质是  return IServiceManager:asInterface(obj);

3.


binder的实质意义就是让两个进程通信。


3.JAVA层binder调用

1.做一些初始化工作       系统注册一些JNI函数
int register_android_os_Binder(JNIEnv* env)
{
    if (int_register_android_os_Binder(env) < 0)//初始化java Binder与Native的关系
        return -1;
    if (int_register_android_os_BinderInternal(env) < 0)//BinderInternal与Native的关系
        return -1;
    if (int_register_android_os_BinderProxy(env) < 0)//BinderProxy与Native的关系
        return -1;
    if (int_register_android_os_Parcel(env) < 0)//Parcel与Native的关系
        return -1;
    return 0;
}
static int int_register_android_os_Binder(JNIEnv* env)
{
    jclass clazz;
    clazz = env->FindClass(kBinderPathName);//kBinderPathName为java类binder的全路径名   为“android/os/Binder”
    LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.Binder");
     //gBinderOffsets保存一些Binder类在JNI中使用的数据
    gBinderOffsets.mClass = (jclass) env->NewGlobalRef(clazz);
    gBinderOffsets.mExecTransact
        = env->GetMethodID(clazz, "execTransact", "(IIII)Z");
    assert(gBinderOffsets.mExecTransact);
    gBinderOffsets.mObject
        = env->GetFieldID(clazz, "mObject", "I");
    assert(gBinderOffsets.mObject);
    return AndroidRuntime::registerNativeMethods(
        env, kBinderPathName,
        gBinderMethods, NELEM(gBinderMethods));
}
框架的初始化就是获取一些JNI层的一些信息。
2.
 public static void setSystemProcess() {   //将AMS注册到ServiceManager中去
            ActivityManagerService m = mSelf;         
            ServiceManager.addService("activity", m);}


java层的service是如何在SM中注册的??

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值