Android 进程间通讯Binder异常总结

Android 进阶——Framework核心 之Binder Java成员类详解(三) Framework核心 之Binder Java成员类详解 阅读详情

DeadObjectException:

Binder 为CS架构,我们无法确保Client端的生命周期,如被forcestop或被卸载等等。如果server端提供了接口回调的方式,一旦Client被停用,那么就会出现DeadObjectException的异常,原因是在Server进行Callback时,Client端已经死亡。

安卓本身提供了一些检测方法,拿com.android.server.location.RemoteListenerHelper来举例,

GpsStatus在注册时会通过LocationManager-->LocationManagerService-->.........-->最终会注册到com.android.server.location.RemoteListenerHelper

这是一个典型的跨进程服务,由LocationManager对外提供服务,

LocationManager.addGpsStatusListener();这个方法注册到了system_server内,进行卫星的状态变更等。

系统是这样进行处理的:

 public boolean addListener(@NonNull TListener listener) {
    ......
    ......
        LinkedListener deathListener = new LinkedListener(listener);
        synchronized (mListenerMap) {
            if (mListenerMap.containsKey(binder)) {
                // listener already added
                return true;
            }
            try {
                binder.linkToDeath(deathListener, 0 /* flags */);
            } catch (RemoteException e) {
                // if the remote process registering the listener is already death, just swallow the
                // exception and continue
                Log.e(mTag, "Remote listener already died.", e);
                return false;
            }


            mListenerMap.put(binder, deathListener);
            ......
            ......
        }
        return true;
    }

注意加粗部分,lintToDeath,注册了死亡通知,在Client binder死亡后会进行Callback,我们可以在Callback内进行逻辑处理,这里需要一个实现了IBinder.DeathRecipient接口的对象,方法如下:

   private class LinkedListener implements IBinder.DeathRecipient {
......
......
        @Override
        public void binderDied() {
            Log.d(mTag, "Remote Listener died: " + mListener);
            removeListener(mListener);
        }

    }

加粗部分,一旦被Client Binder死亡后 就会在这里进行Callback,我们可以在这里进行逻辑处理,如这里的逻辑是,如果Client Binder死亡,那么就反注册掉卫星的Callback。

这种是framework里比较常用的做法。


如果Callback 被Client主动清除,那么需要进行unlinkToDeath的操作,代码如下:

  public boolean removeListener(@NonNull TListener listener) {
        ......
        if (linkedListener != null) {
            binder.unlinkToDeath(linkedListener, 0 /* flags */);
        }
        return true;
    }

用户主动调用removeListener。


---------------------

通过判断binder是否存活等也是一种简易的解决方案:

如:

在需要进行Callback的地方,进行判断:

Binder.isBinderAlive,代码如下

            if (!jBinder.isBinderAlive()) {
                // The hosting process of the provider has died; we can't
                // use this one.
                Log.i(TAG, "Acquiring provider " + auth + " for user " + userId
                        + ": existing object's process dead");
                //Do some thing
                return null;
            }

如果binder已经死亡,do something you want


Android进程间通信之binder - 可能导致的异常 在平常程序运行过程中,可能碰到最多跟binder相关的异常是RemoteException,但本文只分析跟binder机制相关的异常,而RemoteException是server端逻辑导致的其它异常在client端的表现。 跟binder机制相关的异常有:android.app.RemoteServiceException: can't deliver broadcast,JavaBinder: !!! FAILED BINDER TRANSACTION !!!,TransactionTooLargeEx 阅读详情

相关推荐

【系统稳定性 - 调优】3.4 常见Binder相关异常调优总结

binder通信是Android特有的一种通信机制,常见binder相关的异常包括卡binder对端处理超时,binder本端处理超时(导致主线程block)以及binder耗尽三类问题。无论是应用,Framework,Hal中间件,还是BSP驱动,熟悉这三类binder相关case的调试和分析,能够帮助我们快速地找到和解决问题。

从0到1,突破自己 6829

Android无处不在的Binder

今天看到一篇文章被其变体吸引:《Android 11系统服务的添加(java 层)》,难道应用层可以这么玩了吗?看完发现原来是framework开发的文章。虽然没有接触过framework开发,但是整篇看完一点都不陌生,跟APP开发中的aidl开发流程基本相同,只是多了系统服务注册这一步。我们知道aidl也是基于Binder实现的,看来Binder实在太重要了,本篇总结一下Binder相关原理。 ...

csfchh的博客 2049

北京途游游戏后端开发面经

