type=1400 audit(0.0:21): avc: denied { read write } for name="ttyUSB0" dev="tmpfs" ino=61137 scontext=u:r:system_app:s0 tcontext=u:object_r:device:s0 tclass=chr_file permissive=0
一、异常情况(普通应用可读写,系统应用没有权限):
安卓应用读写一个自己外包驱动的动态挂载的USB转串口设备,读写句柄位置为 /dev/ttyUSB0
- 普通应用可以直接读写/dev/ttyUSB0
- 系统应用加上就不行,不加就可以。
android:sharedUserId="android.uid.system"
显示没有读写/dev/ttyUSB0的权限
二、异常提示日志:
Can't Open Serial Port /dev/ttyUSB0:Permission denied
type=1400 audit(0.0:21): avc: denied { read write } for name="ttyUSB0" dev="tmpfs" ino=61137 scontext=u:r:system_app:s0 tcontext=u:object_r:device:s0 tclass=chr_file permissive=0
三、异常分析:(肯定是系统权限分配问题导致)
- 普通应用有读写权限,系统应用没有读写权限,颠覆我的认知
- 要不就是/dev/ttyUSB0这个句柄位置没有权限,用chmod解决
- 要不就是andriod selinux权限问题 ,这个不懂,学习
四、解决问题过程
方案一:chmod修改文件挂载权限
修改文件 device/qcom/common/rootdir/etc/init.qcom.rc
chmod 0666 /dev/ttyUSB0
chmod 0666 /dev/ttyUSB1
chmod 0666 /dev/ttyUSB2
chown system system /dev/ttyUSB0
chown system system /dev/ttyUSB1
chown system system /dev/ttyUSB2
结果:此方案没有用。
方案二:andriod selinux
因为是system应用没有权限,所有修改system_app.te
至于为什么改这个,自学android selinux
修改 /device/qcom/sepolicy/msm8953/system_app.te
新增
allow system_app selinuxfs:file read;
allow system_app device:chr_file { read open write ioctl };
结果:成功了。
四、关于如何修改 andriod selinux
我认为有用资料
如何写:
格式:
allow 源类型 目标类型:访问类型 操作权限;
内容来源:
allow scontext tcontext: tclass { denied }
结果:
allow system_app device:chr_file { read open write ioctl };
个人总结的如何写SELinux(看图)