zoukankan      html  css  js  c++  java
  • Android中binderDied()以及"Unknown binder error code" 出现的原因说明

     

                                                                                                                                                                  转载请注明出处:http://blog.csdn.net/qinjuning

     

     

                       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)

              

    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.    };  

     

          通常而言,我们可以在服务端BnXXX 里实现该虚函数去捕获Binder死掉事件,例如:

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



         

      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 5.X新特性之RecyclerView基本解析及无限复用
    Android 网络框架之Retrofit2使用详解及从源码中解析原理
    Android 源码解析之AsyncTask
    Business Logic
    WHO AM I
    黑洞
    俄罗斯方块
    还记得八皇后的解法吗
    汝之蜜糖,吾之砒霜
    项目为什么会失败
  • 原文地址:https://www.cnblogs.com/wanqieddy/p/2484532.html
Copyright © 2011-2022 走看看