binder堆栈信息分析

news2024/7/8 1:07:59

这里详细说明下binder的调用堆栈,方便下次更快的定位到具体的代码

一堆栈信息跟踪

得出下以下观点,就是一个普通的堆栈信息打印
见BinderProxy.java的set方法:
throw new AssertionError("Binder ProxyMap has too many entries:......

1 中间没有对端的堆栈信息输出
2 也不会有native的调用堆栈信息
3 此堆栈信息是服务端打印的

具体看下每行的注释吧

E AndroidRuntime: FATAL EXCEPTION: Binder:1080_2
E AndroidRuntime: Process: com.xxx.xxx, PID: 1080
E AndroidRuntime: java.lang.AssertionError: Binder ProxyMap has too many entries: 20691 (total), 20691 (uncleared), 20691 (uncleared after GC). BinderProxy leak?//binderProxy:说明是客户端发送过来的binder泄漏了
E AndroidRuntime:         at android.os.BinderProxy$ProxyMap.set(BinderProxy.java:230)//对BinderProxy对象的缓存进行检查,发现太多了,报错
E AndroidRuntime:         at android.os.BinderProxy.getInstance(BinderProxy.java:432)//根据传来的参数new一个BinderProxy来
E AndroidRuntime:         at android.os.Parcel.nativeReadStrongBinder(Native Method)//困惑,居然能打印一行native(难道是javaObjectForIBinder用了啥牛叉的机制)
E AndroidRuntime:         at android.os.Parcel.readStrongBinder(Parcel.java:2483)//读取parcel中关于客户端的binde参数
E AndroidRuntime:         at com.xxx.xxx.object$Stub.onTransact(Iobject.java:121)//服务端重写的onTransact接口
E AndroidRuntime:         at android.os.Binder.execTransactInternal(Binder.java:1154)//
E AndroidRuntime:         at android.os.Binder.execTransact(Binder.java:1123)//1:服务端唤醒后的执行接口

所以这里的binder对象太多了,也就是客户端的那个binder太多了,没有释放,一般情况下,这个binder都是ams或servicemanager传过来的,唯一的,怎么会
太多了呢,这个一般不会泄漏,往往泄漏的是匿名的binder,比如通过callback传输一个binder给服务端以达到监听服务端的目的的时候
这个时候如果没有对这个客户端binder进行死亡监听,服务端又强引用了这个binder,客户端不停的启动的话,那就会泄漏

这个堆栈信息可以结合抓hprof文件来进行内存泄漏分析,hprof分析问题会解决的更全面,防止其他binder泄漏没有达到这个阈值,但仍泄漏的情况。

二:提供一套简化版的客户端和服务端,可以清晰的看到调用流程,而不是通过aidl来生成

简化版服务端

public class IPCService extends Service {
  
    private MyBinder mBinder = new MyBinder();
  
    private class MyBinder extends Binder {
        @Override
        protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
            switch (code) {
            case 0x001: {
                data.enforceInterface(DESCRIPTOR);
                int num = data.readInt();
                reply.writeNoException();
                reply.writeString("");
                return true;
            }
            }
            return super.onTransact(code, data, reply, flags);
        }
    }
  
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
}

简化版客户端:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  
    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mIBinder = null;
        }
  
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mIBinder = service;
            
            
            android.os.Parcel _data = android.os.Parcel.obtain();
            android.os.Parcel _reply = android.os.Parcel.obtain();
            String _result = null;
            try {
                _data.writeInterfaceToken("IPCService");
                _data.writeInt(num);
                mIBinder.transact(0x01, _data, _reply, 0);
                _reply.readException();
                _result = _reply.readString();
            } catch (RemoteException e) {
                e.printStackTrace();
            } finally {
                _reply.recycle();
                _data.recycle();
            }
            
        }
    };
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        // 绑定远程Service
        Intent service = new Intent("xxx.xxx.ipcserver");
        bindService(service, mConnection, BIND_AUTO_CREATE);
        
    }
 
}

三 带有callback的简化版服务端代码

对于我们刚才的打印堆栈信息中的情况
是需要一个callback接口由客户端传输过来一个binder的情况。
,也贴一个对应的简化版的服务端代码

即客户端定义了一个binder接口  IMyBinder通过一个callback接口传入到服务端,这时候服务端是要实例化这个binder的

