Android Binder IPC addService:有没有办法再次删除服务?

Posted

技术标签:

【中文标题】Android Binder IPC addService:有没有办法再次删除服务?【英文标题】:Android Binder IPC addService: is there a way to remove service again? 【发布时间】:2014-09-11 07:45:20 【问题描述】:

我在代码中的某个地方,我只有非常有限的权限,但必须将数据发送到一个 android 应用程序之外。 (Android系统C代码) 显然我不能在那里启动一个活页夹服务,但我可以连接到一个已经在运行的服务。因此,我的实现每秒检查服务是否可用,如果可用,它会连接并开始发送数据。这很好用。

我的问题如下。如果我终止服务二进制/进程,客户端不知何故看不到该服务不再可用。有没有办法删除我使用addService(...) 添加的服务?客户做getService()

【问题讨论】:

【参考方案1】:

我可以通过定期在客户端再次执行 getService() 来解决问题。像这样,如果服务消失,他们不会立即看到它,但他们会在某个时候得到它。如果服务再次可用,他们可以像这样重新连接。

我没有找到任何可以“删除”该服务的内容。但这种解决方法效果很好。

【讨论】:

【参考方案2】:

没有删除服务句柄的 API,尽管当服务终止时,服务管理器将使用 svcinfo_death() 释放句柄。本机服务管理器中唯一有效的传入事务代码是SVC_MGR_GET_SERVICESVC_MGR_CHECK_SERVICESVC_MGR_ADD_SERVICESVC_MGR_LIST_SERVICES(请参阅service_manager.c)。

也就是说,您可能会发现将this solution 应用于您的问题可能更有效、更可靠地决定是否需要再次调用getService()

【讨论】:

我不能使用“这个解决方案”部分,因为两端都是C代码,我什至不在jni中。客户端是一些正在运行的没有权限的android系统代码,而服务器是一个用C编写并从命令行以su启动的小型可执行文件,由java调用。但你是对的,我应该每隔几秒看一下客户端内部的 check_service,这可能比 getservice 便宜。之前研究过service_manager(***.com/questions/22460097/…) 或者您知道如何将连续数据从非常未经授权的系统内部传递到普通的非 root java 应用程序吗?我无法以 root 身份启动它们。但我可以以 root 身份启动第三个进程,这是我目前的解决方案。一个人甚至没有访问文件系统的能力。因此,我什至不关心套接字。 我现在想使用 check_service,但我找不到实现示例或有关如何使用它的参考。 add_service() 和 getService() 正在工作,但是如何检查服务是否可用?我的代码类似于github.com/vecio/AndroidIPC。

以上是关于Android Binder IPC addService:有没有办法再次删除服务?的主要内容,如果未能解决你的问题,请参考以下文章

没有IPC的Android进程是不是默认有Binder线程池?

Android——IPC机制IPC概念以及Binder机制

Android(IPC)进程间通讯1:详解Binder由来?

IPC_Binder_java_2

Android IPC机制:浅谈Binder的使用

Android Binder设计与实现篇