1. SELinuxのトラブルシューティング
1.1 SELinux権限問題の確認方法
状況1: ユーザーデバッグ版のソフトウェアでは問題が発生しないが、ユーザーバージョンのソフトウェアで問題が発生する場合、SELinuxの権限問題である可能性が高い。
状況2: ソフトウェアがユーザーデバッグ版の場合、以下のコマンドを使用して権限レベルを上げることで、SELinuxの権限問題であるかを確認できる。
adb shell setenforce 0
現在の権限レベルを確認するには、以下のコマンドを使用する。
adb shell getenforce
「Enforcing」が表示された場合は権限レベルが高く、SELinuxの規則に違反すると操作が禁止される。一方、「Permissive」が表示された場合は権限レベルが低く、違反は警告としてログに出力されますが、操作自体は許可される。
1.2 SELinux問題のログ取得方法
問題を再現する前に、以下のフィルターを使用してログを取得する。
logcat | grep -i avc
このコマンドにより、権限エラーのログを取得できる。
1.3 SELinux関連のログから権限ルールの設定
一般的なログ形式についてここでは詳しく説明しないが、今回のケースでの権限エラーの例を見てみる。
avc: denied { read } for path="/dev/input/event6" dev="tmpfs" ino=121 scontext=u:r:shell:s0 tcontext=u:object_r:input_device:s0 tclass=chr_file permissive=0
上記のログに基づいて、以下の権限を追加する。
allow system_app input_device:chr_file { read };
1.4 属性またはデバイスのコンテキストの確認方法
コンテキストとは、上記のログにある`input_device`のようなものである。
属性の場合:
getprop -Z <属性名>
デバイス(Linux)の場合、つまりノードの場合:
ls -lZ <ノードパス>
1.5 SELinuxモジュールのビルドとファイルの置き換え
以下のコマンドでSELinuxポリシーをビルドする。
make selinux_policy
ビルドが完了したら、通常以下のパスに生成物があるため、該当ファイルを置き換えて再起動することで有効化できる。
out/target/product/{project}/system/etc/selinux/
out/target/product/{project}/vendor/etc/selinux/
2. SELinux権限問題の分析ケーススタディ
2.1 問題のコンテキストタイプの確認
ログから、`/dev/input/event6`ノードで権限エラーが発生していることがわかる。
2.2 .teファイルでのタイプ定義
通常、device.teファイルに以下のように定義する。
type skg_chr_device, dev_type;
2.3 file_contextsファイルでのセキュリティコンテキストのパス設定
/dev/input/event(/.*)? u:object_r:skg_input_chr_device:s0
2.4 .teファイルでのSELinuxルール設定
この.teファイルは、上記で定義したタイプと異なる場合がある。例えば、システムアプリケーションのドメインが必要な場合、system_app.teファイルに以下のように設定する。
allow system_app skg_input_chr_device:chr_file { open read write ioctl };
ログから読み込み権限のみ必要だが、念のため追加の権限も与える。
その後、上述の手順に従ってビルドと検証を行い、再起動後、`ls -Z /dev/input/event6`を実行すると、セキュリティコンテキストが以下のようになる。
crw-rw-rw- 1 root input u:object_r:input_device:s0 13, 70 2025-10-30 18:56 /dev/input/event6
定義したセキュリティコンテキストラベルが効いていない場合、Androidバージョンが同じRK3576の設定と比較し、file_contextsファイルのパス範囲を広げると解決する。
/dev/input/(.*)? u:object_r:skg_input_chr_device:s0
最終的に、以下のセキュリティコンテキストが確認できれば成功である。
crw-rw-rw- 1 root input u:object_r:skg_input_chr_device:s0 13, 70 2025-10-30 18:56 /dev/input/event6