参考1 https://blog.csdn.net/wince_lover/article/details/47840013
参考2 https://blog.csdn.net/hwd1007003419/article/details/129149912
在android5或5.1的开发中经常会碰到,明明设备节点是有777的权限,可是在我们程序中访问这个设备却报Permission denied,无法打开设备。
这是因为在Android 5.0或5.1下,采取了SEAndroid/SElinux的安全机制。
SELINUX是美国国家安全局和一些公司设计的一个针对linux的安全加强系统,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。
下面我们来看看怎么设置来允许我们的应用可以访问设备节点。
##第一步,
我们找到file_contexts文件,这个文件通常在device/mypaltform/sepolicy 或者external/sepolicy目录下。我们在这个文件下增加一行 “/dev/devname u:object_r:my_device:s0”。/dev/devname是设备节点,也就是我们要打开的设备名。my_device我们可以定义一个我们看的懂的有意义的名字。object_r标明这是一个文件。s0是表示优先级的。
##第二步,
在device.te文件中添加一行 “type my_device, dev_type ”;
##第三步,
在对应的在device/mypaltform/sepolicy 或者external/sepolicy目录下找到进程名加te为扩展名的,例如如果我们希望rild程序可以访问我们的节点可以打开rild.te文件在后面加上一行“allow rild my_device:chr_file rw_file_perms;”这时我们重新编译后,再看看在rild进程里面打开/dev/devname,读写这个设备文件都正常了。可是在实际的开发中往往是我们并不知道这个驱动将会被哪个应用程序调用,可能其他人调用我们的驱动做开发,或者安装第三方APP。如果是这样,我们可以找到例如app.te、systemp_app.te、untrusted_app.te。等文件,在里面加上如“allow appdomain my_device:chr_file rw_file_perms; ”(表示所有的APP都可以访问该设备节点)、“allow system_app my_device:chr_file rw_file_perms; ”表示具有system UID的APP都可以访问该设备节点)、“allow untrusted_app my_device:chr_file rw_file_perms;”(表示所有第三方的APP都可以访问该设备节点)。或者直接打开domain.te加上“allow domain my_device:chr_file rw_file_perms;”(所有的进程、服务都可以访问该节点)。当然了,实际上上诉的语句不一定放在上面指定的文件里,放在任何文件里效果是一样的,但是为了方便阅读和管理,还是添加到对应的文件中比较好。
备注
在Android12系统开发过程中移植自己编写的linux底层可执行程序,该程序存放位置为/system/bin路径下,在Android7,Android8等系统中设置程序自启动的方法为:
1、在device/rockchip/common/sepolicy路径中添加对应可执行程序的te文件;
2、更改device/rockchip/common/sepolicy路径中的file_contexts文件;
3、更改device/rockchip/common/rootdir路径下的init.rockchip.rc文件;
更高的安卓系统中,如Android11、12中,device/rockchip/common/sepolicy路径下的te文件被分类存放,分为private、public、vendor等,此时以上方法不可以,编译会报错。解决措施如下
在Android11、12以上系统中设置自定义的/system/bin/hwd-test程序开机自启动则需要在system/sepolicy/private路径中添加te文件,同时修改该路径下的file_contexts文件,修改方式和上面一致。此外需注意,在system/sepolicy/private中完成修改后应当在system/sepolicy/prebuilts/api/32.0/private路径中进行完全相同的修改,否则系统编译将会报错