最近我阅读了 Android
源代码,发现在进行一些 Binder
IPC 调用时,总是调用一对方法。我看了注释,但是不太清楚根本原因。这一对方法如下:
final long origId = Binder.clearCallingIdentity();
//other local method.
Binder.restoreCallingIdentity(origId);
有没有人知道那对方法的作用是什么?似乎与权限有关。
最近我阅读了 Android
源代码,发现在进行一些 Binder
IPC 调用时,总是调用一对方法。我看了注释,但是不太清楚根本原因。这一对方法如下:
final long origId = Binder.clearCallingIdentity();
//other local method.
Binder.restoreCallingIdentity(origId);
有没有人知道那对方法的作用是什么?似乎与权限有关。
虽然这个问题很老了,但除了官方方法描述之外,值得增加更多细节。
除了IPC之外(或与之同时),在Android
中,Binder
框架的关键作用是安全性。
每个Binder
事务都在调用进程(caller)的身份(PID和UID)下运行,以便被调用进程(callee)可以检查调用进程的权限并决定是否可以执行所请求的方法。
如果这样的事务需要在callee的身份下临时运行,则caller的身份可以被清除,并且通过调用Binder.clearCallingIdentity()
和Binder.restoreCallingIdentity(long)
进行恢复。在这些调用之间,将检查callee的权限。
以系统服务为例(AOSP位置:/frameworks/base/services/java/com/android/server
)。在system_server
进程中运行,UID=1000
,服务可以暂时清除caller的身份,以通过权限检查。
我认为官方API中的描述已经很好了:http://developer.android.com/reference/android/os/Binder.html
public static final long clearCallingIdentity ()
重置当前线程上传入IPC的身份标识。如果在处理传入调用时,您将调用其他对象的接口,这可能很有用,因为这些对象可能是本地进程,并需要对调用进行权限检查(因此它们将检查您自己的本地进程的权限,而不是最初调用您的任何进程的权限)。