抄男友学习总结,核心问题是
学习博客https://blog.csdn.net/wds1181977/article/details/54967110得以知道缘由。
最近在做一个充电指示灯的需求,有一个Selinux权限的控制一直绕了好久才解决,解决记录如下:
驱动那边给我提供的操作LED灯的节点文件路径如下:
/sys/class/leds/mt6370_pmu_led1/brightness
我这边直接在LightServices里面去操作这个节点的时候,LED灯没有反应,查看mtklog之后发现有如下这个Log
08-06 05:20:03.509690 1037 1037 D LightsService: switch red led state = 1
08-06 05:20:03.507000 1037 1037 W system_server: type=1400 audit(0.0:274): avc: denied { write } for name="brightness" dev="sysfs" ino=24764 scontext=u:r:system_server:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0
08-06 05:20:03.509894 1037 1037 E LightsService: red : open /sys/devices/platform/11016000.i2c5/i2c-5/5-0034/mt6370_pmu_rgbled/leds/mt6370_pmu_led4/brightness failed
08-06 05:20:03.509964 1037 1037 D LightsService: can not write 1 for red led
通过查看这个Log发现是因为Android里面的Selinux权限在控制这个节点文件不能被访问,通过adb shell setenforce 0 这个命令也可以验证是Selinux权限的问题,由于这个设备节点是sysfs类型的(dev="sysfs"),所以我们不能按照普通的添加权限那样添加,这个添加权限的步骤如下:
(1)在device/mediatek/sepolicy/basic/non_plat/file_context文件里面,先对这个文件进行一个申明如下
/sys/class/leds/mt6370_pmu_led4/brightness u:object_r:blue_led_file:s0
(2)在device/mediatek/sepolicy/basic/non_plat/file.te文件里面再进行一下类型定义
type red_led_file, fs_type, sysfs_type;
(3)再去相应的te文件里面添加缺少的权限
scontext=u:r:system_server:s0这里提示是system_server.te文件缺少权限,所以我们需要在这只文件里面添加权限
device/mediatek/sepolicy/basic/non_plat/system_server.te
allow system_server red_led_file:file { read open write };
这个添加可以参考FAQ:
https://online.mediatek.com/FAQ#/SW/FAQ21268
添加完成之后,编译出来的软件还是没有效果,输出的Log还是报一样的权限问题,软件编译没有问题,确认还是添加没有效果
通过adb命令进入sys/class/leds这个目录下用ls -l发现
/sys/class/leds/mt6370_pmu_led4/brightness这只文件只是另外一个文件的快捷方式,我们对快捷方式文件操作也就没有效果了,所以我们需要操作这个快捷文件的源文件
sys/devices/platform/11016000.i2c5/i2c-5/5-0034/mt6370_pmu_rgbled/leds/mt6370_pmu_led4/brightness
我这边就把我操作的设备节点换成了这只文件,然后权限按照上面的步骤再添加一下就OK了