我正在阅读this博客文章中关于在Android系统中使用Binder令牌的内容。我看到了与唤醒锁相关的示例,其中令牌用于标识来自同一应用程序的后续请求。
我想问一下为什么在Android系统中调用应用程序的UID
不足以跟踪来自应用程序的后续请求?是否需要Binder令牌满足UID无法识别应用程序?
答案 0 :(得分:4)
Binder令牌不会以uid
的方式识别应用程序。令牌是一种能力或票证,这意味着拥有是重要的。换句话说,使用活页夹令牌, 或 最后一部分是关键:在Android框架中,出于安全原因需要区分许多对象,但它们都具有相同的uid
(例如,system_server
进程空间中的对象)和/或uid
没有识别真正的主题(例如,在Binder RPC本地端运行的代码)。
与uid
的这种差异使得功能无法轻松实现,甚至可能使用uid
。一个很好的例子是你引用的blog post:
应用程序可以要求
InputMethodManager
隐藏软键盘 致电hideSoftInputFromWindow(IBinder windowToken, int flags)
方法,但必须提供窗口令牌作为请求的一部分。如果 令牌与当前属于该窗口的窗口令牌不匹配 接受输入后,InputMethodManager
将拒绝该请求。这个 使恶意应用程序无法强制关闭软件 键盘由另一个应用程序打开。
这里使用令牌的主要原因是窗口对象不是具有uid
的东西。当然,它是某个具有uid
的某个进程的一部分,但无论uid
是什么,它都不是试图隐藏软键盘的应用程序的uid
。因此,唯一的方法是确保请求者拥有当前接受输入的窗口是强制应用程序在首次创建窗口时提供WindowManager
给出的令牌。