Android SELiunx 权限添加
最近做了个需求,是调节背光的亮度,改变背光的波形,进而影响到了亮度,达到省电的目的。
核心逻辑:1.识别当前是哪个应用;2.根据白名单,向节点写入对应的值;3.通过节点不同调节背光的亮度。
写节点会涉及 SELiunx 权限,因为时间紧迫,SELiunx 权限较麻烦,验证需整编,费时,所以我临时禁用掉 SELinux,先把功能调通。禁用掉 SELinux 如下:
adb shell
setenforce 0 (临时禁用掉SELinux)
getenforce (得到结果为Permissive)
功能调通好了专门来搞 SELinux 权限,在《如何实现一个 System Services?》有提到 SELinux 权限是很折腾的,这个需求 SELinux 权限我整了两天时间,期间各种尝试,编译报错,焦急地等待验证...
我们需要向节点 /sys/kernel/display/abcd 写值。
分析
SELinux 权限问题可以在 Log 里搜到关键字 avc,内容如下:
Binder:890_13: type=1400 audit(0.0:678): avc: denied { write } for name="abcd" dev="sysfs" ino=16074 scontext=u:r:system_server:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0
1、谁缺少权限
scontext=u:r:system_server:s0 #system_server 缺少权限,然后就在system_server.te修改
scontext=u:r:audioserver:s0
2、对什么缺少权限
tcontext=u:object_r:sysfs:s0 #对 sysfs 缺少权限
tcontext=u:object_r:sysfs:s0
3、缺少什么权限
denied { write } #缺少 write 权限
4、什么类型的权限
tclass=file #file 类型的权限
修改
找到 system/sepolicy/private/system_server.te,添加如下:
allow system_server sysfs:file { write };
上面编译时报错的在 system 中的 domain.te 中有个重复的定义:
libsepol.report_failure: neverallow on line 97 of system/sepolicy/private/coredomain.te (or line 36477 of policy.conf) violated by allow system_server sysfs:file { write };
libsepol.check_assertions: 1 neverallow failures occurred
看 coredomain.te
full_treble_only(`
# /proc
neverallow {
coredomain
-init
-vold
} proc:file no_rw_file_perms;
# /sys
neverallow {
coredomain
-init
-ueventd
-vold
} sysfs:file no_rw_file_perms;
}
sysfs 这个权限看样子不能直接使用,可以使用别名替换,修改如下:
找到 device/平台名/system/private/file_contexts 文件添加
# tcontext=u:object_r:sysfs:s0
/sys/kernel/display/abcd u:object_r:wxl_abcd:s0 #wxl_abcd替换sysfs,wxl_abcd随便取
device/平台名/system/public/file.te 中添加
type wxl_cabc, fs_type,sysfs_type;
然后可以在 device/平台名/system/private/system_server.te 文件中添加
allow system_server wxl_abcd:file { r_file_perms w_file_perms rw_file_perms };
添加 write 或者 read 的权限要注意 open 的权限,最后使用 r_file_perms、w_file_perms、rw_file_perms。