I2C デバイスの 1 つのロード可能なモジュールとしてカーネル ドライバーを作成しました。(/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
結果は興味深いものです。名前や 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 ファイルへの書き込みを有効にする他の方法はありますか?