我正在尝试将用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缺少的东西,或者我可以获得更多关于哪些政策阻止某些内容的信息?
答案 0 :(得分:2)
你可以看到这样的拒绝:
adb logcat | grep "SELinux : avc" > /tmp/logs
adb pull sepolicy
。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 迭代失效。
答案 1 :(得分:0)
对于遇到此问题的任何人,请确保您的service_contexts
文件已与库存service_contexts
文件成功合并。如果您要为Android O或更高版本构建服务,请将该文件放在文件夹中,并通过BOARD_PLAT_PRIVATE_SEPOLICY_DIR
1在Makefile中进行引用。而且,如果构建系统选择了allow myp default_android_service:service_manager add
,则无需添加service_contexts
。
另外,关于domain.te
违规问题,您可能想将coredomain
或appdomain
属性之一附加到带有typeattribute <your_domain> <attribute>;
的域2上。
最后,请仔细检查以下构建文件,以确保在最终构建中不会遗漏任何Sepolicy配置: