[转帖]Andorid: Unknown binder error code 0xfffffff7_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4661 | 回复: 0   主题: [转帖]Andorid: Unknown binder error code 0xfffffff7        下一篇 
q563725885
注册用户
等级:少校
经验:1134
发帖:98
精华:1
注册:2013-5-7
状态:离线
发送短消息息给q563725885 加好友    发送短消息息给q563725885 发消息
发表于: IP:您无权察看 2013-5-10 15:35:46 | [全部帖] [楼主帖] 楼主

Binder机制是Android系统进程间通信的核心机制,它很大而且很复杂,不过对它有一定程度的理解和掌握是真正接触    

    Android核心的必备。网上关于它的介绍很多,希望大家能耐着性子认真地学习Binder机制的实现。在此,给大家分享一个

     我认为挺好地学习Binder机制基础的博客《Android系统中Binder机制的分析系列》,希望对大家有用。 本来也准备自己

     写点关于Binder机制的,但无奈自己的理解程度还很肤浅,只好放弃了。

    自己从事的模块开发采用了Binder机制进行功能的开发,对Binder机制的不熟悉,导致了很多Bug的出现,可谓“一Bug

    未解,一Bug又起”,伤脑筋。今天对Binder运用过程中可能出现的两个问题做下总结,希望帮大家有所启发。

     为了下面叙述的清楚,假设我们存在如下的Binder交互对象:

          北京联动北方科技有限公司

  1 、 binderDied()方法的触发时机


        当客户端对象A死掉时或者其他情况导致该Binder发生结束了,就会回调binderDied()方法,用户可以在这个方法里

     进行捕捉binder死掉。

     其方法原型在:IBinder.h文件中 (frameworks/base/include/binder/Ibinder.h)

[java]view plaincopyprint?

  1. /** 
  2.  * This method allows you to add data that is transported through 
  3.  * IPC along with your IBinder pointer. When implementing a Binder 
  4.  * object, override it to write your desired data in to @a outData. 
  5.  * You can then call getConstantData() on your IBinder to retrieve 
  6.  * that data, from any process. You MUST return the number of bytes 
  7.  * written in to the parcel (including padding). 
  8.  */ 
  9.  class DeathRecipient : public virtual RefBase 
  10.  { 
  11.        public: 
  12.        virtual void binderDied(const wp<IBinder>& who) = 0; 
  13.  }; 


/**
* 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?

  1. //Binder机制服务端的具体实现类 
  2. class BnXXX: public BnInterface<IXX> 
  3.       public: 
  4.        virtual status_t onTransact( uint32_t code, 
  5.        const Parcel& data, 
  6.        Parcel* reply, 
  7.        uint32_t flags = 0); 
  8.       
  9.        //当Binder机制的客户端死掉,导致了该Binder结束,会回调此方法 
  10.        void FMRadio::binderDied(const wp<IBinder>& who) { 
  11.              //输出该Binder进程所在的信息 包括进程Id(pid)等 
  12.              LOGD("binderDied() 1 %p, tid %d, calling tid %d", who.unsafe_get(), gettid(), 
  13.              IPCThreadState::self()->getCallingPid()); 
  14.              // do something 
  15.        } 


//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吧 ,善莫大焉 !




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论