我为我的一个 I2C 设备创建了内核驱动程序作为可加载模块。(/sys/devices/i2c/i2c-0/0-0008/)
驱动程序通过 new_device 文件使用实例化在 I2C 对应文件夹下创建几个 sysfs文件(/sys/devices/i2c/i2c-0/new_device)
。
Lollipop 强制执行 SELinux,因此我需要为需要访问设备的 sysfs 文件的应用程序创建规则。这些大多是系统应用程序(它们属于 Android SELinux 中 platform_app 的定义)。问题是不允许任何应用程序域中的应用程序写入 sysfs 文件:
neverallow { appdomain -bluetooth -nfc }
sysfs:dir_file_class_set write;
所以我决定专门为我的设备创建文件上下文:
file_context:
/sys/devices/i2c-0/0-0008(/.*)? u:object_r:sysfs_mydeviceic:s0
结果很有趣:默认驱动程序文件和文件夹(如 name 和 uevent 等)获得了正确的上下文,但不是由 I2C 驱动程序的 sysfs 部分创建的文件:
root@android:/sys/devices/i2c-0/0-0008 # ls -Z
--w--w--w- root root u:object_r:sysfs:s0 data
lrwxrwxrwx root root u:object_r:sysfs_mydeviceic:s0 driver -> ../../../bus/i2c/drivers/mydevice
-rw-rw-rw- root root u:object_r:sysfs:s0 locked
-r--r--r-- root root u:object_r:sysfs_mydeviceic:s0 modalias
-r--r--r-- root root u:object_r:sysfs_mydeviceic:s0 name
drwxr-xr-x root root u:object_r:sysfs_mydeviceic:s0 power
-rw-rw-rw- root root u:object_r:sysfs:s0 protection
-rw-rw-rw- root root u:object_r:sysfs:s0 state
lrwxrwxrwx root root u:object_r:sysfs_mydeviceic:s0 subsystem -> ../../../bus/i2c
-rw-r--r-- root root u:object_r:sysfs_mydeviceic:s0 uevent
我正在寻求如何解决这个问题的帮助:如果我仍然想将 sysfs 上下文转换为 sysfs_mydeviceic 以用于其余文件,那么该怎么做?还是有其他方法可以让应用程序写入 sysfs 文件?