8

在我的 Android-O 设备中,以下两个后台服务通过 AIDL 相互通信。

  1. 本机/c++ 安卓服务

    • 通过 init rc 启动
    • 使用系统 linux-user 运行
    • 部署在 /system 分区,eg, /system/bin/nat二进制。
  2. 来自 apk 的 Java 服务

    • 通过在 AndroidManifest 中注册的 bootcomplete 接收器启动。
    • 服务类也在 AndroidManifest 中指定,并且 export:enabled 已设置。
    • 运行系统系统 linux 用户,使用平台证书签名。
    • 部署在系统分区中。eg /system/app/jav/jav.apk

到目前为止没有任何问题。上述两项服务均已注册ServiceManager。两个服务都可以通过 /dev/binder 互相调用,都从 Android 启动开始并无限期地继续运行。

高音在这里带来了麻烦:

根据 Treble 的要求,以上两者都应该移动到 /vendor 分区,并使用适当的 SEPolicies。这样,java 和 c++ 服务都可以通过/dev/vndbinder. 相互调用,即通过注册自己VendorServiceManager

参考文档,https: //source.android.com/devices/architecture/hidl/binder-ipc 我能够启动成功/vendor/bin/nat注册的本机 c++ 服务VenorServiceManager(/dev/vndbinder)

现在我可以通过调用aidl接口函数vndservice call com.yyy.zzz.Myservice 0 但是,无法启动部署为的JAVA供应商服务/vendor/app/jav/jav.apk.

看起来总是ServiceManager处理 AndroidManifest 中的所有“服务”条目,而不是VendorServiceManager/vendor 分区应用程序。我不能通过 AndroidManifest 向 VendorServiceManager 注册吗?如果是,是否有任何我可以参考的示例应用程序/代码?

此外,Android 会抛出错误,提示无法启动后台服务。有没有办法从 /vendor 分区应用程序获得后台 JAVA 服务,即使它是由系统 linux 用户启动并使用平台证书签名的?

我不希望有“作业调度程序”类型的延迟处理程序,因为通信和响应预计是实时的,并且服务预计将从启动时无限期运行。

请帮助您的建议。

4

0 回答 0