当前位置: 首页 > news >正文

这个binder面试题你会吗?-学员作业

背景:

前些天有学员朋友刚好带回来了一道关于binder相关的面试。当时看着其实感觉也没啥问题,并没啥难度,所以在vip群里也有学员朋友积极的进行回答。

面试题目如下:
有如下一个业务调用场景:
app调用wms接口,wms中处理又会调用到sf进程,请问说出在wms,sf中binder方法中getcalluid是谁?这个callinguid又是在哪设置的?

针对这个面试题大家可能都觉得不难,很多同学都可以答对认为是system_server的uid。

在但是也有同学提出做个实验发现就是uid为system_server,但是pid实际上是0.

所以针对这个getCallingPid到底是多少的问题反而成了最大的争议点。

多个版本验证getCallingPid

针对这个问题已经存在了各种争议,马哥也针对这个问题在不同的版本进行了验证,发现还确实是有差异的。

准备环境:

aosp14,aosp16这两个aosp的版本

打印部分添加:
这里以前些天豆包手机截图接口为案例
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

@OverridepublicvoidcaptureDisplay(intdisplayId,@Nullable ScreenCapture.CaptureArgs captureArgs,ScreenCapture.ScreenCaptureListener listener){//打印callingpid和callinguidSlog.d(TAG,"captureDisplay "+Binder.getCallingUid()+" pid "+Binder.getCallingPid());ScreenCapture.LayerCaptureArgs layerCaptureArgs=getCaptureArgs(displayId,captureArgs);ScreenCapture.captureLayers(layerCaptureArgs,listener);}

在远端SurfaceFlinger中也进行打印
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

binder::StatusSurfaceComposerAIDL::captureLayers(constLayerCaptureArgs&args,constsp<IScreenCaptureListener>&captureListener){IPCThreadState*ipc=IPCThreadState::self();constintpid=ipc->getCallingPid();constintuid=ipc->getCallingUid();ALOGE("SurfaceComposerAIDL::captureLayers pid %d uid %d ",pid,uid);mFlinger->captureLayers(args,captureListener);returnbinderStatusFromStatusT(NO_ERROR);}

但是两个aosp版本确实得出不同的结果。
aosp14版本日志:

12-2411:32:38.648341606E SurfaceFlinger: SurfaceComposerAIDL::captureLayers pid515uid1000

aosp16版本日志:

12-2411:40:47.8935181285E SurfaceFlinger: SurfaceComposerAIDL::captureLayers pid0uid100012-2411:40:47.8935181285E SurfaceFlinger: validateScreenshotPermissions pid0uid1000

可以看出确实在aosp16版本显示pid是0,但是对应uid是1000也就是system_server

但是真的aosp16版本都是pid为0吗?明显也不是哈,具体也可以看下面截图:
可以看到其实也是有uid为1000但是pid不是0情况.

前置必学binder驱动相关知识:

那么要解决上面这个疑问就必须学习如下这些前置知识

mCallingPid,mCallingUid是在哪里赋值的呢?
frameworks/native/libs/binder/IPCThreadState.cpp
这里可以看出是在IPCThreadState::executeCommand方法中由内核进行返回的。
所以这块要查到根本原因还是要去binder.c中进行进一步排查。

drivers/android/binder.c

trd->sender_euid=from_kuid(current_user_ns(),t->sender_euid);t_from=binder_get_txn_from(t);if(t_from){structtask_struct*sender=t_from->proc->tsk;trd->sender_pid=task_tgid_nr_ns(sender,task_active_pid_ns(current));trace_android_vh_sync_txn_recvd(thread->task,t_from->task);}else{trd->sender_pid=0;}

这块代码确实看到有设置成0和正常pid的,但是这块代码排查后,两个14,16版本都是一样的调用方式。
那么到底差异在哪呢?这部分就留给各位学员去探索一下,按照我上面限定的方法。

学员作业要求:

1、剖析出uid和pid是如何在kernel中被binder驱动进行设置的

2、解释什么场景调用pid就会设置为0

3、解释清楚为啥同样的captureDisplay接口,aosp14和aosp16会有差异。

原文参考:
https://mp.weixin.qq.com/s/gT7AN6sp3A_bcXeM9Ut7yQ

更多framework实战开发干货,请关注下面“千里马学框架”

http://www.jsqmd.com/news/623681/

相关文章:

  • 从CTFHub一道题,聊聊MySQL中那些容易被忽略的‘非主流’函数:REPLACE、CHAR与注入新思路
  • 誉财 YC - 10+ 双头全自动烫标机:服装商标烫印的变革先锋
  • 聊聊惠州隐形车衣服务,哪个品牌好用且性价比高? - mypinpai
  • Apache Hop环境搭建实战:从零到一的下载、安装与配置指南
  • QTableWidget 表格组件漳
  • 别再硬抄清单了!手把手教你根据业务场景,为等保2.0三级系统定制专属安全套餐
  • Janus-Pro-7B数学模型求解助手:辅助Matlab与数学建模工作流
  • 【Matlab】MATLAB教程:butter函数IIR滤波器设计(巴特沃斯滤波器及信号滤波应用)
  • 图像质量评估指标对比:SNR、PSNR、MSE和SSIM到底该用哪个?
  • 如何快速搭建直播弹幕采集系统:15+平台支持的完整解决方案
  • 终极B站视频解析工具:5分钟快速上手完整指南
  • 网络安全视角下的Qwen3-ForcedAligner服务防护策略
  • 3步零代码方案:彻底掌控你的微信聊天记录数据主权
  • 云容笔谈·东方红颜影像生成系统:面试题之如何设计一个高可用的AI图像生成服务
  • CLS无证书签名方案在V2G网络中的实战应用:从电动汽车充电到隐私保护
  • 【限时解密】某千亿级AI平台未公开的A/B测试框架设计文档(含流量染色协议v2.1、模型效果归因算法伪代码、合规审计日志Schema)
  • 从收音机调台到手机滤波:串联谐振回路在真实电路里到底怎么用?一个实例讲清楚
  • 设计师的免费中文字体救星:思源宋体TTF的7重魔法
  • HY-Motion 1.0部署教程:在CSDN星图镜像上一键体验
  • Windows上直接安装APK的终极指南:告别Android模拟器的完整解决方案
  • 别再手动调参了!Livox Mid-360点云滤波实战:用PCL的SOR和半径滤波搞定动态障碍物去除
  • 小白也能懂!Qwen3-Reranker-0.6B快速部署与WebUI调用实战
  • 沃伦森携绝缘在线监测电力智能诊断及阻抗特性监控系统优化全栈方案,亮相流程工业分会
  • 3分钟解锁QQ音乐加密音频:qmcdump让你的音乐重获自由!
  • [Minecraft]Spigot服务器从零搭建到稳定运行:避坑指南与性能调优
  • Ollama 0.1.33高危漏洞复现:手把手教你搭建恶意注册表,验证CVE-2024-37032路径遍历风险
  • 如何轻松解除极域电子教室控制:3步实现学习自由的高效方法
  • 基于Multisim的四位密码锁电路设计与仿真优化(含完整项目资源)
  • 护网实战:Shiro反序列化漏洞的攻防全景解析
  • 终极指南:如何彻底卸载Windows 10中的OneDrive并释放宝贵系统空间 [特殊字符]