【问题标题】:Add native service to aosp将原生服务添加到 aosp
【发布时间】:2018-01-30 12:42:33
【问题描述】:

我正在尝试将用 C++ 编写的本机服务添加到 AOSP 构建中。
我做的第一件事是为 AOSP 构建创建本机服务和客户端。
这按预期工作。我可以在 adb shell 中启动服务并通过 adb shell 上的 binder 调用它。

当我想用 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 中缺少什么,或者我可以在哪里获得有关哪个策略阻止某些内容的更多信息?

【问题讨论】:

    标签: android android-source


    【解决方案1】:

    你可以看到这样的否认:

    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 迭代。

    【讨论】:

    • 成功了,它告诉我需要添加allow myp default_android_service:service_manager add。但不幸的是,domain.te 中的 neverallow 规则禁止这样做。我想我需要深入研究政策文件。
    • 哎呀,很遗憾听到这个消息,似乎确实需要更深入的挖掘。
    【解决方案2】:

    对于遇到此问题的任何人,请确保您的 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

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 1970-01-01
      • 2022-01-08
      • 2018-07-06
      • 2016-08-13
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      相关资源
      最近更新 更多