为aosp添加原生服务

Add native service to aosp

我正在尝试将用 C++ 编写的本机服务添加到 AOSP 构建中。
我做的第一件事是为 AOSP 构建创建本地服务和客户端。
这按预期工作。我可以在 adb shell 中启动服务并通过 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"))

returns 空指针。

我在 dmesg 中找不到任何提示。 所以我假设我仍然遗漏了 SElinux 的一些东西,但我不知道我遗漏了什么。
如果我用 setenforce 关闭 SELinux 并重新启动服务,那么它工作正常。
任何人都可以提示我缺少 SELinux 的内容,或者我可以在哪里获得有关哪个策略阻止了某些内容的更多信息?

您可以看到这样的拒绝:

  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、logcat,并且所有拒绝都将在 logcat 即使您将被允许执行所需的操作。这将留下 1.

中所需的 audit2allow 迭代

对于遇到此问题的任何人,请确保您的 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 属性之一附加到您的域 2typeattribute <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