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

Android binder死亡通知机制 本文分析了binder的死亡通知机制 阅读详情
 

                                                                                                                                                              转载请注明出处:http://blog.youkuaiyun.com/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)

          

 /**
     * 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死掉事件,例如:

 

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

 

 

 

第 36 章:电话与 RIL 无线接口层是 Java 电话框架和厂商调制解调器固件之间的桥梁。早期 RIL 是 C 语言守护进程 rild,通过 Unix 套接字、自定义二进制协议与框架通信。Android12 及以后迁移到稳定 AIDL HAL,把旧的单体 IRadio HIDL 接口拆分为多个按业务域划分的 AIDL 接口。# 列出全部radio‑hal aidl文件# 统计IRadioVoice接口方法数量# 统计IRadioData接口方法数量# 查看语音通话数据结构体Call.aidl。 阅读详情

相关推荐

Vue3项目实战:CKEditor5富文本编辑器从安装到隐藏不需要的功能

本文详细介绍了在Vue3项目中集成并深度定制CKEditor5富文本编辑器的完整流程。通过分析其模块化架构,指导开发者从标准构建出发,移除图片、表格等冗余插件,创建专属轻量构建,从而显著减小打包体积并提升用户体验。文章结合实战代码,涵盖了环境搭建、自定义构建配置、高级优化技巧等关键步骤。

weixin_29016833的博客 283

Binder死亡通知

Android系统中当应用进程被kill杀掉时,底层会有该进程的Binder服务端的死亡回调通知。在应用进程创建的过程中有一个attachApplicationLocked方法的过程中便会创建死亡通知。 [-> ActivityManagerService.java] private final boolean attachApplicationLocked(IApplicationThread thread, int pid) { try { ...

weixin_40366279的博客 2354

S型速度曲线C程序实现

S型速度曲线C语言程序实现 前言 S型曲线相较于梯形速度曲线具有运行更加平稳的特点,S型曲线共有八种运行情况,感兴趣可以查阅相关文献 代码段 #include <stdio.h> #include <math.h> #define FP64 double int main(void) { /**************************** 定义相关变量(需要映射到PLC寄存器才能进行监控) ***********************/ FP6

LSX312441548的博客 8392

android AIDL binderDied

在 Android 的 AIDL (Android Interface Definition Language) 机制中,binderDied 是一个用于处理 Binder 对象死亡的回调。这个机制帮助你在 Binder 进程死掉时进行清理或恢复操作。在 onServiceConnected 方法中,通过 linkToDeath 注册 DeathRecipient。这样,当 Binder 对象死亡时,binderDied 方法将被调用。

wolf0706的专栏 827

PX4无人机offboard开发之旅

(慢慢更)无人机OFFBOARD开发

InTereSTingHE的博客 1078

Akamai移动端Sensor数据采集与BMP风控机制深度解析

本文深度解析了Akamai在移动端风控中的核心机制,重点阐述了Sensor数据如何通过采集陀螺仪、加速度计等硬件信息,结合设备指纹生成连续且符合物理规律的行为轨迹。详细剖析了数据从采集、加密校验到通过BMP风控三重验证(校验位、时间差、数据逻辑)的完整流程,并提供了从模拟优化到自建风控模型的实用应对思路。

quiet的专栏 285

Android多进程之Binder的意外死亡及权限校验

Android多进程之Binder的意外死亡及权限校验

idaretobe的专栏 1221

诊断CAPL自动化(3)——封装了接收诊断数据的通用CAPL脚本函数库

DiagGetRespPrimitiveSize (获取诊断响应的单个数据) diagGetPrimitiveData (获取诊断返回的所有数据) DiagGetRespParameter(数值类型) DiagGetRespParameter(字符串类型) DiagGetRespParameter(byte数组)

蚂蚁小兵 6219

android process died,binderDied() 过程分析

一. 概述理解Android进程启动之全过程介绍了进程是如何从AMS.startProcessLocked一步步创建的; 当进程不再需要时便会有杀进程的过程; 理解杀进程的实现原理介绍了Process.killProcess()如何一步步地将进程杀死.当系统内存不足时,会触发lmk杀进程; 以及系统本身通过AMS也会控制系统中各个状态的进程个数上限. 当进程真正的被杀死之后,通过binder死亡回...

weixin_42351520的博客 2728

第29章:PCL PrincipalCurvatures 曲率估计

PrincipalCurvatures(主曲率估计)是一种用于计算点云表面曲率的算法。曲率描述了曲面局部的弯曲程度,是表面几何特征的重要指标。在点云处理中,估计表面的曲率对于形状分析、物体识别、表面重建等任务非常重要。主曲率是曲面上某一点的最大和最小曲率方向。通过计算点云的主曲率,我们可以获得点云中每个点的局部形状特征。通常情况下,主曲率包括两个主要参数:最大主曲率(最大曲率方向上的曲率)和最小主曲率(最小曲率方向上的曲率)。优点缺点提供了对点云表面局部形状的深入分析。

yumeiguo的博客 213

【WorkBuddy专栏43】如何利用WorkBuddy开发一个PC网站(上)——环境选型、设计编码到部署上线

【WorkBuddy专栏43】如何利用WorkBuddy开发一个PC网站(上)——环境选型、设计编码到部署上线

AI人人懂 2252

