关于从android服务中打开linux设备节点没有权限的问题(seplicy-selinux)

关于从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

这篇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也被更新了,保险起见把这个也重新烧一下)

你可能感兴趣的:(linux-driver,android)