Android AIDL通信DeadObjectException解决方法是什么(aidl,android,开发技术)

时间:2024-05-08 03:35:48 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    Android%C2%A0AIDL%E9%80%9A%E4%BF%A1DeadObjectException%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88

首先,这个崩溃的意思是,多进程在进行跨进程Binder通信的时候,发现通信的Binder对端已经死亡了。

抛出异常的Java堆栈最后一行是BinderProxy.transactNative,所以我们从这个方法入手,看看崩溃是在哪里产生的。

很显现,transactNative对应的是一个native方法,我们找到对应的native方法,在android_util_Binder.cpp中。

可以看到,这个方法主要做的事情是:

Java层传入的data,转换成C++层的指针

获取C++层的Binder代理对象

调用BpBinder对象的transact方法

处理transact的结果,抛出异常

接下来我们看看,BpBindertransact方法。

transact的具体方法,我们这里先不讨论。我们可以看到,在这里会判断当前的Binder对象是否alive,如果不alive,会直接返回DEAD_OBJECT的状态。

返回的结果,在android_util_BindersignalExceptionForError中处理。

这个方法,其实包含非常多异常情况的处理。为了看起来更清晰,这里我们省略了其他异常的处理逻辑,只保留了DEAD_OBJECT的处理。可以很明显的看到,在这里我们抛出了DeadObjectException异常。

通过前面的源码分析,我们知道DeadObjectException是发生在,当我们调用transact接口发现Binder对象不再存活的情况。

解决方案也很简单,就是当这个Binder对象死亡之后,不再调用transact接口。

这个方案比较简单粗暴,就是在多有调用跨进程接口的地方,都加一个Binder是否存活的判断。

我们来看下isBinderAlive的源码,就是判断mAlive标志位是否为0。

先初始化一个DeathRecipient,用来监听死亡通知。

在这个死亡监听里,我们可以选择几种处理方式:

什么都不做,直接将mService设置为空

再次尝试启动和绑定服务

onServiceConnected方法中,注册死亡监听:

本文:Android AIDL通信DeadObjectException解决方法是什么的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:docker的安装方式有哪些下一篇:

8 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18