Android 13新增自定义服务Bean时SELinux权限问题求助
核心问题分析
从报错信息可见:
avc: denied { add } for pid=831 uid=1000 name=bean scontext=u:r:system_server:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=0
tcontext=u:object_r:default_android_service:s0说明系统未识别到bean服务对应的SELinux类型映射,自动 fallback 到默认类型,导致你定义的allow system_server bean_service:service_manager add;规则完全不生效。
第一步:修复service_contexts文件语法错误
你提供的service_contexts文件开头使用了中文冒号:
service_contexts: bean u:object_r:bean_service:s0
SELinux配置文件对语法要求严格,中文符号会直接导致文件解析失败,服务上下文映射无法加载。
将文件修正为(可直接移除多余的标题行):
bean u:object_r:bean_service:s0
第二步:修正sepolicy目录与.mk配置
保留你的目录结构,仅在
aosp/device/generic/car/emulator/aosp_car_emulator.mk中添加必要配置:BOARD_VENDOR_SEPOLICY_DIRS += vendor/jiangc/sepolicy无需添加
BOARD_PLAT_PUBLIC_SEPOLICY_DIR或BOARD_PLAT_PRIVATE_SEPOLICY_DIR——你的sepolicy属于vendor层级,不应混入平台级配置。验证编译合并结果
编译完成后,检查out/target/product/emulator_x86/vendor/etc/selinux/vendor_service_contexts,确认其中包含bean u:object_r:bean_service:s0条目。如果缺失,执行make clean && make sepolicy -j单独编译sepolicy模块,查看输出是否有路径错误或语法警告。
第三步:确认sepolicy规则有效性
service.te中的类型定义无问题:type bean_service, service_manager_type;service_manager_type是SELinux预定义属性,标记该类型为服务管理器可识别的服务类型。若编译时出现
neverallow规则冲突,说明vendor层级无法给system_server(平台域)添加权限,可将system_server.te中的规则移至平台级sepolicy的override目录(如device/generic/car/emulator/sepolicy/plat_override/system_server.te),再重新编译。
第四步:验证修复效果
- 重新编译系统并启动模拟器,执行
getenforce确认SELinux处于Enforcing模式。 - 执行
service list | grep bean确认服务已注册,同时查看logcat是否还有avc报错。 - 若仍有疑问,执行
sepolicy service_contexts | grep bean,确认系统已加载正确的上下文映射。
内容的提问来源于stack exchange,提问作者Chao Jiang

