Android Binder清除来电者身份

时间:2013-04-15 00:27:30

标签: android android-source android-binder

最近我阅读了Android源代码,发现在进行Binder IPC调用时总会调用一对方法。我看了评论,但我不清楚根本原因。这对方法如下:

final long origId = Binder.clearCallingIdentity();

//other local method.

Binder.restoreCallingIdentity(origId);

有谁知道这对方法的功能是什么?这似乎与许可有关。

2 个答案:

答案 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中运行,服务可以暂时清除来电者的身份,以便通过权限检查。