外观
Binder.getCallingUid 和 clearCallingIdentity 应该怎么用?
标准回答
服务端应基于 Binder.getCallingUid 等真实调用身份校验权限和用户,不能只相信客户端传来的包名或 userId。权限检查通过后,若需要以系统服务自身身份执行内部操作,可以保存 clearCallingIdentity 返回的 token,并在 finally 中 restoreCallingIdentity。清除身份之前完成调用者检查,否则可能把无权限调用升级成系统身份。异步转到工作线程时,原始 Binder 调用上下文不会自然保留,我会显式保存需要的 UID 和用户信息。
延伸追问
getCallingUid 不能在任意后台线程里直接当作最初请求者身份;传入的包名也要与 UID 关系匹配。
内容来源
- Android Framework 知识手册 · 原条目
4-9