Android中binderDied()以及"Unknown binder error code" 出现的原因说明
2012-05-05 10:06
106 查看
转载请注明出处:http://blog.csdn.net/qinjuning
Binder机制是Android系统进程间通信的核心机制,它很大而且很复杂,不过对它有一定程度的理解和掌握是真正接触
Android核心的必备。网上关于它的介绍很多,希望大家能耐着性子认真地学习Binder机制的实现。在此,给大家分享一个
我认为挺好地学习Binder机制基础的博客《Android系统中Binder机制的分析系列》,希望对大家有用。 本来也准备自己
写点关于Binder机制的,但无奈自己的理解程度还很肤浅,只好放弃了。
自己从事的模块开发采用了Binder机制进行功能的开发,对Binder机制的不熟悉,导致了很多Bug的出现,可谓“一Bug
未解,一Bug又起”,伤脑筋。今天对Binder运用过程中可能出现的两个问题做下总结,希望帮大家有所启发。
为了下面叙述的清楚,假设我们存在如下的Binder交互对象:
![](http://hi.csdn.net/attachment/201112/19/0_1324298001XFSZ.gif)
进行捕捉binder死掉。
其方法原型在:IBinder.h文件中 (frameworks/base/include/binder/Ibinder.h)
[java] view plaincopyprint?
/**
* This method allows you to add data that is transported through
* IPC along with your IBinder pointer. When implementing a Binder
* object, override it to write your desired data in to @a outData.
* You can then call getConstantData() on your IBinder to retrieve
* that data, from any process. You MUST return the number of bytes
* written in to the parcel (including padding).
*/
class DeathRecipient : public virtual RefBase
{
public:
virtual void binderDied(const wp<IBinder>& who) = 0;
};
通常而言,我们可以在服务端BnXXX 里实现该虚函数去捕获Binder死掉事件,例如:
[java] view plaincopyprint?
//Binder机制服务端的具体实现类
class BnXXX: public BnInterface<IXX>
{
public:
virtual status_t onTransact( uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags = 0);
//当Binder机制的客户端死掉,导致了该Binder结束,会回调此方法
void FMRadio::binderDied(const wp<IBinder>& who) {
//输出该Binder进程所在的信息 包括进程Id(pid)等
LOGD("binderDied() 1 %p, tid %d, calling tid %d", who.unsafe_get(), gettid(),
IPCThreadState::self()->getCallingPid());
// do something
}
}
这个过程中如果Binder机制发生了异常,导致A与B的交互不能正常进行,例如代码中显示调用System.exit(0)结束应用程序
(说明:System.exit(0)方法会 清空该Process的一切资源,包括Activity、Service、BroadcastReceiver等资源,Binder交互
也结束),系统就打印如下Log信息:“Error: JavaBinder Unknown binder error code. 0xfffffff7”。接下来,C++层会调用
binderDied() 方法,其Binder客户端也死掉了,。
最后,希望大家在此基础上能少找些弯路,多解几个Bug吧 ,善莫大焉 !
Binder机制是Android系统进程间通信的核心机制,它很大而且很复杂,不过对它有一定程度的理解和掌握是真正接触
Android核心的必备。网上关于它的介绍很多,希望大家能耐着性子认真地学习Binder机制的实现。在此,给大家分享一个
我认为挺好地学习Binder机制基础的博客《Android系统中Binder机制的分析系列》,希望对大家有用。 本来也准备自己
写点关于Binder机制的,但无奈自己的理解程度还很肤浅,只好放弃了。
自己从事的模块开发采用了Binder机制进行功能的开发,对Binder机制的不熟悉,导致了很多Bug的出现,可谓“一Bug
未解,一Bug又起”,伤脑筋。今天对Binder运用过程中可能出现的两个问题做下总结,希望帮大家有所启发。
为了下面叙述的清楚,假设我们存在如下的Binder交互对象:
![](http://hi.csdn.net/attachment/201112/19/0_1324298001XFSZ.gif)
1 、 binderDied()方法的触发时机
当客户端对象A死掉时或者其他情况导致该Binder发生结束了,就会回调binderDied()方法,用户可以在这个方法里进行捕捉binder死掉。
其方法原型在:IBinder.h文件中 (frameworks/base/include/binder/Ibinder.h)
[java] view plaincopyprint?
/**
* This method allows you to add data that is transported through
* IPC along with your IBinder pointer. When implementing a Binder
* object, override it to write your desired data in to @a outData.
* You can then call getConstantData() on your IBinder to retrieve
* that data, from any process. You MUST return the number of bytes
* written in to the parcel (including padding).
*/
class DeathRecipient : public virtual RefBase
{
public:
virtual void binderDied(const wp<IBinder>& who) = 0;
};
通常而言,我们可以在服务端BnXXX 里实现该虚函数去捕获Binder死掉事件,例如:
[java] view plaincopyprint?
//Binder机制服务端的具体实现类
class BnXXX: public BnInterface<IXX>
{
public:
virtual status_t onTransact( uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags = 0);
//当Binder机制的客户端死掉,导致了该Binder结束,会回调此方法
void FMRadio::binderDied(const wp<IBinder>& who) {
//输出该Binder进程所在的信息 包括进程Id(pid)等
LOGD("binderDied() 1 %p, tid %d, calling tid %d", who.unsafe_get(), gettid(),
IPCThreadState::self()->getCallingPid());
// do something
}
}
2、 Unknown binder error code 0xfffffff7 出现的原因。
当客户端与服务端正在通过Binder机制交互时,例如A正在通过Binder机制与B对象进行交互,即A请求B do something,这个过程中如果Binder机制发生了异常,导致A与B的交互不能正常进行,例如代码中显示调用System.exit(0)结束应用程序
(说明:System.exit(0)方法会 清空该Process的一切资源,包括Activity、Service、BroadcastReceiver等资源,Binder交互
也结束),系统就打印如下Log信息:“Error: JavaBinder Unknown binder error code. 0xfffffff7”。接下来,C++层会调用
binderDied() 方法,其Binder客户端也死掉了,。
最后,希望大家在此基础上能少找些弯路,多解几个Bug吧 ,善莫大焉 !
相关文章推荐
- Android中binderDied()以及"Unknown binder error code" 出现的原因说明
- virtualbox 安装 extension pack 方法以及出现 "The installer failed with exit code 1: VBoxExtPackHelperApp.exe: error: Failed to rename the temporary directory to the final one"的解决办法
- 【Android基础】webview加载网页出现("找不到网页net:err_unknown_url_scheme")
- Xcode后台打印出现:[Client] Geocode error: Error Domain=GEOErrorDomain Code=-8 "(null)”
- Print2Flash出现"System Error. Code:1722. RPC服务器不可用."错误解决办法
- Unknown failure (at android.os.Binder.execTransact(Binder.java:565))Error while Installing APKs
- 使用Parse内付费服务出现的Error Domain=Parse Code=146 "The operation couldn’t be completed. (Parse error 146.)
- 微信登录出现Error Domain=UMSocialPlatformErrorDomain Code=2002 "(null)" errcode=40125,
- StarUML启动时候出现"System Error. Code:1722. RPC服务器不可用."错误的解决办法
- Android手机出现"已安装了存在签名冲突的同名数据包"的原因及解决办法
- pip安装软件时出现Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build*的解决方案
- unserialize(): Error at offset出现的原因分析以及解决方法
- 【LaTeX】WinEdt编辑UTF-8中文文档出现乱码或编译错误"Package CJK Error: Invalid character code"的解决方案
- Android studio出现Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"的解决办法
- 出现Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build*解决办法
- Android studio出现Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"的解决办法
- android-tutorial-3 编译出现 error: unknown type name 'int32_t'
- 关于Android Force Close 出现的原因 以及解决方法
- 出现"VMProcessPageFault Error: Page fault occurred while in power handler"原因及解决方法
- eclipse运行android项目出现"The connection to adb is down, and a severe error has occured."的问题