我正在尝试做的事情:在设备上安装的两个应用程序之间实现轻量级、安全 IPC 协议(protocol)。客户端应用程序应该能够向在服务应用程序中运行的 Service
发送命令和查询,并接收返回的计算结果。
应用关系:两个应用的源代码都在我的控制之下,但应用会有不同的签名(不可协商)。
安全要求:服务应用程序应向单个客户端提供服务。客户端的应用程序 ID(程序包名称)是已知且不变的。
我的尝试:我尝试使用双向 Messenger
通信方案(类似于 this blog post)实现 IPC。这种方法工作正常,但我遇到了一个主要问题——我找不到一种方法来获取客户端的 UID
,因此我无法满足安全要求。
考虑在服务应用程序的 Service
中找到的这段代码:
// This messenger will be used by the clients of this service in order to send commands
private Messenger inboxMessenger = new Messenger(new Handler() {
@Override
public void handleMessage(Message msg)
// TODO: verify the identity of the client
switch (msg.what) {
case MSG_GET_DATA:
returnDataToClient(msg.replyTo);
break;
}
}
});
这里的想法是,当客户端应用程序向此 Service
发送消息时,它将其本地“回调”Messenger
放入 replyTo
已发送的 Message
的成员。 Messenger
的文档指出:
Note: the implementation underneath is just a simple wrapper around a Binder that is used to perform the communication.
所以我想我可以以某种方式映射 Binder由 Messenger#getBinder()
返回给客户端的 UID
,但我现在遇到了麻烦:
Messenger#getBinder()
返回 IBinder无法转换为Binder
- 即使我设法获得对客户端
Binder
的引用,Binder#getCallingUid()
方法也是static
并且不接受争论...
因此,为了使这个特定的实现安全地工作,我需要找到一种方法来根据 Message
的内容或基于特定的Messenger
由客户端创建。由于 Android 的安全架构是围绕 Binders
构建的,因此没有将 Binders
映射到 UID
(或包名称)的直接方法似乎很奇怪。 .. 那么,我该怎么做呢?
加分问题:除了 AIDL,Android 上还有其他 IPC 技术可以满足上述要求吗?
最佳答案
经过一些研究和实验后,我得出结论,在安全、签名保护的通信方面,Android 无法提供 AIDL 的替代方案。
好消息是 AIDL 并不难实现,关于这个特定主题的官方教程一点也不差。
关于Android:AIDL 的安全 IPC 替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34185108/