之前使用android4.4的系统进行开发时 system/app(系统自带APP) 目录下的 app 可以直接访问 dev 目录下的设备节点,Android 5.0 以后,因为采取了 SEAndroid/SElinux 的安全机制,即使拥有 root权限,或者对某内核节点设置为 777 的权限,仍然无法在 JNI 层访问。
这里先了解一下 SEAndroid app 的分类
SELinux(或SEAndroid)将app划分为主要三种类型(根据user不同,也有其他的domain类型):
- untrusted_app 第三方app,没有android平台签名,没有system权限
- platform_app 有android平台签名,没有system权限
- system_app 有android平台签名和system权限
从上面划分,权限等级,理论上:untrusted_app < platform_app < system_app
那么第三方APP,在SElinux下,如何获得对一个内核节点的访问权限
分下面三个步奏:
在 android/external/sepolicy/file_contexts 文件中添加:
/dev/relay u:object_r:relay_device:s0
其中“relay”是我的设备节点名称,可自行更改,“relay_device”是自定义设备名在 android/external/sepolicy/device.te 文件中添加:
type relay_device, dev_type, mlstrustedobject;