Android模拟器开机自动执行C++ Hello World模块的实现问题
解决Android模拟器开机自动执行Hello World服务的SEPolicy问题
问题根源
你遇到的两个错误均由SELinux配置不当导致:
- 第一个错误是二进制文件的SELinux标签未正确生效,且缺少init到服务域的转换规则
- 第二个错误是手动指定
seclabel但未配置域与可执行文件的关联规则,还注释了关键的域转换宏
正确配置步骤
1. 修复hello.te(SEPolicy规则)
恢复注释掉的init_daemon_domain宏,该宏会自动配置init启动服务时的域转换规则,同时补充vendor目录文件的类型属性:
# hello service type hello, domain; type hello_exec, exec_type, file_type, vendor_file_type; init_daemon_domain(hello) # 不需要set_prop则可删除此行 # set_prop(hello, vendor_blabla_unconfig_prop)
说明:添加
vendor_file_type是因为二进制放在/vendor目录下,需匹配vendor域的文件类型属性;init_daemon_domain宏会自动添加domain_auto_trans(init, hello_exec, hello)规则,让init启动hello时自动切换到hello域。
2. 修正file_contexts(文件标签映射)
移除错误添加的seclabel,恢复标准标签格式:
/vendor/bin/hello u:object_r:hello_exec:s0
说明:此配置用于告诉SELinux,
/vendor/bin/hello文件的标签为hello_exec,确保init启动它时能匹配到对应的域转换规则。
3. 修正hello.rc(Init服务配置)
删除手动指定的seclabel,让SELinux自动处理域转换,用户组可保留root(或根据需求使用合法非root用户,需确保用户存在且SEPolicy允许):
service hello /vendor/bin/hello class main user root group root oneshot
说明:手动指定
seclabel会绕过SELinux自动域转换逻辑,而你之前的配置中hello域未与hello_exec关联,因此触发"invalid argument"错误。
4. 确认编译打包配置
检查hello.mk和Android.bp:
Android.bp中vendor: true配置正确,对应二进制存放路径hello.mk中BOARD_SEPOLICY_DIRS需指向你的sepolicy目录,确保SEPolicy规则被编译进系统
验证步骤
- 重新编译hello模块:
m hello -j$(nproc) - 刷入新系统镜像到模拟器
- 开机后查看日志确认服务运行:
正常情况下会看到"Hello world - our team try"的输出,或init日志显示服务启动成功。adb logcat | grep hello
内容的提问来源于stack exchange,提问作者FotisK
相关产品推荐
相关产品推荐

