Android中binderDied()以及"Unknown binder error code" 出现的原因说明-阿里云开发者社区

开发者社区> 范大脚脚> 正文

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)

          

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



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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9496 0
openStack cinder 在往虚拟机上挂载云磁盘时总是提示挂在错误 最后找到原因原来是指定挂载云磁盘的虚拟机被锁定
openStack 虚拟机的锁定功能是一个为了保护虚拟机 被误删除的一项创新共! 在VMs锁定状态下,一大部分针对此锁定的虚拟机都是无法执行的!! 需要进行相应的操作前,请注意解锁指定虚拟机,操作完成后再进行 锁定保护;
874 0
react-native run-android报错的原因,SDK位置未指定
react-native run-android报错的原因,SDK位置未指定
11 0
MySQL:关于排序order by limit值不稳定的说明(1)
水平有限,有过有误请谅解和指正,仅仅作为抛砖引玉。谢谢! 源码版本:5.7.14本文约定:PQ 就是 Priority Queue 及优先队列其核心是堆排序,文中代表一种算法。 一、问题抛出 数据如下: CREATE TABLE `testse` ( `id` int(11) NOT NUL.
1293 0
android 中获取sha1值的详细说明
android 中获取sha1值的详细说明
9 0
系统稳定性——StackOverFlowError 常见原因及解决方法
作者:涯海 创作日期:2019-07-26 专栏地址:【稳定大于一切】每一个 JVM 线程都拥有一个私有的 JVM 线程栈,用于存放当前线程的 JVM 栈帧(包括被调用函数的参数、局部变量和返回地址等)。如果某个线程的线程栈空间被耗尽,没有足够资源分配给新创建的栈
703 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13186 0
系统稳定性——NoSuchMethodError 常见原因及解决方法
> 作者:涯海 > 创作日期:2019-08-06 > 专栏地址:[【稳定大于一切】](https://github.com/StabilityMan/StabilityGuide) 当应用程序试图调用类(静态或实例)的指定方法,而该类已不再具有该方法的定义时,就会抛出 `java.lang.NoSuchMethodError` 错误。简单地说,就是同一个类有多个版本,并且在运行
704 0
Android TableLayout中的使用说明
TableLayout特点:       1)TableLayout和我们平时在网页上见到的Table有所不同,TableLayout没有边框的       2)它是由多个TableRow对象组成,每个TableRow可以有0个或多个单元格,每个单元格就是一个View。
721 0
+关注
3656
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载