Android Binder源码解析:BBinder服务端实体核心机制

BBinder是Android Binder IPC机制中服务端对象的底层抽象,本质是Binder驱动与用户态服务逻辑之间的标准化契约载体。其设计遵循接口隔离与生命周期自治原则,通过虚函数onTransact实现业务分发,依托RefBase弱/强引用计数保障跨进程对象安全,依赖IPCThreadState线程状态机完成事务调度。技术价值在于统一服务端接入规范、解耦业务与协议、支撑系统级服务(如AMS、SurfaceFlinger)稳定运行。典型应用场景包括HAL服务开发、SystemServer定制、Bin

weixin_34117211的博客 412

DDD系列 - 第6讲 仓库Repository - Mybatis篇

书接上回,之前通过一个关于拆解、微服务、面向对象的故事,向大家介绍了如何从微服务、面向对象一步步演进到DDD的,整个演进过程如下图:其中在领域层,我们定义了富血模型的领域模型,包括聚合、聚合根、实体、值对象等。聚合在代码层面中的表现形式即是一个包Package,起到了边界的作用,聚合内的对象间高内聚,而聚合间低耦合。聚合中放着实体、值对象、仓库等,实体相较于值对象的一个典型区别就是实体存在唯一标识,并且可通过该唯一标识查询到该实体并对其进行相关操作,值对象不存在唯一标识且通常作为实体。

罗小爬的技术宝书 1785

Android 之永乐大典

如下编译脚本逻辑,这里通过DISABLE_DEXPREORT_CHECK宏控来失能是否进行DEXPREOPT优化检测,如果为true则失能,默认需要进行优化检测,通过过滤所有PRODUCT_PACKAGES安装的应用,即先过滤ALL_DEFAULT_INSTALLED_MODULES宏控指定列表里面的应用,然后在过滤DEXPREOPT_SYSTEMSERVER_ARTIFACTS列表中指定的需要dexpreort优化的系统jar。Android DexOpt前世今生:参考。

qq_27672101的博客 1899

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Binder死亡通知机制之linkToDeath

死亡通知是为了让Bp端(客户端进程)进能知晓Bn端(服务端进程)的生死情况,当Bn端进程死亡后能通知到Bp端。 * 定义:继承IBinder::DeathRecipient类,主要需要实现其binderDied()来进行死亡通告。 * 注册:IBinder->linkToDeath(DeathRecipient recipient)是为了将死亡通知注册到Binder上。 源代码如下:

嘴巴吃糖了 3496

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

多进程之Binder的意外死亡及权限校验

首先要自定义一个权限而后在Service中的onBind方法中校验@Nullable@Override从上图中咱们能够看到,因为咱们的应用客户端没有声明服务端校验的权限,因此服务端校验不经过,咱们只须要在咱们的客户端添加相应的权限声明便可Binder的一个很好的应用就是推送消息和保活。好比咱们能够建立一个Service运行在一个独立的进程中,而后和咱们的应用进程中的一个Service绑定。

chuyouyinghe的专栏 515

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【JAVA】系统奔溃的解决

public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { ...

Extends的博客 552

android ipc通讯基础疑问点二

三。Binder基础点 1.AIDL文件并不是实现Binder的必需品。如果是我们手写的Binder,那么在服务端只需要创建一个BookManagerImpl的对象并在Service的onBind方法中返回即可。 2.Binder连接断裂(称之Binder死亡)。。Binder运行在服务端进程,如果服务端进程由于某种原因异常终止,就出现Bindr连接断裂,会导致我们的远程调用失败。 Binde

crystal2fiona 356

面试常客——————Binder学习笔记(一)

看了网站一些关于的Binder资源和书本,现在来做一个笔记。  对于Binder的介绍,笔者会分为两部分,第一部分为Binder的使用以及上层原理,第二部分将探讨部分Binder底层细节。 直观来说,Binder是Android中的一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux中没有; 从Android Frame

soso密斯密斯的博客 404

二.Binder原理分析

在android中我们所使用的Activity、Service等组件都需要和AMS(SystemServer进程)通信,这种跨进程的通信都是通过Binder完成.Binder驱动是在Zygote进程创建后创建的,每一个进程创建的同时都会创建Binder驱动,用于与别的进程实现跨进程通信.虚拟机分配给每个进程的资源是有限的,LMK(Low Memory Killer)优先回收系统资源占用多的进程.ServiceManager是一个Native层的进程,由init进程创建,早于zygote进程启动.

汤坤 631

Android面试:binder相关

写给 Android 应用工程师的 Binder 原理剖析 - 知乎

王温暖的博客 1741

【Android】Service几个重要的方法运行在哪个线程

一、前言 Service是Android中的四大组件之一,在开发中也是经常使用的。 Service的用法比较简单,这里不过多进行讨论。但是,我们用了这么久的Service,是否有想过以下问题: Service的几个生命周期方法是运行在哪个线程的?是主线程还是子线程? 当使用bindService后,ServiceConnection的回调方法onServiceConnected和onServiceDisconnected方法又是运行在哪个线程的?是主线程还是子线程? 针对上面的两个问题,本文从And

Jason_Lee155的博客 3964
上一篇: Android中内容观察者的使用---- ContentObserver类详解
下一篇: 毕业半年,点滴在心中
qinjuning
博客等级 码龄18年 5288粉丝 43原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值