| |
|
开发:
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表信息 详细解读如下:
一般是通过设置节点
如果还需要更多信息,比如BINDER_DEBUG_OPEN_CLOSE的信息,那么就执行命令(这里的72=64+8,实际上就是对应的标识位置1即可):
总之,只需将各个开关的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的两个特性:异步调用和串行化处理。解读如下:
对于第二点,只有确切的回答了以下几个问题才算是真的理解。 假设server端进程A中有如下两个Binder服务A1和A2,这两个服务都有两个异步的接口AE1和AE2。如下所示:
B进程和C进程均为server进程A的客户端,问题如下:
请思索片刻后再答案哦~,答案在最下方。 。。。 。。。 。。。 1答案为:可以同时执行,2和3 答案均为:需要一个个排队执行。如果你会打错了,说明你需要回头看下代码认真分析了。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |