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

张开发
2026/4/17 16:19:36 15 分钟阅读

分享文章

这个binder面试题你会吗?-学员作业
背景前些天有学员朋友刚好带回来了一道关于binder相关的面试。当时看着其实感觉也没啥问题并没啥难度所以在vip群里也有学员朋友积极的进行回答。面试题目如下:有如下一个业务调用场景app调用wms接口wms中处理又会调用到sf进程请问说出在wmssf中binder方法中getcalluid是谁这个callinguid又是在哪设置的?针对这个面试题大家可能都觉得不难很多同学都可以答对认为是system_server的uid。在但是也有同学提出做个实验发现就是uid为system_server但是pid实际上是0.所以针对这个getCallingPid到底是多少的问题反而成了最大的争议点。多个版本验证getCallingPid针对这个问题已经存在了各种争议马哥也针对这个问题在不同的版本进行了验证发现还确实是有差异的。准备环境aosp14aosp16这两个aosp的版本打印部分添加这里以前些天豆包手机截图接口为案例frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.javaOverridepublicvoidcaptureDisplay(intdisplayId,Nullable ScreenCapture.CaptureArgs captureArgs,ScreenCapture.ScreenCaptureListener listener){//打印callingpid和callinguidSlog.d(TAG,captureDisplay Binder.getCallingUid() pid Binder.getCallingPid());ScreenCapture.LayerCaptureArgs layerCaptureArgsgetCaptureArgs(displayId,captureArgs);ScreenCapture.captureLayers(layerCaptureArgs,listener);}在远端SurfaceFlinger中也进行打印frameworks/native/services/surfaceflinger/SurfaceFlinger.cppbinder::StatusSurfaceComposerAIDL::captureLayers(constLayerCaptureArgsargs,constspIScreenCaptureListenercaptureListener){IPCThreadState*ipcIPCThreadState::self();constintpidipc-getCallingPid();constintuidipc-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 pid515uid1000aosp16版本日志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驱动相关知识那么要解决上面这个疑问就必须学习如下这些前置知识mCallingPidmCallingUid是在哪里赋值的呢frameworks/native/libs/binder/IPCThreadState.cpp这里可以看出是在IPCThreadState::executeCommand方法中由内核进行返回的。所以这块要查到根本原因还是要去binder.c中进行进一步排查。drivers/android/binder.ctrd-sender_euidfrom_kuid(current_user_ns(),t-sender_euid);t_frombinder_get_txn_from(t);if(t_from){structtask_struct*sendert_from-proc-tsk;trd-sender_pidtask_tgid_nr_ns(sender,task_active_pid_ns(current));trace_android_vh_sync_txn_recvd(thread-task,t_from-task);}else{trd-sender_pid0;}这块代码确实看到有设置成0和正常pid的但是这块代码排查后两个1416版本都是一样的调用方式。那么到底差异在哪呢这部分就留给各位学员去探索一下按照我上面限定的方法。学员作业要求1、剖析出uid和pid是如何在kernel中被binder驱动进行设置的2、解释什么场景调用pid就会设置为03、解释清楚为啥同样的captureDisplay接口aosp14和aosp16会有差异。原文参考https://mp.weixin.qq.com/s/gT7AN6sp3A_bcXeM9Ut7yQ更多framework实战开发干货请关注下面“千里马学框架”

更多文章