@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
    
    case TRANSACTION_callback:
    {
        data.enforceInterface(descriptor);
        xxx.xxx.IMyBinder _arg0;
        _arg0 = xxx.xxx.IMyBinder.Stub.asInterface(data.readStrongBinder());
        this.callback(_arg0);
        reply.writeNoException();
        return true;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1895479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

经典卷积神经网络 LeNet

一、实例图片 #我们传入的是28*28,所以加了padding net nn.Sequential(nn.Conv2d(1, 6, kernel_size5, padding2), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Conv2d(6, 16, kernel_size5), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Flat…

Android EditText的属性与用法

EditText 是编辑框控件,可以接收用户输入,并在程序中对用户输入进行处理。EditText在App里随处可见,在进行搜索、聊天、拨号等需要输入信息的场合,都可以使用 EditText。 图1 编辑框示意图 EditText 是TextView的子类&#xff0c…

吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.5-2.6

目录 第三门课 结构化机器学习项目(Structuring Machine Learning Projects)第二周:机器学习策略(2)(ML Strategy (2))2.5 数据分布不匹配时的偏差与方差的分析(Bias and Variance with mismatched data di…

下载安装MySQL

1.软件的下载 打开官网下载mysql-installer-community-8.0.37.0.msi 2.软件的安装 mysql下载完成后,找到下载文件,双击安装 3.配置环境变量 4.自带客户端登录与退出

CSS filter(滤镜)属性,并实现页面置灰效果

目录 一、filter(滤镜)属性 二、准备工作 三、常用的filter属性值 1、blur(px) 2、brightness(%) 3、contrast(%) 4、grayscale(%) 5、opacity(%) 6、saturate(%) 7、sepia(%) 8、invert(%) 9、hue-rotate(deg) 10、drop-shadow(h-shadow v…

前端JS 插件实现下载【js-tool-big-box,下载大文件(fetch请求 + 下载功能版)

上一节,我们添加了下载大文件的纯功能版,意思就是需要开发者,在自己项目里发送请求,请求成功后,获取文件流的blob数据,然后 js-tool-big-box 帮助下载。 但考虑到,有些项目,可能比较…

装饰模式解析:基本概念和实例教程

目录 装饰模式装饰模式结构装饰模式应用场景装饰模式优缺点练手题目题目描述输入描述输出描述题解 装饰模式 装饰模式,又称装饰者模式、装饰器模式,是一种结构型设计模式,允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行…

面试篇-Redis-1缓存三兄弟+数据一致性

文章目录 前言一、你们项目中使用Redis都做了什么:二、使用过程中遇到缓存穿透,缓存击穿,缓存雪崩你们如何处理:2.1 缓存穿透:2.1.1 通过缓存key值为null 进行处理:2.1.2 使用布隆过滤器:2.1.3 …

OpenCV基础(2)

目录 滤波处理 均值滤波 基本原理 函数用法 程序示例 高斯滤波 基本原理 函数用法 程序示例 中值滤波 基本原理 函数用法 程序示例 形态学 腐蚀 膨胀 通用形态学函数 前言:本部分是上一篇文章的延续,前面部分请查看:OpenCV…

深入理解如何撤销 Git 中不想提交的文件

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

图增强LLM + 可穿戴设备实时数据,生成个性化健康见解

图增强LLM 可穿戴设备实时数据,生成个性化健康见解 提出背景图增强LLM 子解法1(使用层次图模型) 子解法2(动态数据整合) 子解法3(LLM引导评估) 提出背景 论文:https://arxiv.or…

【js正则】去除文本中的a标签及其内容

场景&#xff1a;有时候服务端返回的文本中&#xff0c;包含a标签&#xff0c;前端不需要展示。 // 示例 const inputText 【提醒&#xff1a;XXXX】\nXXXXXX: 1\n\n<a href"https://export.shobserver.com/baijiahao/html/767805.html">详情</a>;JS正…

【营销策划模型大全】私域运营必备

营销策划模型大全&#xff1a;战略屋品牌屋、电商运营模型、营销战略、新媒体运营模型、品牌模型、私域运营模型…… 该文档是一份策划总监工作模型的汇总&#xff0c;包括战略屋/品牌屋模型、营销战略模型、品牌相关模型、电商运营模型、新媒体运营模型和私域运营模型等&…

JavaScript基础-函数(完整版)

文章目录 函数基本使用函数提升函数参数arguments对象&#xff08;了解&#xff09;剩余参数(重点)展开运算符(...) 逻辑中断函数参数-默认参数函数返回值-return作用域(scope)全局作用域局部作用域变量的访问原则垃圾回收机制闭包 匿名函数函数表达式立即执行函数 箭头函数箭头…

全自动内衣洗衣机什么牌子好?四大热门内衣洗衣机多角度测评

内衣洗衣机是近几年新兴的一种家用电器产品&#xff0c;正日益引起人们的重视。但是&#xff0c;面对市面上品牌繁多、款式繁多的内衣洗衣机&#xff0c;使得很多人都不知道该如何选择。身为一个数码家电博主&#xff0c;我知道这类产品在挑选方面有着比较深入的了解。为此&…

AIGC对设计师积极性的影响

随着科技的迅猛发展&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;工具正逐渐深入设计的每个角落&#xff0c;对设计师的工作方式和思维模式产生了深远的影响。AIGC不仅极大提升了设计师的工作效率&#xff0c;更激发了他们的创新思维&#xff0c;为设计行业带来了翻…

好文阅读-日志篇

https://mp.weixin.qq.com/s/jABbG4MKvEiWXwdYwUk8SA 这里直接看最佳实践。 Maven 依赖 <dependencyManagement><dependencies><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.36…

聊聊 CTO 和 技术总监的区别

前言 CTO&#xff08;Chief Technology Officer&#xff09;&#xff0c;是首席技术官的意思。 技术总监&#xff0c;顾名思义&#xff0c;就是负责指导和监督公司的技术团队&#xff0c;确保技术和产品的开发与创新顺利进行。 有的软件公司同时有 CTO 和技术总监&#xff0…

第二届计算机、视觉与智能技术国际会议(ICCVIT 2024)

随着科技的飞速发展&#xff0c;计算机、视觉与智能技术已成为推动现代社会进步的重要力量。为了汇聚全球顶尖专家学者&#xff0c;共同探讨这一领域的最新研究成果和前沿技术&#xff0c;第二届计算机、视觉与智能技术国际会议&#xff08;ICCVIT 2024&#xff09;将于2024年1…

JAVA高级进阶11多线程

第十一天、多线程 线程安全问题 线程安全问题 多线程给我们带来了很大性能上的提升,但是也可能引发线程安全问题 线程安全问题指的是当个多线程同时操作同一个共享资源的时候,可能会出现的操作结果不符预期问题 线程同步方案 认识线程同步 线程同步 线程同步就是让多个线…