【问题标题】:How can my Android app communicate with a native daemon?我的 Android 应用程序如何与本机守护程序通信?
【发布时间】:2013-09-24 19:36:54
【问题描述】:

所以,我有一个作为系统运行的自定义 Android 应用程序(在我的 ROM 中构建为系统应用程序)。我编写了一个本地守护程序,它也可以正常工作并以 root 身份运行。但是,我想知道两者如何通信?我知道我可以让本机守护进程创建一个网络套接字并让应用程序连接到它,但是为 IPC 使用本地套接字似乎更好,但我正在努力寻找它的示例代码。

我想我可以像here 中描述的那样创建套接字,但我不知道如何在 Java 中与之通信。

任何帮助将不胜感激。

另外,一开始我写了一个native library,用JNI从Java中与之通信,但很快意识到它显然是在app的上下文中运行的,所以不能以root身份运行,这是我的一个要求,以及本机守护程序可以做得很好的事情。在这里使用套接字是最好的选择还是 Binder 也可以工作?

非常感谢!

【问题讨论】:

  • Binder 应该可以工作,因为这就是 SDK 应用程序与位置、传感器等核心操作系统服务通信的方式。话虽如此,我没有详细信息。
  • 谢谢!我很确定 Binder 可以工作,但不知道如何实现它。虽然服务器套接字看起来很简单,但我想寻求最优雅和正确的解决方案,所以任何带有示例代码的建议都将不胜感激。
  • App、JNI 和以“root”身份运行的守护进程的组合是关键。 JNI 代码只是胶水代码,它允许您访问 Java 下不可用的进程间通信功能。然后,此胶水代码可以使用套接字、共享内存与守护进程通信...

标签: java android linux sockets


【解决方案1】:

这里的解决方案是查看 AOSP 并查看 installd 如何与 Installer java 应用程序通信。在 init.rc 中,您可以看到命名的本地套接字是如何创建的,在 installd.c 中,您可以看到本机代码如何与套接字通信。在 Installer.java 中,您可以看到它是如何在 Java 领域完成的。

不要认为 Binder 是适合我的特定用例的正确方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多