AOSP系统服务JNI访问/sys/class/gpio/export权限被拒问题
问题分析与修复方案
核心原因
你的SELinux策略配置存在两个关键错误:
- 授权对象错误:你给
arkgpio_service(服务IPC对象的SELinux类型)添加了sysfs权限,但实际执行JNI代码的是system_server进程(SELinux类型为system_server),权限应该授权给这个进程类型。 - 节点类型匹配错误:/sys/class/gpio下的节点有专属SELinux类型,不是通用的
sysfs类型,比如/sys/class/gpio/export的类型是gpio_export,之前的规则无法匹配这些特定节点。
修复步骤
1. 修正权限授权对象与节点类型
打开以下两个目录下的system_server.te文件:
system/sepolicy/private/system_server.tesystem/sepolicy/prebuilts/api/31.0/private/system_server.te
删除之前添加的错误规则,替换为以下针对GPIO节点的精准授权:
# 允许操作gpio导出/取消导出节点 allow system_server gpio_export:file { write getattr }; # 允许设置GPIO方向 allow system_server gpio_direction:file { write getattr }; # 允许读写GPIO值 allow system_server gpio_value:file { read write getattr }; # 允许访问GPIO相关目录 allow system_server gpio_sysfs:dir { read search getattr };
2. 验证节点类型(可选)
如果不确定节点的SELinux类型,可在设备上执行命令查看:
ls -Z /sys/class/gpio/export ls -Z /sys/class/gpio/gpioXX/direction ls -Z /sys/class/gpio/gpioXX/value
输出结果中的u:object_r:XXX:s0里的XXX就是对应节点的SELinux类型,确保规则中的类型与实际一致。
3. 重新编译SELinux策略与系统镜像
执行以下命令重新编译:
make sepolicy -j12 make update-api -j12 # 重新编译完整镜像(根据你的编译流程调整) make -j12
4. 验证修复效果
刷入新镜像后,无需关闭SELinux,直接测试用户应用的GPIO操作,确认Permission denied错误消失。
内容的提问来源于stack exchange,提问作者Erkin E
相关产品推荐
相关产品推荐

