Android Binder 调用栈

Java Binder 调用栈

发起 binder 请求

  native: #00 pc 000000000006e1c4  /system/lib64/libc.so (__ioctl+4)native: #01 pc 00000000000290d0  /system/lib64/libc.so (ioctl+136)native: #02 pc 000000000005a5e4  /system/lib64/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+256)native: #03 pc 000000000005b48c  /system/lib64/libbinder.so (android::IPCThreadState::waitForResponse(android::Parcel*, int*)+340)native: #04 pc 000000000005b1c0  /system/lib64/libbinder.so (android::IPCThreadState::transact(int, unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+176)native: #05 pc 0000000000051318  /system/lib64/libbinder.so (android::BpBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+72)native: #06 pc 000000000012f970  /system/lib64/libandroid_runtime.so (android_os_BinderProxy_transact(_JNIEnv*, _jobject*, int, _jobject*, _jobject*, int)+152)at android.os.BinderProxy.transactNative(Native method)at android.os.BinderProxy.transact(Binder.java:1127)at android.os.ServiceManagerProxy.getService(ServiceManagerNative.java:125)at android.os.ServiceManager.rawGetService(ServiceManager.java:253)at android.os.ServiceManager.getService(ServiceManager.java:124)at android.telephony.SubscriptionManager.getDefaultDataSubscriptionId(SubscriptionManager.java:1381)

从 android.os.BinderProxy.transact 方法起手,到 android::IPCThreadState::waitForResponse,表示这是一个阻塞的 binder,再到 android::IPCThreadState::talkWithDriver,调用到 talkWithDriver 就说明正在和 binder 驱动交互了

接受 binder 请求

"Binder:1270_2" prio=5 tid=9 Blocked| group="main" sCount=1 dsCount=0 flags=1 obj=0x12c403c0 self=0x74cc13a000| sysTid=1301 nice=0 cgrp=default sched=0/0 handle=0x74aeac84f0| state=S schedstat=( 967786174 2041516626 7827 ) utm=54 stm=42 core=0 HZ=100| stack=0x74ae9cd000-0x74ae9cf000 stackSize=1009KB| held mutexes=at com.android.server.am.ActivityManagerService.isUserAMonkey(ActivityManagerService.java:14253)- waiting to lock <0x09e15d64> (a com.android.server.am.ActivityManagerService) held by thread 120at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:1200)at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3498)at android.os.Binder.execTransact(Binder.java:731)

从 android.os.Binder.execTransact 起手,到 AIDL 生成文件的 onTransact 方法,再到 Stub 子类的 onTransact 方法,再到具体的 AIDL 实现

Native Binder 调用栈

发起 Binder 请求

  native: #00 pc 000000000006e1c4  /system/lib64/libc.so (__ioctl+4)native: #01 pc 00000000000290d0  /system/lib64/libc.so (ioctl+136)native: #02 pc 000000000005a5e4  /system/lib64/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+256)native: #03 pc 000000000005b374  /system/lib64/libbinder.so (android::IPCThreadState::waitForResponse(android::Parcel*, int*)+60)native: #04 pc 000000000005b1c0  /system/lib64/libbinder.so (android::IPCThreadState::transact(int, unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+176)native: #05 pc 0000000000051318  /system/lib64/libbinder.so (android::BpBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+72)native: #06 pc 0000000000074324  /system/lib64/libgui.so (android::BpGraphicBufferProducer::dequeueBuffer(int*, android::sp<android::Fence>*, unsigned int, unsigned int, int, unsigned long, unsigned long*, android::FrameEventHistoryDelta*)+208)native: #07 pc 000000000008492c  /system/lib64/libgui.so (android::Surface::dequeueBuffer(ANativeWindowBuffer**, int*)+388)

与 java 层大体类似,只是不需要 JNI 到 android::BpBinder::transact 了,Native 层可直接调用到 android::BpBinder::transact 然后调用 waitForResponse 阻塞线程

等待 Binder 请求

