我正在尝试向AOSP构建中添加用C++编写的本地服务。
我做的第一件事是创建一个本地服务和客户端到AOSP构建中。
这按预期工作。我可以在adb shell中启动服务,并通过binder在adb shell上调用它。
当我想要使用init启动我的服务时,问题就开始了。
我向我的构建中添加了一个.rc文件
service myp /system/bin/myp_service
class main
这个方法确实让init尝试启动了它,但是由于SELinux策略的原因启动失败了。
所以我在设备树中添加了一个file_contexts
并加入了以下内容:
/system/bin/myp_service u:object_r:myp_exec:s0
接下来,我添加了一个myp.te文件,并且添加了以下内容:
type myp, domain;
type myp_exec, exec_type, file_type;
type myp_service, service_manager_type;
init_daemon_domain(myp)
net_domain(myp)
binder_use(myp)
binder_service(myp)
add_service(myp, myp_service)
binder_call(myp, binderservicedomain)
binder_call(myp, appdomain)
allow myp myp_service:service_manager add;
最后,我添加了一个名为
service_contexts
的文件,其中包含如下内容:myp u:object_r:myp_service:s0
这让我的服务最终成功地在启动时运行。 不幸的是,我不能使用绑定器来连接此服务。当我尝试使用客户端连接该服务时,调用失败。
defaultServiceManager()->getService(String16("Demo"))
返回一个空指针。
我在 dmesg
中找不到任何线索。
因此,我认为我仍然缺少 SElinux 的某些内容,但我不知道缺少什么。
如果我使用 setenforce
关闭 SELinux 并重新启动服务,那么它就可以正常工作。
有人可以给我提示,我在哪里缺少 SELinux 或者我怎么可以获得更多信息来查看哪个策略阻止了某些东西吗?
allow myp default_android_service:service_manager add
。但不幸的是,这被domain.te
中的 neverallow 规则禁止。看来我需要深入挖掘策略文件。 - mkaes