向AOSP添加本地服务

3

我正在尝试向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 或者我怎么可以获得更多信息来查看哪个策略阻止了某些东西吗?

2个回答

3
对于遇到这个问题的任何人,请确保您的service_contexts文件已经与默认的service_contexts文件成功合并。如果您正在构建适用于 Android O 或更高版本的服务,请将此文件放置在一个文件夹中,并通过BOARD_PLAT_PRIVATE_SEPOLICY_DIR1在Makefile中引用它。如果构建系统确实选择了您的service_contexts,则不需要添加allow myp default_android_service:service_manager add
另外,关于domain.te违规问题,您可能需要为您的域附加coredomainappdomain属性2,具体方法是使用typeattribute <your_domain> <attribute>;
最后,请仔细检查以下构建文件,以确保在最终构建中没有遗漏任何sepolicy配置:
  1. $(AOSP_ROOT)/out/target/product//obj/ETC/file_contexts.bin_intermediates/file_contexts.*
  2. $(AOSP_ROOT)/out/target/product/potter/obj/ETC/plat_service_contexts_intermediates/service_contexts.*
  3. $(AOSP_ROOT)/out/target/product/potter/obj/ETC/sepolicy_neverallows_intermediates/policy.conf

3
你可以这样看待拒绝访问:
  1. adb logcat | grep "SELinux : avc" > /tmp/logs
  2. 获取当前的 sepolicy 文件。(可以通过此方式从设备中获取:adb pull sepolicy)。
  3. 使用 audit2allow 工具(位于 AOSP 源代码中:external/selinux/prebuilts/bin/audit2allow 或 SDK 工具中)。执行以下命令:cat /tmp/logs | .external/selinux/prebuilts/bin/audit2allow -p sepolicy

audit2allow 工具将告诉您在提取logcat和当前的 sepolicy文件时缺少哪些权限,注意可能需要多次执行此操作,因为修复某些权限将显示需要下一个。

如果您使用的是 userdebug 构建,则可以使用 setenforce 0,记录日志,所有拒绝请求都将出现在日志中,即使您被允许执行所需的操作。这将减少对 audit2allow 迭代的要求。


2
这解决了问题,并告诉我需要添加 allow myp default_android_service:service_manager add。但不幸的是,这被 domain.te 中的 neverallow 规则禁止。看来我需要深入挖掘策略文件。 - mkaes
抱歉听到这个消息,看来需要更深入的挖掘。 - Olaia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接