在我的 Android-O 设备中,以下两个后台服务通过 AIDL 相互通信。
本机/c++ 安卓服务
- 通过 init rc 启动
- 使用系统 linux-user 运行
- 部署在 /system 分区,
eg, /system/bin/nat
二进制。
来自 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 用户启动并使用平台证书签名的?
我不希望有“作业调度程序”类型的延迟处理程序,因为通信和响应预计是实时的,并且服务预计将从启动时无限期运行。
请帮助您的建议。