IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android 系统核心机制binder(14)binder调试总结 -> 正文阅读

[移动开发]android 系统核心机制binder(14)binder调试总结

该系列文章总纲链接:专题分纲目录 android 系统核心机制 binder


1binder调试基础解读

1.1?binder的设备节点简单解读

binder调试相关的设备节点再目录/sys/kernel/debug/binder目录下,节点内容如下所示:

?这里可以看到binder下所有通信进程信息,打开后cat 其中一个,内容如下所示:

这里包含了该进程中binder相关内容,比如:Binder线程池(thread)、实体对象(binder_node)、引用对象(binder_ref)、内核缓冲区(buffer)等信息。

1.2 binder 调试日志开关解读

binder driver存在16类调试log开关,debug_mask表信息 详细解读如下:

debug_maskmask值解释
BINDER_DEBUG_USER_ERROR1用户使用错误
BINDER_DEBUG_FAILED_TRANSACTION2transaction失败?
BINDER_DEBUG_DEAD_TRANSACTION4transaction死亡
BINDER_DEBUG_OPEN_CLOSE8open/close/mmap
BINDER_DEBUG_DEAD_BINDER16binder/node死亡
BINDER_DEBUG_DEATH_NOTIFICATION32binder死亡通知
BINDER_DEBUG_READ_WRITE64read/write
BINDER_DEBUG_USER_REFS128binder引用计数?
BINDER_DEBUG_THREADS256binder_thread信息
BINDER_DEBUG_TRANSACTION512transaction信息
BINDER_DEBUG_TRANSACTION_COMPLETE1024transaction完成
BINDER_DEBUG_FREE_BUFFER2048可用buffer
BINDER_DEBUG_INTERNAL_REFS4096binder内部引用计数?
BINDER_DEBUG_BUFFER_ALLOC8192同步内存分配信息
BINDER_DEBUG_PRIORITY_CAP16384调整binder线程的nice值
BINDER_DEBUG_BUFFER_ALLOC_ASYNC32768异步内存分配信息

一般是通过设置节点/sys/module/binder/parameters/debug_mask内的值来动态控制选择开启上表中的debug log,比如要看binder的read/write信息,则直接执行命令:

echo 64?> /sys/module/binder/parameters/debug_mask

如果还需要更多信息,比如BINDER_DEBUG_OPEN_CLOSE的信息,那么就执行命令(这里的72=64+8,实际上就是对应的标识位置1即可)

echo 72?> /sys/module/binder/parameters/debug_mask

总之,只需将各个开关的mask值相加(对应标识位置1)写入debug_mask即可。

2 问题总结

说明:binder如果通信出现问题,那么多半是app或者自定义service写的有问题造成的(比如自己写的 或者 ODM/OEM厂商的增值服务。。。),因此binder很多时候主要是用于辅助分析和定位这些后添加内容导致的问题。

2.1?binder内存泄漏问题总结

binder内存泄漏(也称作binder leak),比如在binder通信中如果传输中使用的parcel没有有效释放(release),会造成buffer空间越来越少,积累到一定程度就会出现binder传输的消息在另外一端无法接收。正常使用IPCThread的API操作binder会自动往driver发送FREE_BUFFER的指令做释放操作,除非是单独对binder做了ioctl相关操作。那么如何确认是该问题呢?

使用cat命令查看transaction下的内容,如下所示:

这里一行buffer代表有一个binder通信在占用buffer的空间。如果该proc进程下的buffer的行数持续增长不减,基本上你就能判断是binder内存泄漏的问题了,接下来就定位到目标进程了,再接下来就要针对对应的进程进行详细分析了。

2.2?binder线程到达上限

如果app向service发起请求的频率过高,service端如果对所有的业务执行都加了锁的话,则会导致service端用于接收处理binder事件的线程全部卡住,当线程池(default 16个线程)耗尽之后,就无法再处理请求。如果这个时候app的主线程如果再调用该serivce提供的方法,就很容易出现ANR的问题。那么如何确认是该问题呢?

使用cat命令查看transaction下的内容,如下所示:

如果线程池耗尽则在transactions文件日志中 会连续显示16句。为解决这种线程池耗尽的问题,应对的方案是 从app端去限制请求频率,不要频繁的请求server。

2.3 oneway相关问题

有的自定义service端的方法 存在 间歇性的卡顿,但一般情况下并不会阻塞,但是在压力测试中有一定几率出现阻塞情况,关键是一旦出现阻塞就很容易导致部分关键功能整体失效。这时在编写aidl时需要添加oneway方法,使得即便发生了错误产生阻塞也不至于卡死。但这样做真的就可以了吗?这里不绕弯子了,事实上还需要调整APP请求server的频率,为什么呢?因为

这里详细解读下oneway的两个特性:异步调用和串行化处理。解读如下:

  1. 异步调用是指应用向 binder 驱动发送数据后不需要挂起线程等待 binder 驱动的回复,而是直接结束。像一些系统服务调用应用进程的时候就会使用 oneway,比如 AMS 调用应用进程启动 Activity,这样就算应用进程中做了耗时的任务,也不会阻塞系统服务的运行。
  2. 串行化处理是指对于一个服务端的 AIDL 接口而言,所有的 oneway 方法不会同时执行,binder 驱动会将他们串行化处理,排队一个一个调用。

对于第二点,只有确切的回答了以下几个问题才算是真的理解。

假设server端进程A中有如下两个Binder服务A1和A2,这两个服务都有两个异步的接口AE1和AE2。如下所示:

interface A1 {
? ? oneway void AE1();//异步执行2-3秒
? ? oneway void AE2();//同上
}
interface A2 {
? ? oneway void AE1();//同上
? ? oneway void AE2();//同上
}

B进程和C进程均为server进程A的客户端,问题如下:

  1. 如果进程B和进程C同一时刻分别调用A1.AE1()和A2.AE1(),请问进程A能否同时响应这两次Binder调用并执行?
  2. 如果进程B和进程C同一时刻分别调用A1.AE1()和A1.AE1(),请问进程A能否同时响应这两次Binder调用并执行?
  3. 如果进程B和进程C同一时刻分别调用A1.AE1()和A1.AE2(),请问进程A能否同时响应这两次Binder调用并执行?

请思索片刻后再答案哦~,答案在最下方。

。。。

。。。

。。。

1答案为:可以同时执行,2和3 答案均为:需要一个个排队执行。如果你会打错了,说明你需要回头看下代码认真分析了。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:08:36  更:2022-01-08 14:10:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:05:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码