You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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规则被编译进系统

验证步骤

  1. 重新编译hello模块:
    m hello -j$(nproc)
    
  2. 刷入新系统镜像到模拟器
  3. 开机后查看日志确认服务运行:
    adb logcat | grep hello
    
    正常情况下会看到"Hello world - our team try"的输出,或init日志显示服务启动成功。

内容的提问来源于stack exchange,提问作者FotisK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:40:32