为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 的内容,或者我可以在哪里获得有关哪个策略阻止了某些内容的更多信息?
您可以看到这样的拒绝:
adb logcat | grep "SELinux : avc" > /tmp/logs
- 获取sepolicy 当前文件。 (可以通过这种方式从设备中获取
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 迭代
对于遇到此问题的任何人,请确保您的 service_contexts
文件已成功与股票 service_contexts
文件合并。如果您正在为 Android O 或更高版本构建服务,请将此文件放在一个文件夹中,并通过 BOARD_PLAT_PRIVATE_SEPOLICY_DIR
1 在您的 Makefile 中引用它。如果构建系统确实选择了您的 service_contexts
.
,则无需添加 allow myp default_android_service:service_manager add
此外,关于 domain.te
违规问题,您可能希望将 coredomain
或 appdomain
属性之一附加到您的域 2 和 typeattribute <your_domain> <attribute>;
.
最后,请仔细检查以下构建文件,确保您没有在最终构建中遗漏任何 sepolicy 配置:
- $(AOSP_ROOT)/out/target/product//obj/ETC/file_contexts.bin_intermediates/file_contexts.*
- $(AOSP_ROOT)/out/target/product/potter/obj/ETC/plat_service_contexts_intermediates/service_contexts.*
- $(AOSP_ROOT)/out/target/product/potter/obj/ETC/sepolicy_neverallows_intermediates/policy.conf
我正在尝试将用 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 的内容,或者我可以在哪里获得有关哪个策略阻止了某些内容的更多信息?
您可以看到这样的拒绝:
adb logcat | grep "SELinux : avc" > /tmp/logs
- 获取sepolicy 当前文件。 (可以通过这种方式从设备中获取
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.
对于遇到此问题的任何人,请确保您的 service_contexts
文件已成功与股票 service_contexts
文件合并。如果您正在为 Android O 或更高版本构建服务,请将此文件放在一个文件夹中,并通过 BOARD_PLAT_PRIVATE_SEPOLICY_DIR
1 在您的 Makefile 中引用它。如果构建系统确实选择了您的 service_contexts
.
allow myp default_android_service:service_manager add
此外,关于 domain.te
违规问题,您可能希望将 coredomain
或 appdomain
属性之一附加到您的域 2 和 typeattribute <your_domain> <attribute>;
.
最后,请仔细检查以下构建文件,确保您没有在最终构建中遗漏任何 sepolicy 配置:
- $(AOSP_ROOT)/out/target/product//obj/ETC/file_contexts.bin_intermediates/file_contexts.*
- $(AOSP_ROOT)/out/target/product/potter/obj/ETC/plat_service_contexts_intermediates/service_contexts.*
- $(AOSP_ROOT)/out/target/product/potter/obj/ETC/sepolicy_neverallows_intermediates/policy.conf