Android中binderDied()以及“Unknown binder error code” 出

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

Android核心的必备。网上关于它的介绍很多,希望大家能耐着性子认真地学习Binder机制的实现。在此 写点关于Binder机制的,但无奈自己的理解程度很肤浅,只好放弃了。

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

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

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

                                 

Android中binderDied()以及“Unknown binder error code” 出

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

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

     进行捕捉binder死掉。

    

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

          

[java]

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

//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,

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wygggj.html