关于从android服务中打开linux设备节点没有权限的问题(sepolicy/selinux)
tags: android linux driver
自己创建一个设备节点,/dev/xxx,然后想在android的内核某个位置去打开这个设备,结果碰到permition denied这个问题,开始以为是设备节点的读写权限,但是修改了读写权限后还是不行,最后发现还要设备android的sepolicy,这里简单记录一下过程。
1 修改文件权限
/out/target/product/xxxxxxx/root/ueventd.rc
该脚本在启动的时候自动运行,然后会设置对应文件的权限,例如:
# ueventd can only set permissions on device nodes and their associated
# sysfs attributes, not on arbitrary paths.
#
# format for /dev rules: devname mode uid gid
# format for /sys rules: nodename attr mode uid gid
# shortcut: "mtd@NN" expands to "/dev/mtd/mtdNN"
/dev/null 0666 root root
/dev/zero 0666 root root
/dev/full 0666 root root
/dev/ptmx 0666 root root
/dev/tty 0666 root root
/dev/random 0666 root root
/dev/urandom 0666 root root
2 修改sepolicy设置
这篇blog从中间“01设备节点(或bin文件);02file_contexts;03device.te;04进程文件添加权限;”这个地方看起就行了……也就是里面的四个步骤。
这里需要记录三点:
- 关于路径,在android7.x里面,sepolicy文件夹是在/system目录下
- 关于如何获取服务的线程id,可以在该服务中用
getpid()
函数获取- 关于编译,其实不用像上面那个blog里面说的那样全部重新编译,只用
mmm /system/sepolicy
,然后会更新/out/target/product/xxxxxxx/root/sepolicy文件,这个时候要重新打包bootimage,所以接着make -j4 bootimage
,保险起见的话make snod
一下,然后把system.img和boot.img重新烧一下(我这里ramdisk.img也被更新了,保险起见把这个也重新烧一下)