"Binder:4348_1" prio=5 tid=4 Native| group="main" sCount=1 dsCount=0 flags=1 obj=0x13b002a8 self=0x74c5015800| sysTid=4363 nice=0 cgrp=default sched=0/0 handle=0x74b1a3c4f0| state=S schedstat=( 20542242 92802343 324 ) utm=0 stm=2 core=2 HZ=100| stack=0x74b1941000-0x74b1943000 stackSize=1009KB| held mutexes=kernel: (couldn't read /proc/self/task/4363/stack)native: #00 pc 000000000006e1c4  /system/lib64/libc.so (__ioctl+4)native: #01 pc 00000000000290d0  /system/lib64/libc.so (ioctl+136)native: #02 pc 000000000005a5e4  /system/lib64/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+256)native: #03 pc 000000000005a7b8  /system/lib64/libbinder.so (android::IPCThreadState::getAndExecuteCommand()+24)native: #04 pc 000000000005af04  /system/lib64/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+60)native: #05 pc 000000000007b56c  /system/lib64/libbinder.so (android::PoolThread::threadLoop()+24)native: #06 pc 000000000000f9d8  /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+280)native: #07 pc 00000000000b50e0  /system/lib64/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+140)native: #08 pc 00000000000819b4  /system/lib64/libc.so (__pthread_start(void*)+36)native: #09 pc 0000000000023478  /system/lib64/libc.so (__start_thread+68)(no managed stack frames)

在等待 Binder 请求的标记是调用栈停在 getAndExecuteCommand,但没调用 executeCommand 方法

接收 Binder 请求

"Binder:784_5" sysTid=1251#00 pc 000000000001f02c  /system/lib64/libc.so (syscall+28)#01 pc 000000000002217c  /system/lib64/libc.so (__futex_wait_ex(void volatile*, bool, int, bool, timespec const*)+140)#02 pc 0000000000080ef8  /system/lib64/libc.so (pthread_cond_wait+60)#03 pc 000000000005dde8  /system/lib64/libgui.so (android::BufferQueueProducer::waitForFreeSlotThenRelock(android::BufferQueueProducer::FreeSlotCaller, int*) const+808)#04 pc 000000000005dfc8  /system/lib64/libgui.so (android::BufferQueueProducer::dequeueBuffer(int*, android::sp<android::Fence>*, unsigned int, unsigned int, int, unsigned long, unsigned long*, android::FrameEventHistoryDelta*)+380)#05 pc 0000000000072f08  /system/lib64/libgui.so (android::BnGraphicBufferProducer::onTransact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+1208)#06 pc 000000000004fa60  /system/lib64/libbinder.so (android::BBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+136)#07 pc 000000000005ab00  /system/lib64/libbinder.so (android::IPCThreadState::executeCommand(int)+520)#08 pc 000000000005a83c  /system/lib64/libbinder.so (android::IPCThreadState::getAndExecuteCommand()+156)#09 pc 000000000005af04  /system/lib64/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+60)#10 pc 000000000007b56c  /system/lib64/libbinder.so (android::PoolThread::threadLoop()+24)#11 pc 000000000000f9d8  /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+280)#12 pc 00000000000819b4  /system/lib64/libc.so (__pthread_start(void*)+36)#13 pc 0000000000023478  /system/lib64/libc.so (__start_thread+68)

Native层接受到 Binder 请求后会通过 getAndExecuteCommand 方法获取并解析数据,然后调用 executeCommand 方法根据其方法序号给 android::BBinder::transact 方法分配给对应的实现方法

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

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

相关文章

Go——协程

协程 协程是Go语言最大的特色之一。 1、协程的概念 协程并不是Go发明的概念&#xff0c;支持协程的变成语言有很多。Go在语言层面直接提供对协程的支持称为goroutine。 1.1 基本概念 进程 进程是应用程序启动的实例&#xff0c;每个进程都有独立的内存空间&#xff0c;不同…

枚举+链对缓存实现以读取为主的请求接口

一、需求背景 需要给一份问卷进行授权&#xff0c;授权的角色固定为4类&#xff0c;分别是&#xff1a; 农户、企业、金融机构、政府用户&#xff0c;这4类角色定义在字典里面&#xff0c;并且很少改动。这4类角色下面&#xff0c;可能有多个角色&#xff0c;这些角色通过字典的…

记录 | vscode禁止插件自动更新的方法

shift command p 打开然后输入 > setting.json&#xff0c;选择用户设置 在 settings.json 配置文件中增加一项&#xff1a; "extensions.autoUpdate": false,

ohpm : 无法将“ohpm”项识别为 cmdlet、函数...

这是因为没有在环境变量里配置 Ohpm. 左上角File->Settings,找到Ohpm放的路径 bin目录下&#xff0c;然后复制 此电脑->右键属性->高级系统设置->环境变量->系统变量找到Path,添加刚才复制的那一行 重启 DevEco ,在Terminal输入 ohpm -v ,出现版本号就欧了 如果…

Python中容易被忽视的核心功能

Python是一门富有魅力的编程语言&#xff0c;拥有丰富的功能和库&#xff0c;以及强大的社区支持。然而&#xff0c;有一些核心功能经常被忽视&#xff0c;而它们实际上可以极大地提高代码的质量、可读性和性能。 1. 解析命令行参数的argparse库 很多Python开发者在编写命令行…

开关电源测试之电源漏电流测试方法分享

一、外观检测 检查开关电源外观是否完好&#xff0c;是否有破损、变形、漏油等情况。 二、检测火线和零线的电流 实时测量火线和零线的电流&#xff0c;当两个电流值不相等且都不为零时断开零线&#xff0c;然后测火线的电流。当火线电流不为0时&#xff0c;判断电流为漏电流状…

C语言第四十七弹---猜凶手

使用C语言找到凶手 题目&#xff1a;日本某地发生了一件谋杀案&#xff0c;警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说&#xff1a;不是我。 B说&#xff1a;是C。 C说&#xff1a;是D。 D说&#xff1a;C在胡说 已知3个人说了真话&…

02.尚医通 Mybatis-Plus

1、前期准备 a. 创建数据库 CREATE TABLE USER (id BIGINT(20)NOT NULL COMMENT 主键ID,NAME VARCHAR(30)NULL DEFAULT NULL COMMENT 姓名,age INT(11)NULL DEFAULT NULL COMMENT 年龄,email VARCHAR(50)NULL DEFAULT NULL COMMENT 邮箱,PRIMARY KEY (id) );INSERT INTO user…

振弦采集仪:工程安全监测的“智能助手”

振弦采集仪&#xff1a;工程安全监测的“智能助手” 振弦采集仪是一种用于工程安全监测的设备&#xff0c;它可以被视为工程安全监测的“智能助手”。振弦采集仪通过测量结构物振动的频率和振幅来判断结构物的安全性&#xff0c;并实时监测结构物的变化。 振弦采集仪可以广泛…

番茄病虫害检测系统:融合感受野注意力卷积(RFAConv)改进YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 番茄是全球重要的蔬菜作物之一&#xff0c;具有广泛的经济和营养价值。然而&#xff0c;番茄病虫害的严重威胁导致了产量和质量的损失。因此&#xff0c;开发一种…

@RequestParam的使用

RequestParam使用 &#xff08;1&#xff09;不加RequestParam前端的参数名需要和后端控制器的变量名保持一致才能生效 &#xff08;2&#xff09;不加RequestParam参数为非必传&#xff0c;加RequestParam写法参数为必传。但RequestParam可以通过RequestParam(required fals…

Hadoop3.x完全分布式环境搭建Zookeeper和Hbase

集群规划 IP地址主机名集群身份192.168.138.100hadoop00主节点192.168.138.101hadoop01从节点192.168.138.102hadoop02从节点 Hadoop完全分布式环境搭建请移步传送门 先在主节点上进行安装和配置&#xff0c;随后分发到各个从节点上。 1. 安装zookeeper 1.1 解压zookeeper并…

spring 笔记三 Spring与Web环境集成

文章目录 Spring与Web环境集成ApplicationContext应用上下文获取方式导入Spring集成web的坐标置ContextLoaderListener监听器通过工具获得应用上下文对象SpringMVC概述SpringMVC快速入门 Spring与Web环境集成 ApplicationContext应用上下文获取方式 应用上下文对象是通过new …

Java-Ali图片上传实现

0.application.yml文件中编写配置 sky:alioss: endpoint: 地域节点(概览查看)access-key-id: 密钥账号access-key-secret: 密钥密码bucket-name: Bucket名称spring:servlet:multipart:max-request-size: 100MB # 最大请求文件大小,默认10MBmax-file-size: 10MB # 单个请求文件…

RFID射频识别技术在鞋业中的应用

RFID射频识别技术在鞋业中的应用 在鞋业制造、入库、出库、货物运输的时候都会遇到一个大问题&#xff0c;货物的管理和盘点&#xff0c;传统的人工盘点不但费时费力&#xff0c;还会有人为统计出错的情况出现。十分不方便货物的管理&#xff0c;对货物的出入库和运输造成不少…

2021-2023年历年地震数据,shp矢量数据,含时间、位置、类型、震级等信息

基本信息. 数据名称: 历年地震数据 数据格式: Shp 数据时间: 2021-2023年 数据几何类型: 点 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1dzlx地震类型2zj震级3zysd震源深度&#xff08;米&#xff09;…

MidJourney笔记(7)-Seeds

我相信很多人在使用MidJourney的时候,都会遇到一个问题,就是如何保持生成图像的一致性,或者相对一致性,差异性不是很大。此时,我们就需要引入一个seed值,类似给这个提示词生成的图片做一个id标识。 那这个seed值怎么使用? 其实,在我们每次生成的图片,都有有一个seed值…

2006年全国水土流失防治区数据,shp/excel格式,多字段,包含防治区名称、类型、编码、二级编码等

基本信息. 数据名称: 全国水土流失防治区数据 数据格式: Shp、Excel 数据时间: 2006年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1city_dm城市代码2city城市名称3mc防治区名称4bhlx…

Linux系统中部署minio服务、开启反向代理、二级域名SSL加固

链接: B站1小时-配置指导视频: 一、创建minio 文件目录(/project/minio) 二、下载Minio wget https://dl.min.io/server/minio/release/linux-amd64/minio 三、在minio目录中-创建日志文件 四、对minio(可以理解为windows系统中的.exe可执行文件) 进行授权 chmod 777 min…

保姆级 Keras 实现 YOLO v3 三

保姆级 Keras 实现 YOLO v3 三 一. 分配 anchor box二. 正负样本匹配规则三. 为每一个 anchor box 打标签3.1 anchor box 长什么样?3.2 每一个 anchor box 标签需要填充的信息有哪些?3.3 ( Δ x , Δ y , Δ w , Δ h ) (\Delta x, \Delta y, \Delta w, \Delta h) (Δx,Δy,…