北京途游游戏后端开发面经 我面试岗位是基于Python的后端开发工程师,主要是搞游戏的服务器开发。面试一共分了两轮,之后说是看看其他的候选人再定,感觉凉凉~~ 由于受到此次新型冠状病毒疫情的影响,本次面试采用视频面试的方式,下面是面试的时候面试官提的问题,python的基础知识还是问的比较多的。  一面:(32分钟微信视频)  简单做下自我介绍,   1.说一下你开发过的项目,挑一个说下你都做了...

weixin_45603043的博客 2128

Android 进程间通信之使用Messenger

android进程间通信之Messenge,Messenger翻译为信使,顾名思义,就是传递消息。那么,我们今天讨论的是在进程之间传递消息。使用Messenger进行进程间通讯总体来说还是比较简单的,是一种轻量级的IPC方案,它的底层是实现了AIDL,在这里,我们只需要了解即可,不讨论AIDL。

Zhonghao_Zhao的博客 623

别再手动算K值了!ZEMAX中两种锥透镜建模方法详解(标准面 vs. 轴锥面)

本文详细解析了ZEMAX中锥透镜的两种建模方法:标准面与轴锥面。通过对比两者的精度、计算效率和适用场景,帮助工程师在激光整形、光束匀化等应用中做出最优选择,并提供了参数设置和异常排查的实用技巧。

weixin_42548874的博客 323

等保: Postgresql配置ssl链接

等保: postgresql配置ssl链接完整方案和避坑指南

weixin_43557605的博客 4383

Android 中级教程之------Android MediaPlayer播放mp3的实例!

大家好我们今天研究的是Android中很重要也最为复杂的媒体播放器---MediaPlayer. Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。 MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPl...

coolsooner 118

告别手动打点计时:用Lauterbach TRACE32的RunTime功能,5分钟搞定嵌入式代码段性能分析

本文深入解析了Lauterbach TRACE32的RunTime功能在嵌入式代码性能分析中的革命性应用。通过硬件级计时原理和非侵入式设计,该功能能快速精确测量代码执行时间,显著提升开发效率,特别适用于汽车电子和工业控制领域。文章还提供了从基础设置到高级分析的完整实战指南,帮助工程师轻松掌握这一强大工具。

weixin_30615767的博客 280

Android Framework——进程间通讯学习,从Binder使用看起_activitymanager binder transaction

先看谷歌官方开发者文档的介绍 我们可以利用AIDL定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。在安卓中,编写进程间通信的代码较为繁琐,Android 会使用AIDL 帮我们处理这类问题。我们先从一个典型的AIDL实例入手来探究。我们来定义一个 aidl 接口文件其中用到了User对象,所以上文还定义了该User.aidl,该对象实现Parcelable接口。我们找到。/***/可以看到生成了。

2401_84102892的博客 1186

第一章:基础知识 - 概念与基础,理解什么是功耗

电源管理与功耗调优:实战项目经验分享

坚韧与专注 885

MCAL知识点(十):ERU驱动配置详解

ERS:外部请求单元ETL:中断逻辑单元OGU:输出逻辑单元MCU里面配置要使用的功能和选择输入的管脚,注意上述模块关注点讲述的ERU必须和边沿检测模块相关联。

梦想技术家 1223

Android Framework——进程间通讯学习,从Binder使用看起

先看谷歌官方开发者文档的介绍 我们可以利用AIDL定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。在安卓中,编写进程间通信的代码较为繁琐,Android 会使用AIDL 帮我们处理这类问题。我们先从一个典型的AIDL实例入手来探究。我们来定义一个 aidl 接口文件其中用到了User对象,所以上文还定义了该User.aidl,该对象实现Parcelable接口。我们找到。/***//***//***//***//***/可以看到生成了。

maniuT的博客 882

微信小程序:errno: 600001, errMsg: “uploadFile:fail errcode:-101 cronet_error_code:-10001 error_msg:net::E

微信小程序报错uploadFile:fail errcode:-101 cronet_error_code:-10001 error_msg:net::ERR_CONNECTION_RESET, custum ip is invalid, didn't find user's ip,wx.uploadFile errno: 600001 errcode:-101 ?微信小程序wx.uploadFile错误,wx.uploadFile 在真机上报下面的错误,调试工具里没有问题,其它接口在真机/调试工具都正常,

✅ 精选推荐文章 4260

Android Binder进程间通讯原理分析

Android系统是基于Linux内核开发的。Linux开发提供了丰富的进程间通讯机制,例如管道、信号、消息队列、共享内存、插口(Socket)。而Binder是一套新的通讯工具。Binder通信采用了c/s架构,所以我们包含了 Client,Server,ServiceManager以及binder驱动,其中ServiceManager用于管理系统中的各种服务。注意:图片来源于网络从进程进度来看IPC机制, 每个Android的进程只能运行在质疑进程所拥有的虚拟地址空间。

