Android Binder 清除调用者身份

5

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

final long origId = Binder.clearCallingIdentity();

//other local method.

Binder.restoreCallingIdentity(origId);

有没有人知道那对方法的作用是什么?似乎与权限有关。

2个回答

7

虽然这个问题很老了,但除了官方方法描述之外,值得增加更多细节。


除了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的身份,以通过权限检查。


5

我认为官方API中的描述已经很好了:http://developer.android.com/reference/android/os/Binder.html

public static final long clearCallingIdentity ()

重置当前线程上传入IPC的身份标识。如果在处理传入调用时,您将调用其他对象的接口,这可能很有用,因为这些对象可能是本地进程,并需要对调用进行权限检查(因此它们将检查您自己的本地进程的权限,而不是最初调用您的任何进程的权限)。


如果AIDL调用和clearCallingIdentity()在不同的线程上,clearCallingIdentity()会如何表现? - Nightswatch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接