我正在尝试做的事情:在设备上安装的两个应用程序之间实现轻量级、安全的 IPC 协议。客户端应用程序应该能够发送命令和查询以Service
在服务应用程序中运行,并接收返回的计算结果。
应用关系:两个应用的源代码都在我的控制之下,但应用会有不同的签名(不可协商)。
安全要求:服务应用应向单个客户端提供其服务。客户端的应用程序 ID(包名称)是已知的且不变的。
我尝试了什么:我尝试使用双向Messenger
通信方案实现 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;
}
}
});
这里的想法是,当客户端应用程序向 this 发送消息时Service
,它会将其本地“回调”Messenger
放入replyTo
sent 的成员中Message
。文件Messenger
说明:
注意:下面的实现只是用于执行通信的 Binder 的简单包装器。
所以我认为我可以以某种方式将返回的BinderMessenger#getBinder()
映射到 client's UID
,但我现在遇到了麻烦:
Messenger#getBinder()
返回无法转换为的IBinderBinder
- 即使我确实设法获得了对 client's 的引用
Binder
,该方法Binder#getCallingUid()
也是static
并且不接受参数......
因此,为了使这个特定的实现安全地工作,我需要找到一种方法来根据客户端创建UID
的内容Message
或特定的内容来获取调用者。由于Android的Messenger
安全架构是围绕.Binders
Binders
UIDs
额外问题:除了 AIDL,Android 上是否还有其他 IPC 技术可以满足上述要求?