最近看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,Binder
框架的关键作用Android
是安全性。
每个事务都在调用进程( callerBinder
)的身份(PID 和 UID)下运行,以便被调用进程(callee)可以检查调用进程的权限并决定是否可以执行请求的方法。
如果这样的事务需要(临时)在被调用者的身份下运行,则可以清除调用者的事务Binder.clearCallingIdentity()
,然后Binder.restoreCallingIdentity(long)
分别调用 和 来恢复。在调用之间,将检查被调用者的权限。
以系统服务为例(AOSP 位置:/frameworks/base/services/java/com/android/server
)。在运行system_server
过程中,UID=1000
服务可以暂时清除调用者的身份,以通过权限检查。
我认为我不能比官方 API 中的描述更好地回答:http: //developer.android.com/reference/android/os/Binder.html
public static final long clearCallingIdentity ()
重置当前线程上传入 IPC 的标识。如果在处理传入呼叫时,您将调用可能是您的进程本地的其他对象的接口并且需要对传入它们的调用进行权限检查(因此它们将检查您自己的权限),这将很有用本地进程,而不是最初调用您的任何进程)。