Android中binderDied()以及"Unknown binder error code" 出现的原因说明

简介:

   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 plain copy print ?
  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死掉事件,例如:

 

[java]  view plain copy print ?
  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吧 ,善莫大焉 !



本文转自wanqi博客园博客,原文链接http://www.cnblogs.com/wanqieddy/archive/2012/05/05/2484532.html:如需转载请自行联系原作者

相关文章
|
7月前
|
JSON 编译器 开发工具
VS Code阅读Android源码
VS Code阅读Android源码
575 1
|
7月前
|
Android开发 开发者
Error:Could not find com.android.support:appcompat-v7:27.0.2.
Error:Could not find com.android.support:appcompat-v7:27.0.2.
147 0
|
7月前
|
开发工具 Android开发 git
解决Android AAPT: error: resource android:attr/lStar not found. 问题
解决Android AAPT: error: resource android:attr/lStar not found. 问题
533 0
|
2月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
4月前
|
Java 开发工具 Android开发
解决flutter doctor出现Android license status unknown或cmdline-tools component is missing
解决flutter doctor出现Android license status unknown或cmdline-tools component is missing
101 4
解决flutter doctor出现Android license status unknown或cmdline-tools component is missing
|
4月前
|
Android开发 Docker 容器
docker中编译android aosp源码,出现Build sandboxing disabled due to nsjail error
在使用Docker编译Android AOSP源码时,如果遇到"Build sandboxing disabled due to nsjail error"的错误,可以通过在docker run命令中添加`--privileged`参数来解决权限不足的问题。
916 1
|
7月前
|
安全 Java 定位技术
Android 浅度解析:AIDL & Binder (1)
Android 浅度解析:AIDL & Binder (1)
253 0
|
5月前
|
缓存 安全 Java
Android深入Binder拦截问题分析
【7月更文挑战第1天】Android Binder 拦截可实现虚拟化、测试、SDK检测、逆向分析及ROM扩展。通过Java层aidl代理,利用IBinder接口规范来拦截通信。拦截步骤包括:替换Binder服务缓存对象,如ActivityManagerService;代理ServiceManager以控制服务获取。此操作需系统权限,可能涉及安全风险和版本差异,非必要时应谨慎。
|
7月前
|
开发工具 Android开发 Windows
Android应用] 问题2:ERROR: unknown virtual device name:
Android应用] 问题2:ERROR: unknown virtual device name:
43 2
|
7月前
|
Android开发 开发者
安卓投屏神器 Scrcpy安 报错ERROR: Could not find any ADB device
使用Scrcpy安卓投屏工具时遇到报错,问题根源是未开启开发者模式。解决步骤:进入设置,点击【关于手机】→连续点击版本号激活开发者模式,然后在【系统设置】→【开发者选项】中开启USB调试。参照此方法后可正常执行。Scrcpy软件下载链接和GitHub页面也已提供。
832 1