问题现象: 无法打开某个设备文件,提示权限失败
问题信息:unable to open /dev/ttyS0, error:Permission denied
解决步骤:
1 确认设备节点是否存在;
2 确认设备节点权限;尝试向所有组添加权限(chmod 777 /dev/ttyS0);
上述步骤如果还不能解决问题,就需要考虑Android Selinux权限策略。
1 临时取消Android Selinux 安全检查。
root@dev:# getenforce
Enforcing
root@dev:# setenforce 0
root@dev:# getenforce
Permissive
上述问题如果解决权限问题,那么就是Android Selinux对进行访问进行了权限限制,setenforce只能一次性、临时性解决问题,完整的解决方案需要根据Android AVC的提示对进行进行权限设定。
01-01 01:33:48.409 21230 21230 W chinaycheng: type=1400 audit(0.0:76): avc: denied { read write } for name="ttyS0" dev="tmpfs" ino=2532 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:serial_device:s0 tclass=chr_file permissive=0
AVC分析结果:
描述 | 关键值 | 测试值 |
---|---|---|
缺少什么权限 | denied {} | read write |
谁缺少 | scontext | u:r:platform_app |
对那个文件 | tcontext | u:object_r:serial_device:s0 |
文件类型 | tclass | chr_file |
解决方法:
在指定文件platform_app.te中添加权限
allow platform_app serial_device:chr_file { read write }
文件路径不确定,主要位于external/sepolicy 和device/**/sepolicy文件夹下面。修改之后需要重新少些boot.img才能生效。
PS:以上是对已经存在进程修改权限,如果进程不存在,对应的te文件不存在,那么就需要重新新增te文件。
1 找到对应的sepolicy文件夹,有一个file_contexts文件,模仿已经存在的信息,多写一条。以新增一个叫chinaycheng的程序为例
/system/bin/dex2oat u:object_r:dex2oat_exec:s0
/system/bin/patchoat u:object_r:dex2oat_exec:s0
/system/bin/chinaycheng u:object_r:chinaycheng_exec:s0
这就指定了chinaycheng这个程序的权限设置路径为:chinaycheng_exec,名字不重要,主要以_exec结尾就可以了。然后再参考目录下,其他文件的te,拷贝一个过来,修改里面的allow信息即可。