最近我阅读了Android
源代码,发现在进行Binder
IPC调用时总会调用一对方法。我看了评论,但我不清楚根本原因。这对方法如下:
final long origId = Binder.clearCallingIdentity();
//other local method.
Binder.restoreCallingIdentity(origId);
有谁知道这对方法的功能是什么?这似乎与许可有关。
答案 0 :(得分:5)
我认为我不能比官方API中的描述更好地回答:http://developer.android.com/reference/android/os/Binder.html
public static final long clearCallingIdentity ()
重置当前线程上传入IPC的标识。如果在处理来电时,您将调用可能是您的进程本地的其他对象的接口,并且需要对进入它们的呼叫进行权限检查(这样他们将检查您自己的权限)本地流程,而不是最初叫你的流程。)
答案 1 :(得分:4)
虽然问题已经过时,但除了正式的方法说明之外,还值得提供更多细节。
除了(或同时)IPC之外,Binder
框架在Android
中的关键作用是安全性。
每个Binder
事务都在调用进程(调用者)的标识(PID和UID)下运行,以便被调用进程(被调用者)可以检查呼叫过程'权限并决定是否可以执行所请求的方法。
如果此类交易需要(临时)在被叫方身份下运行,则可以清除来电者一个,然后恢复分别拨打Binder.clearCallingIdentity()
和Binder.restoreCallingIdentity(long)
。在通话之间,将检查被叫方的权限。
作为示例考虑系统服务(AOSP位置:/frameworks/base/services/java/com/android/server
)。在system_server
进程UID=1000
中运行,服务可以暂时清除来电者的身份,以便通过权限检查。