前言:
有时应用需要访问设备节点,来进行节点进行操作,来达到控制设备的目的,一种是设备是在固定在主板上的,一种是需要usb进行插拔的设备。
两种方式添加的位置是有差别的。
第一种设备方式如下:
- 在init.rc文件中添加该设备的权限
on post-fs-data
setprop debug.delaytime.min 10
setprop debug.delaytime.mid 100
setprop debug.delaytime.max 1000
setprop debug.android_watchdog.disable 1
chmod 666 /sys/devices/virtual/light_state
第二种设备方式如下:
src/system/core/rootdir/ueventd.rc
ueventd.rc文件还是有一定的修改规则
/dev/tty* 0777 root system
ueventd.rc文件中的内容大致为这样,第一列表示要修改的设备节点;第二列为修改后的权限;第三列为该节点的用户,注意,不要尝试去修改该节点的用户,很有可能修改导致修改失败。
整编译软件在out目录下面搜索该文件:find -name init.rc,如果该文件中存在添加加节点的代码,那就说明添加成功了.
- 应用层向该设备节点写入值
public static final String LIGHT_POWER_PATH = "/sys/devices/virtual/light_state";
private void setLightOn() {
try {
Writer light_tunetoch = new FileWriter(LIGHT_POWER_PATH );
light_tunetoch .write(frequency);
light_tunetoch .flush();
light_tunetoch .close();
} catch (IOException e) {
Log.i(TAG, "setLightOn() IOException e "+e.getMessage());
e.printStackTrace();
}
}
这样写入值出现问题点如下:
应用层往设备节点写值出现了没有权限问题,日志如下
IOException e = /sys/devices/virtual/light_state: open failed: EACCES (Permission denied)
出现这种情况,一般是权限问题。
解决方案:
方法1:关闭selinux
adb root; adb shell setenforce 0
方法2:添加权限.
common/sepolicy/platform_app.te
common/sepolicy/file.te
common/sepolicy/file_contexts
在file.te文件添加自己自定义的文件名,并给予文件类型
type sysfs_fm, fs_type,sysfs_type;
allow platform_app sysfs_fm:file {getattr open write read};
/sys/devices/virtual//power_state u:object_r:sysfs_fm:s0
/sys/devices/virtual//tunetoch u:object_r:sysfs_fm:s0