积小步而至千里 468

NVIDIA Isaac GR00T N1 人形机器人强化学习入门教程(二)详细步骤

LeRobot 格式 1.1 加载数据集 要加载数据集,我们需要定义以下 3 项内容: 在数据中显示图像帧 我们还可以对 LeRobotSingleDataset 类中的数据进行一系列转换。下面展示了如何对数据进行转换。 现在看看应用转换后的数据有何不同。 例如,对状态和操作进行规范化和串联,对视频图像进行裁剪、调整大小和颜色抖动。 二、GR00T 推断 本教程介绍如何使用 GR00

2506_90492529的博客 3014

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android面试抱佛脚:进程间通讯学习,从Binder使用看起(1)

我们来定义一个 aidl 接口文件其中用到了User对象,所以上文还定义了该User.aidl,该对象实现Parcelable接口。我们找到。/***//***//***//***//***/可以看到生成了接口,实现IInterface。可以看到默认生成了三个该接口的实现类。DefaultStub和Stub.Proxy。Stub是一个Binder类,是一个实例是服务端对象。Stub.Proxy是Proxy。

2401_84104809的博客 757

Devexpress16.2.6破解工具

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

Android面试抱佛脚:进程间通讯学习,从Binder使用看起

前言 Binder 是安卓中非常重要的进程间通讯工具,通过Binder 安卓在ServiceManager中对外提供了一系列的服务。学习Binder,将很好地为我们学习framework开个好头。 Android 使用多进程 Android 开启进程方式很简单,在AndoridMenifest中给四大组件Activity、Service、Receiver、ContentProvider)指定 android:process 属性就可以了。 还有一种非常规的开启进程的方式,就是通过jni在native层fo

鸿蒙开发知识记录 654

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

利用Andriod死亡通知机制告诉service,client被kill了

Android提供了一种叫做死亡通知的机制,用于满足某些应用的特定需求:     某个process需要知道另外一个process是否存活;或者当某个进程被kill的时候,另外一个进程期望知道这件事情;    一般来讲是某个bound service关心其client是否被kill   可能有人会问,为什么service会关系client是否被kill呢 应用场景:  比

fred专栏 1万+

Android的binder机制理解

Binder是Android系统基于C/S架构的高效IPC机制。Binder驱动作为通信中枢,ServiceManager管理服务注册与查询,Server提供服务实现,Client发起请求。其核心机制包括:一次拷贝提升性能,UID/PID验证保障安全,线程池优化并发处理。AIDL作为开发接口,自动生成通信代码。实际应用中需注意数据大小限制,可通过死亡通知机制增强健壮性,使用oneway实现异步调用。Binder通过mmap等技术实现了高效安全的跨进程通信,是Android系统的基石之一。

weixin_41553587的博客 895

安卓进程间通信浅谈

共享内存是进程间通信的一种方式,通过映射一块公共内存到各自的进程空间来达到共享内存的目的。对于进程间需要传递大量数据的场景下,这种通信方式是十分高效的,但是共享内存并未提供同步机制,一个进程写共享内存时,并无自动机制可以阻止第二个进程开始对它进行读取,所以我们需要类似信号量机制来同步对共享内存的访问。Android中的匿名共享内存(Ashmem)是基于Linux共享内存的,借助Binder+文件描述符()实现了共享内存的传递。它可以让多个进程操作同一块内存区域,并且除了物理内存限制,没有其他大小限制。

许进进的博客 1752

android进程间通讯aidl新增接口的异常处理

一.引出问题 在系统定制过程中,我们常常使用aidl来提供接口给客户使用。 因为接口的sdk通常是通用的一份,并且sdk的aidl文件是最完整的(包含接口一到接口n),而各个机型不一定完全实现了所有接口,比如下图机型A服务端的aidl文件只包含部分接口(比如只有接口一到接口五)。如果在机型A上调用了接口六,此时我们应该能够抛出异常告知客户该接口未实现。 二.如何告知客户接口未实现 1.机型及时同步最新的aidl文件,服务端在未实现的接口处抛出异常,sdk里捕获异常。 这个方案首先排除,首先如果机型比较多

z9722的博客 1906
上一篇: 已解决错误: ‘android.content.res.Resources$Theme android.content.Context.getTheme()‘ on a null object re
下一篇: Android自带计时器类CountDownTimer
闲暇部落
博客等级 码龄12年 2777粉丝 215原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲暇部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值