最近做了个需求,是调节背光的亮度,改变背光的波形,进而影响到了亮度,达到省电的目的。

核心逻辑: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。