我正在这博客上读到关于在安卓系统中使用Binder令牌的文章。我看到了与wakelocks相关的示例,其中令牌用于标识来自同一应用程序的后续请求。
我想问,为什么在Android系统中,调用应用程序的UID不足以跟踪来自应用程序的后续请求?在标识应用程序方面,是否需要Binder令牌满足UID无法满足的要求?
发布于 2015-10-22 23:02:01
绑定令牌不会以uid的方式标识应用程序。令牌是一种能力或票据,这意味着占有才是最重要的。换句话说,有了活页夹标记,你是谁或什么并不重要,而只是你是否拥有这个标记。最后一部分是关键:在Android中,有许多对象出于安全原因需要加以区分,但它们都有相同的uid (例如,system_server进程空间中的对象)和/或uid没有识别真正的主题(例如,在Binder的本地侧运行的代码)。
与uid相关的这种差异使得功能难以实现,甚至在uid中也是不可能实现的。在您引用的博客帖子中有一个很好的例子:
应用程序可以要求
InputMethodManager通过调用hideSoftInputFromWindow(IBinder windowToken, int flags)方法隐藏软键盘,但必须提供窗口令牌作为请求的一部分。如果令牌与当前接受输入的窗口所属的窗口令牌不匹配,InputMethodManager将拒绝该请求。这使得恶意应用程序无法强制关闭另一个应用程序打开的软键盘。
这里使用令牌的主要原因是,window对象不是有uid的东西。当然,这是某个有uid的进程的一部分,但是不管uid是什么,它不是应用程序的uid试图隐藏软键盘。因此,确保请求者拥有当前接受输入的窗口的唯一方法是强制应用程序提供第一次创建窗口时WindowManager给出的令牌。
https://stackoverflow.com/questions/32575552
复制相似问题