【问题标题】:Android c++ service at boot time启动时的 Android c++ 服务
【发布时间】:2013-02-12 10:51:31
【问题描述】:

我需要在启动时在 android 中启动一个服务我不使用广播接收器,我用 C++ 编写了一个服务,因为我需要访问驱动程序 libusb 层来与我的外部设备通信,如果我启动该服务就可以正常工作手动,如果我想在启动时启动服务意味着我需要在 android 中编辑 inir.rc 文件,如果我这样做它也可以正常工作。但问题是我无法在所有设备中编辑 init.rc。我将我的服务放在 Sytem/bin 位置并按如下方式编辑 init.rc 文件

service sampleservice/system/bin/sampleservice
              oneshot
              disable

对于手动我从终端启动服务

#./system/bin/sampleservice

但我无法在每次系统重新启动时启动服务,但我确实有任何想法在启动时启动服务而无需编辑 init.rc

【问题讨论】:

    标签: android linux linux-kernel daemon linux-device-driver


    【解决方案1】:

    据我所知(NDK 参考,像 google-ndkandroid-developers 等 google 组),没有可靠的方法来启动原生程序二进制作为init.rc以外的服务。

    对于您的特定用例,您可以尝试此处描述的 USB SDK:http://developer.android.com/guide/topics/connectivity/usb/index.html。但是,如果这还不够,或者如果您想支持低于 10 的 OS API 级别,那么我相信没有简单的方法可以实现您想要的。

    如果您的服务不是关键(即系统不依赖它),我在这里和建议创建常规 Android 应用程序的组上看到了几个线程您将使用 ADT 创建。它将是最小的并且包含:

    当需要在非 root 设备上安装服务时,也建议使用此方法。但是,我从未尝试过。我知道这并不多,但我想分享我对这个主题的了解。

    【讨论】:

    • 感谢您的评论,还有一件事我可以从广播接收器启动本机服务吗?
    • 基本上 - 是的。您可以使用Runtime.exec() 并运行整个过程。 或者您可以在库中创建一个引导函数,这可能会启动一个单独的工作线程。然后您将创建一个 JNI 方法,该方法将调用本机引导函数并简单地从接收器调用 JNI 方法。
    • 我有一个疑问,我使用广播接收器启动我的服务,所以它在启动时启动但我无法访问我的外部设备,如果我在终端中启动我的服务,如 ./system/bin/myservice 它正在工作可能是因为权限问题?
    • 这可能是权限引起的...究竟是如何启动服务的?你到底在经历什么?你有什么例外吗?
    【解决方案2】:

    我猜你需要在启动服务之前确保 fs 已经启动......如果你可以从源代码编译,一个好主意是在 init 代码本身中启用 Info 日志。

    BR 分部

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      相关资源
      最近更新 更多