Binder学习总结

基本数据结构:

// 用于描述内核缓冲区的结构体,Binder 通信的基本缓冲单元

struct binder_buffer *buffer;

#Binder导致crash#  kill crash原因分析-CSDN博客

#Binder风暴导致binder失败# 

E IPCThreadState: Process seems to be sending too many oneway calls.

E JavaBinder: !!! FAILED BINDER TRANSACTION !!!

(当前进程发送的oneway binder调用太多,binder线程快不够用了,紧接着马上要binder fail了) 源码如下:defaultServiceManager介绍-腾讯云开发者社区-腾讯云

关键字:JavaBinder

#binder线程数量判断#

“binder thread pool”搜索:

E IPCThreadState: binder thread pool (15 threads) starved for                 (appbinder线程被用光,

E IPCThreadState: binder thread pool (31 threads) starved for 108 ms    (SystemServer binder线程被用光,等待了108ms   "Waiting for thread to be free" 

统计Binder线程数量方法:

  1. adb shell debuggerd -b pid     //统计binder开头的
  2. trace:binder开头的线程数量(perfetto和simpleperf,profiler都可实现)

#binder 泄露#

LocalBinders

本地创建的bindercallback对象,传给Server对端回调我用的

表示我向外发了多少张名片

复现场景:新建callback(binder对象)给对端

Proxy Binders

本地持有Server的remote binder对象:向外发1次binder请求,新建1个Proxy Binders对象)表示我有多少人联系方式

  • Binder ProxyMap has too many entries: 25710 (total), 25709 (uncleared), 25677 (uncleared after GC). BinderProxy leak
  • Too many Binders sent to SYSTEM (Android能创建的Binder数量的最大值超过6000,非systemuid的binder调用会被kill掉,如果没等到binder调用返回,就不断发起新的binder调用就会抛出Proxy Binders异常
  • 对端向我注册的Callback太多,导致无法释放 RemoteCallbackList导致Death Recipients 暴涨如何找到哪个binder调用多?
  • 搜索“real execute” 查看是哪个进程在疯狂订阅capservice的binder调用
  • BinderProxy descriptor histogram (top 10)ActivityManager: Killing 4494:com.jidu.media.service/u0a35 (adj 100): Too many Binders sent to SYSTEM
    am_kill : [0,4494,com.jidu.media.service,100,Too many Binders sent to SYSTEM]Android能创建的Binder数量的最大值超过6000,非systemuid的binder调用会被kill掉
    Binder  : BinderProxy descriptor histogram (top 10):
    Binder  :  #1: android.app.IServiceConnection x3110
    Binder  :  #2: android.bluetooth.IBluetoothStateChangeCallback x2991
    Binder  :  #3: android.content.IIntentReceiver x234
    Binder  :  #4: android.content.IContentProvider x147
    Binder  :  #5: android.app.IApplicationThread x64
    Binder  :  #6:  x58
    Binder  :  #7: android.database.IContentObserver x42
    Binder  :  #8: android.os.IPullAtomCallback x31
    Binder  :  #9: android.view.IWindow x29
    Binder  :  #10: android.os.IMessenger x26
Death Recipients从dump meminfo结果发现Death Recipients对象超过1000个,从业务代码没有找到Death Recipients注册,从RemoteCallbackList源码发现默认注册了Death Recipients,原因是每次传过来1个aidlCallback都要new一个RemoteCallbackList来保存
### PerfettoBinder 阻塞问题的原因与解决 #### 原因分析 Binder 机制作为 Android 系统中重要的 IPC (进程间通信) 方式,在高负载情况下可能会遇到阻塞现象。当观察到 Perfetto 抓取的 trace 文件中有明显的 binder 调用延迟时,通常意味着存在以下几个潜在因素: 1. **跨进程调用频率过高**:频繁发起的 binder 请求可能导致接收方处理不过来而形成积压,进而造成发送端等待响应超时[^3]。 2. **目标服务过载**:如果被调用的服务本身处于繁忙状态(例如 SurfaceFlinger 正在执行复杂渲染操作),则可能无法及时回应来自其他组件的消息请求,从而引发 binder channel 的堵塞情况。 3. **内存不足触发 Low Memory Killer**:系统资源紧张特别是 RAM 不足的情况下,Android 可能会启动 lowmemorykiller 杀死一些后台进程释放空间;这种情形下即使不是直接杀死正在运行的应用程序也可能间接影响其依赖的服务稳定性,最终反映为 binder 连接异常或迟缓[^2]。 4. **同步锁争用**:某些场景下多个线程试图同时访问共享资源并持有互斥量,这会在一定程度上阻碍了正常的 binder 数据交换过程[^1]。 #### 解决方案建议 针对上述提到的各种可能性,可以采取以下措施尝试解决问题: - 使用 `systrace` 或者更先进的 `Perfetto` 工具捕获详细的系统行为日志,通过图形化界面直观了解各个阶段的时间消耗分布状况,定位具体的瓶颈所在位置[^4]。 - 对于由高频次 IPC 导致的问题,考虑优化应用程序逻辑减少不必要的远程方法调用次数,或者采用批量提交的方式降低单次交互成本。 - 如果是因为目标服务负载过大引起,则需评估该模块的工作模式看是否存在改进余地,比如调整优先级、增加并发能力或是重构算法提高效率等手段缓解压力。 - 当怀疑是由于低内存环境造成的干扰时,除了常规意义上的提升硬件规格外还可以从软件角度出发精细化管理对象生命周期避免浪费宝贵的存储单元,并定期清理不再使用的临时文件以维持良好的工作状态。 - 关注多线程编程实践中的竞态条件预防策略,确保临界区内的代码尽可能简洁高效,必要时引入读写分离机制平衡性能需求同数据一致性之间的关系。 ```bash # 使用 atrace 捕捉特定时间段内的 binder 活动信息 adb shell atrace -z binder | adb pull /dev/stdin ./binder_trace.txt ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值